분산처리/빅데이터-하둡, 하이브로 시작하기

2-4) HDFS 기능 2

busy맨 2023. 7. 18. 00:02

1. WebHDFS REST API

  • HDFS는 REST API를 이용해 파일을 조회하고 생성, 수정, 삭제하는 기능을 제공
  • 이 기능을 통해 원격지에서 HDFS의 내용에 접근

REST API를 사용

#hdfs-site.xml

<property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
</property>
<property>
    <name>dfs.namenode.http-address</name>
    <value>0.0.0.0:50070</value>
</property>

파일 리스트 확인

  • curl 명령을 이용하여 요청을 처
# /user/hadoop/ 위치를 조회 
$ curl -s http://127.0.0.1:50070/webhdfs/v1/user/hadoop/?op=LISTSTATUS

2. HDFS 암호화

  • 민감정보의 보안을 위해 암호화 기능을 제공
  • 디스크에 저장되는 파일을 암호화하여 저장
  • HDFS의 디렉토리에 접근할 때 하둠 KMS를 이용하여 전송 데이터의 암/복호화를 지원

HDFS 암호화

# 암호화 키 생성 
$ hadoop key create mykey

# zone 디렉토리 생성 하고 암호화 지역으로 설정, mykey를 이용하도록 설정 
$ hadoop fs -mkdir /zone
$ hdfs crypto -createZone -keyName mykey -path /zone

# 키확인 
$ hadoop key list
Listing keys for KeyProvider: org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider
mykey

# 암호화 지역 확인
$ hdfs crypto -listZones
/zone sample_key

# As the normal user, put a file in, read it out
$ hadoop fs -put helloWorld /zone
$ hadoop fs -cat /zone/helloWorld

# As the normal user, get encryption information from the file
$ hdfs crypto -getFileEncryptionInfo -path /zone/helloWorld
console output: {cipherSuite: {name: AES/CTR/NoPadding, algorithmBlockSize: 16}, cryptoProtocolVersion: CryptoProtocolVersion{description='Encryption zones', version=1, unknownValue=null}, edek: 2010d301afbd43b58f10737ce4e93b39, iv: ade2293db2bab1a2e337f91361304cb3, keyName: mykey, ezKeyVersionName: mykey@0}

하둡 KMS REST API

  • 기본 포트는 9700번 포트
curl http://$(hostname -f):9700/kms/v1/keys/names

3. HDFS 사용량 제한 설정

  • HDFS 관리자는 디렉토리 별로 파일 개수와 파일 용량을 제한
  • 파일 개수 제한
    • 디렉토리 별로 생성할 수 있는 파일 개수를 제한
    • 할당량을 초과하면 파일, 디렉토리를 생성할 수 없음
  • 파일 용량 제한
    • 파일 용량만 포함되고, 디렉토리는 용량에 포함되지 않고 용량을 제한

제한 설정 명령

  • hdfs dfsadmin 명령을 통해 설정
# 파일 개수 제한. 최대 Long.MAX_VALUE 만큼 제한 가능 
hdfs dfsadmin -setQuota <N> <directory>...<directory>

# 파일 개수 제한 초기화
hdfs dfsadmin -clrQuota <directory>...<directory>

# 파일 용량 제한. 최대 Long.MAX_VALUE 만큼 제한 가능 
hdfs dfsadmin -setSpaceQuota <N> <directory>...<directory>

# 파일 용량 제한 초기화 
hdfs dfsadmin -clrSpaceQuota <directory>...<directory>

제한 명령 확인

  • hadoop fs -count 명령을 이용해 확인
# quota 설정 확인 
$ hadoop fs -count -q -v hdfs:///user/d1
       QUOTA       REM_QUOTA     SPACE_QUOTA REM_SPACE_QUOTA    DIR_COUNT   FILE_COUNT       CONTENT_SIZE PATHNAME
     1000000           27300     10000000000       100000000        98337      1171599              12314 hdfs:///user/d1


# QUOTA, REMAINING_QUOTA, SPACE_QUOTA, REMAINING_SPACE_QUOTA, PATHNAME
$ hadoop fs -count -u hdfs:///user/d1
     1000000          273022 10000000000  80000 hdfs:///user/d1

