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
- 데이터 불균형이 발생하는 경우
- 데이터의 노드를 추가하는 경우
- 데이터 노드를 추가하였지만 하둡의 데이터 공간이 부족하여 신규 데이터 노드의 사용 공간이 0%
- 대량의 데이터를 삭제하는 경우
- 특정 데이터 노드에 블록이 많이 저장되어 데이터 노드간 저장 공간 차이가 20~30%정도 발생
- 대량의 데이터를 추가하는 경우
- 네임노드는 데이터 저장공간이 작은 노드를 우선적으로 사용
- 특정 데이터 노드에 데이터가 적은 경우
- 데이터의 노드를 추가하는 경우
실행
$ 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 |