Created date: Sat, 16 Jul 2022 14:45 KST
추가로 알아볼 HDFS 기능은 무엇이 있을까요?
안녕하세요. shcDE입니다. 이번 포스팅에서는 REST API 사용법, 사용량 제한 설정, RPC, 이레이져 코딩, 밸런서에 대해 알아보겠습니다. 포스팅 시작 전에, 해당 게시물은 ‘빅데이터 - 하둡, 하이브로 시작하기’(위키독스)를 바탕으로 작성하였음을 알려드리며, HDFS의 기본 기능에 대한 내용은 이번 포스팅을 기점으로 마무리를 할 예정입니다. 지금부터 HDFS 기초에 대한 마지막 포스팅 시작하겠습니다.
우선 WebHDFS REST API 사용법부터 알아보겠습니다. REST API(RESTful API, 레스트풀 API)란 REST 아키텍처의 제약 조건을 준수하는 애플리케이션 프로그래밍 인터페이스를 의미합니다. 여기에서 REST는 Representational State Transfer의 줄임말입니다.
우선 REST API를 사용하기 위해서는 hdfs-site.xml에 다음의 설정이 되어 있어야 합니다. 제가 사용하는 하둡의 버전은 v3이므로 로컬 호스트 번호로 50070이 아닌 9870으로 입력했습니다.
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>0.0.0.0:9870</value>
</property>
파일 리스트를 확인하기 위해서는 다음 명령어를 사용하면 됩니다. 문서와의 차이점은 ‘curl -s’가 아닌 ‘curl -i’를 사용합니다.
$ curl -i http://127.0.0.1:9870/webhdfs/v1/user/hadoop/?op=LISTSTATUS
HTTP/1.1 404 Not Found
Date: Sat, 16 Jul 2022 02:51:15 GMT
Cache-Control: no-cache
Expires: Sat, 16 Jul 2022 02:51:16 GMT
Date: Sat, 16 Jul 2022 02:51:16 GMT
Pragma: no-cache
X-Content-Type-Options: nosniff
X-FRAME-OPTIONS: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Content-Type: application/json
Transfer-Encoding: chunked
{"RemoteException":{"exception":"FileNotFoundException","javaClassName":"java.io.FileNotFoundException","message":"File /user/hadoop/ does not exist.”}}
다음으로 HDFS 사용량 제한 설정에 대해 알아보겠습니다. 사실 문서에는 HDFS 암호화에 대한 설명도 있지만, 제 기기에는 적용하기 어려워서 이 부분은 넘어가고 바로 사용량 제한 설정에 대해 설명드리겠습니다.
제한 설정 명령으로는 다음 명령어들이 있습니다. bin/hdfs dfsadmin 명령을 이용하여 파일 개수 제한, 파일 용량 제한을 설정할 수 있습니다.
# 파일 개수 제한. 최대 Long.MAX_VALUE 만큼 제한 가능
bin/hdfs dfsadmin -setQuota <N> <directory>...<directory>
# 파일 개수 제한 초기화
bin/hdfs dfsadmin -clrQuota <directory>...<directory>
# 파일 용량 제한. 최대 Long.MAX_VALUE 만큼 제한 가능
bin/hdfs dfsadmin -setSpaceQuota <N> <directory>...<directory>
# 파일 용량 제한 초기화
bin/hdfs dfsadmin -clrSpaceQuota <directory>...<directory>
제한 사항은 hadoop fs -count 명령을 이용하여 확인할 수 있습니다.
# quota 설정 확인
$ bin/hadoop fs -count -q -v hdfs:///
QUOTA REM_QUOTA SPACE_QUOTA REM_SPACE_QUOTA DIR_COUNT FILE_COUNT CONTENT_SIZE PATHNAME
9223372036854775807 9223372036854775805 none inf 2 0 0 hdfs:///
# QUOTA, REMAINING_QUOTA, SPACE_QUOTA, REMAINING_SPACE_QUOTA, PATHNAME
$ bin/hadoop fs -count -u hdfs:///
9223372036854775807 9223372036854775805 none inf hdfs:///
문서 상의 다음 파트인 ‘데이터 압축’에 대해서도 제가 다루기는 어려울 것 같아서 넘어가겠습니다.
RPC는 가볍게 설명해드리겠습니다. HDFS는 RPC를 활용하여 서버와 클라이언트간 통신을 진행합니다. RPC는 Remote Procedure Call의 약자로 원격지에 있는 노드의 함수를 실행하여 결과를 반환받는 역할을 합니다.
다음으로 이레이져 코딩에 대해 다루겠습니다. 이레이저 코딩(erasure coding)은 데이터 손실 시 미리 준비된 별도의 데이터(패리티)로 복구하는 기술입니다. 제 포스팅에서는 CLI 명령어를 통해 직접 다루는 방법만 배우겠습니다.
CLI 명령어 리스트는 다음과 같습니다.
bin/hdfs ec [generic options]
[-setPolicy -path <path> [-policy <policyName>] [-replicate]]
[-getPolicy -path <path>]
[-unsetPolicy -path <path>]
[-listPolicies]
[-addPolicies -policyFile <file>]
[-listCodecs]
[-enablePolicy -policy <policyName>]
[-disablePolicy -policy <policyName>]
[-removePolicy -policy <policyName>]
[-verifyClusterSetup -policy <policyName>...<policyName>]
[-help [cmd ...]]
- setPolicy : 정책을 설정합니다.
- getPolicy : 이레이져 코딩 적책을 확인합니다.
- unsetPolicy : 정책 설정을 해제합니다.
- listPolicies : HDFS 경로에 등록 된 모든 (활성화, 비활성화 및 제거 된) 이레이져 코딩 정책을 출력합니다.
- addPolicies : 이레이저 코딩 정책을 추가합니다.
- removePolicy : 이레이저 코딩 정책을 제거합니다.
- listCodecs : 이레이저 코딩 코덱 목록을 출력합니다.
- enablePolicy : 이레이저 코딩 정책을 활성화합니다.
- disablePolicy : 이레이저 코딩 정책을 비활성화합니다.
- verifyClusterSetup : 클러스터 설정이 활성화 된 모든 이레이져 코딩 정책을 지원할 수 있는지 확인합니다
CLI 명령어 사용 예시는 다음과 같습니다.
# 이레이저 코딩 설정(여기에서는 빈 디렉토리에 명령어를 적용해서 경고가 뜬 것을 확인할 수 있습니다.)
$ bin/hdfs ec -setPolicy -path hdfs:///
Set default erasure coding policy on hdfs:///
Warning: setting erasure coding policy on a non-empty directory will not automatically convert existing files to default erasure coding policy
# 복제 설정 및 코딩 정책 설정
$ bin/hadoop fs -du -v hdfs:///
SIZE DISK_SPACE_CONSUMED_WITH_ALL_REPLICAS FULL_PATH_NAME
0 0 hdfs:///zone
마지막으로 밸런서에 대해 다루겠습니다. 밸런서는 HDFS를 운영하면서 데이터 불균형이 발생할 때 실행합니다. 사용 예시는 다음과 같습니다.
$ bin/hdfs balancer
2022-07-16 12:21:34,318 INFO balancer.Balancer: namenodes = [hdfs://localhost:9000]
2022-07-16 12:21:34,320 INFO balancer.Balancer: parameters = Balancer.BalancerParameters [BalancingPolicy.Node, threshold = 10.0, max idle iteration = 5, #excluded nodes = 0, #included nodes = 0, #source nodes = 0, #blockpools = 0, run during upgrade = false]
2022-07-16 12:21:34,320 INFO balancer.Balancer: included nodes = []
2022-07-16 12:21:34,320 INFO balancer.Balancer: excluded nodes = []
2022-07-16 12:21:34,320 INFO balancer.Balancer: source nodes = []
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved NameNode
...
대역폭 지정은 다음 명령어를 통해 진행할 수 있습니다. 여기에서는 1073741824로 지정하였습니다.
$ bin/hdfs dfsadmin -setBalancerBandwidth 1073741824
Balancer bandwidth is set to 1073741824
threshold 명령어는 각 노드간 데이터 사용비율 차이를 임계값을 이용하여 지정할 때 사용합니다. 사용 예시는 다음과 같습니다. 여기에서는 임계값을 3으로 지정했습니다.
$ bin/hdfs balancer -threshold 3
2022-07-16 12:27:14,783 INFO balancer.Balancer: Using a threshold of 3.0
2022-07-16 12:27:14,783 INFO balancer.Balancer: namenodes = [hdfs://localhost:9000]
2022-07-16 12:27:14,784 INFO balancer.Balancer: parameters = Balancer.BalancerParameters [BalancingPolicy.Node, threshold = 3.0, max idle iteration = 5, #excluded nodes = 0, #included nodes = 0, #source nodes = 0, #blockpools = 0, run during upgrade = false]
2022-07-16 12:27:14,785 INFO balancer.Balancer: included nodes = []
2022-07-16 12:27:14,785 INFO balancer.Balancer: excluded nodes = []
2022-07-16 12:27:14,785 INFO balancer.Balancer: source nodes = []
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved NameNode
...
이상으로 HDFS 기본 명령어에 대하여 4개의 포스팅에 걸쳐 다루었습니다. 데이터 파이프라인 구축 개인 프로젝트를 진행하기 위해 하둡을 이번 기회에 배워봤습니다. 사실 개인 공부로 하둡을 데이터 엔지니어링 실무 경험이 없는 상태에서 다루는 것은 상당히 많은 어려움이 있을 것이라는 주변의 우려가 있었습니다. 하지만 막상 해보니까 불가능은 아니라는 사실을 배우게 되었습니다. 그뿐만 아니라, 막상 실습을 직접 진행해보면서 오히려 자신감도 생긴 것 같습니다. 다시 한 번 4개의 HDFS 포스팅을 모두 읽어주셔서 감사드리고, 다음 포스팅에서 뵙겠습니다.
감사합니다.
[레퍼런스]
- 빅데이터 - 하둡, 하이브로 시작하기(위키독스) : https://wikidocs.net/book/2203