4. 데이터 압축

  • 데이터 압축 여부와 사용할 압축 형식은 성능에 큰 영향을 줌
  • 데이터 압축 및 압축 해제하는 데 필요한 처리 용량, 데이터를 읽고 쓰는 데 필요한 디스크 IO 및 네트워크를 통해
    데이터를 보낼 경우 필요한 네트워크 대역폭의 균형을 유지해야 함
  • 데이터가 이미 압축된 경우 압축하지 않는 것이 좋음
    • ex) JPEG

5. RPC

  • HDFS는 서버와 클라이언트 간 통신에 RPC를 사
  • RPC(Remote Procedure Call)
    • 원격지에 있는 노드의 함수를 실행하여 결과를 반환

6. 이레이져 코딩(EC)

  • HDFS 복제는 저장 공간, 네트워크 대역폭 등에서 200%의 오버헤드를 가짐
  • EC를 이용하여 훨씬 적은 저장공간을 사용하여 동일한 수준의 내결함성을 제공
  • EC를 사용하면 오버헤드가 50% 이하
  • EC 파일의 복제 개수는 항상 1

# 이레이져 코딩 설정 
$ hdfs ec -setPolicy -path hdfs:///cold
Set default erasure coding policy on hdfs:///cold

# 복제 설정 
$ hadoop fs -du -v hdfs:///rep
SIZE        DISK_SPACE_CONSUMED_WITH_ALL_REPLICAS  FULL_PATH_NAME
2005986464  6017959392                             hdfs:///rep/file.txt

# 이레이져 코딩 정책 설정
$ hadoop fs -du -v hdfs:///ec
SIZE        DISK_SPACE_CONSUMED_WITH_ALL_REPLICAS  FULL_PATH_NAME
2005986464  3009473696                             hdfs:///ec/file.txt

7. 랙 인식(Rack Awareness)

  • 하나의 블록 복제본을 서로 다른 랙에 배치하는 내결함성을 위해 사용
  • 클러스터 내에서 네트워크 스위치 장애 또는 파티션이 발생한 경우 데이터 가용성을 제공

랙 인식 설정

  • 설정된 스크립트는 노드가 어떤 랙인지를 반
#core-site.xml

<property>
    <name>net.topology.script.file.name</name>
    <value>/etc/hadoop/conf/topology.sh</value>
</property>
  • 반환 결과
# 실행 예제, 반환 결과가 랙이 됨 
bash /etc/hadoop/conf/topology.sh 10.182.10.100

 

매핑 데이터 스크립트

  • 매핑 데이터 스크립트는 topology.data 파일을 읽어서 랙을 결정
#!/bin/bash

# Supply appropriate rack prefix
RACK_PREFIX="default"

# To test, supply a hostname as script input
if [ $# -gt 0 ]; then

HADOOP_CONF=${HADOOP_CONF:-"/etc/hadoop/conf"}

while [ $# -gt 0 ] ; do
  nodeArg=$1
  exec< ${HADOOP_CONF}/topology.data
  result=""
  while read line ; do
    ar=( $line )
    if [ "${ar[0]}" = "$nodeArg" ] ; then
      result="${ar[1]}"
    fi
  done
  shift
  if [ -z "$result" ] ; then
    echo -n "/$RACK_PREFIX/rack"
  else
    echo -n "/$RACK_PREFIX/rack_$result"
  fi
done

else
  echo -n "/$RACK_PREFIX/rack"
fi
  • 결과
10.182.0.1  rack-1
10.182.0.2  rack-2

 

파이썬 스크립트

  • IP를 확인해서 3자리를 반환하여 랙을 결정
  • 10.182.1.X, 10.182.2.X와 같은 형식으로 랙이 구성
#!/usr/bin/python3
# this script makes assumptions about the physical environment.
#  1) each rack is its own layer 3 network with a /24 subnet, which
# could be typical where each rack has its own
#     switch with uplinks to a central core router.
#
#             +-----------+
#             |core router|
#             +-----------+
#            /             \
#   +-----------+        +-----------+
#   |rack switch|        |rack switch|
#   +-----------+        +-----------+
#   | data node |        | data node |
#   +-----------+        +-----------+
#   | data node |        | data node |
#   +-----------+        +-----------+
#
# 2) topology script gets list of IP's as input, calculates network address, and prints '/network_address/ip'.

import netaddr
import sys
sys.argv.pop(0)                                                  # discard name of topology script from argv list as we just want IP addresses

netmask = '255.255.255.0'                                        # set netmask to what's being used in your environment.  The example uses a /24

for ip in sys.argv:                                              # loop over list of datanode IP's
    address = '{0}/{1}'.format(ip, netmask)                      # format address string so it looks like 'ip/netmask' to make netaddr work
    try:
        network_address = netaddr.IPNetwork(address).network     # calculate and print network address
        print("/{0}".format(network_address))
    except:
        print("/rack-unknown")                                   # print catch-all value if unable to calculate network address

 

bash 스크립트

  • IP의 마지막을 랙으로 반환
  • ex) 10.182.0.1 → 1번 노드, 10.182.0.6 → 6번 노드
#!/usr/bin/env bash
# Here's a bash example to show just how simple these scripts can be
# Assuming we have flat network with everything on a single switch, we can fake a rack topology.
# This could occur in a lab environment where we have limited nodes,like 2-8 physical machines on a unmanaged switch.
# This may also apply to multiple virtual machines running on the same physical hardware.
# The number of machines isn't important, but that we are trying to fake a network topology when there isn't one.
#
#       +----------+    +--------+
#       |jobtracker|    |datanode|
#       +----------+    +--------+
#              \        /
#  +--------+  +--------+  +--------+
#  |datanode|--| switch |--|datanode|
#  +--------+  +--------+  +--------+
#              /        \
#       +--------+    +--------+
#       |datanode|    |namenode|
#       +--------+    +--------+
#
# With this network topology, we are treating each host as a rack.  This is being done by taking the last octet
# in the datanode's IP and prepending it with the word '/rack-'.  The advantage for doing this is so HDFS
# can create its 'off-rack' block copy.
# 1) 'echo $@' will echo all ARGV values to xargs.
# 2) 'xargs' will enforce that we print a single argv value per line
# 3) 'awk' will split fields on dots and append the last field to the string '/rack-'. If awk
#    fails to split on four dots, it will still print '/rack-' last field value

echo $@ | xargs -n 1 | awk -F '.' '{print "/rack-"$NF}'

7. 밸런서(balancer)

  • HDFS를 운영하면서 데이터 불균형이 발생하여 밸런싱을 실행해야 하는 경우가 있음
  • 밸런서는 랙 인식 설정이 되어 있지 않으면 동작 X
  • 데이터 불균형이 발생하는 경우
    1. 데이터의 노드를 추가하는 경우
      • 데이터 노드를 추가하였지만 하둡의 데이터 공간이 부족하여 신규 데이터 노드의 사용 공간이 0%
    2. 대량의 데이터를 삭제하는 경우
      • 특정 데이터 노드에 블록이 많이 저장되어 데이터 노드간 저장 공간 차이가 20~30%정도 발생
    3. 대량의 데이터를 추가하는 경우
      • 네임노드는 데이터 저장공간이 작은 노드를 우선적으로 사용
      • 특정 데이터 노드에 데이터가 적은 경우

 

실행

$ hdfs balancer -threshold 5
Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved  NameNode
Nov 7, 2022 6:50:16 AM            0              4.23 GB            14.96 GB              10 GB  hdfs://hdfs-namenode:8020
Nov 7, 2022 7:06:49 AM            1              9.96 GB             9.63 GB              10 GB  hdfs://hdfs-namenode:8020
Nov 7, 2022 7:22:56 AM            2             15.53 GB             4.23 GB            8.77 GB  hdfs://hdfs-namenode:8020
The cluster is balanced. Exiting...
Nov 7, 2022 7:23:05 AM            3             15.53 GB                 0 B                0 B  hdfs://hdfs-namenode:8020
Nov 7, 2022 7:23:05 AM   Balancing took 44.9548 minutes

 

대역폭

  • 밸런서는 작업 간 많은 데이터 이동이 발생하기 때문에 대역폭을 지정하여 다른 작업에 영향이 가지 않도록 해야 함
hdfs dfsadmin -setBalancerBandwidth 1073741824

 

threshold

  • 각 노드 간 데이터 사용 비율 차이를 임계값을 이용하여 지정
hdfs balancer -threshold 3

'분산처리 > 빅데이터-하둡, 하이브로 시작하기' 카테고리의 다른 글

4) YARN  (0) 2023.07.27
3) 맵리듀스  (0) 2023.07.27
2-3) HDFS 기능 1  (0) 2023.07.17
2-3) 블록과 세컨더리 네임노드  (0) 2023.07.16
2-2) HDFS  (0) 2023.07.16