Created date: Thu, 14 Jul 2022 15:19 KST
HDFS 명령어는 무엇이 있을까요?
안녕하세요. shcDE입니다. 이번 포스팅에서는 HDFS 사용 시 주로 쓰이는 명령어들에 대해 설명드리고자 합니다. 원래는 한 포스팅에 모든 명령어에 대한 정보를 담고자 시도하였으나, 명령어가 제 예상보다 많아서 상, 하에 나누어 포스팅을 진행하겠습니다. 우선 시작 전에 해당 포스팅은 ‘빅데이터 - 하둡, 하이브로 시작하기’(위키독스)를 바탕으로 작성하였음을 알립니다.
우선 사용자 커맨드에 대해 설명드리겠습니다. 사용자 커맨드는 hdfs, hadoop 쉘을 이용할 수 있습니다. 일부 커맨드는 hdfs 쉘을 이용해야 합니다. 둘 다 이용할 수 있는 경우 각 쉘의 결과는 동일하며, 사용법은 다음과 같습니다.
# dfs 커맨드는 둘 다 동일한 결과를 출력
(base) shcDE-ui-MacBookPro:hadoop shc$ bin/hdfs dfs -ls
(base) shcDE-ui-MacBookPro:hadoop shc$
(base) shcDE-ui-MacBookPro:hadoop shc$ bin/hadoop fs -ls
(base) shcDE-ui-MacBookPro:hadoop shc$
# fsck 커맨드도 동일한 결과 출력
$ bin/hdfs fsck /
Connecting to namenode via http://localhost:9870/fsck?ugi=shc&path=%2F
FSCK started by shc (auth:SIMPLE) from /127.0.0.1 for path / at Thu Jul 14 15:59:31 KST 2022
Status: HEALTHY
Number of data-nodes: 1
Number of racks: 1
Total dirs: 3
Total symlinks: 0
Replicated Blocks:
Total size: 0 B
Total files: 0
Total blocks (validated): 0
Minimally replicated blocks: 0
Over-replicated blocks: 0
Under-replicated blocks: 0
Mis-replicated blocks: 0
Default replication factor: 1
Average block replication: 0.0
Missing blocks: 0
Corrupt blocks: 0
Missing replicas: 0
Blocks queued for replication: 0
Erasure Coded Block Groups:
Total size: 0 B
Total files: 0
Total block groups (validated): 0
Minimally erasure-coded block groups: 0
Over-erasure-coded block groups: 0
Under-erasure-coded block groups: 0
Unsatisfactory placement block groups: 0
Average block group size: 0.0
Missing block groups: 0
Corrupt block groups: 0
Missing internal blocks: 0
Blocks queued for replication: 0
FSCK ended at Thu Jul 14 15:59:31 KST 2022 in 1 milliseconds
The filesystem under path '/' is HEALTHY
$ bin/hadoop fsck /
WARNING: Use of this script to execute fsck is deprecated.
WARNING: Attempting to execute replacement "hdfs fsck" instead.
Connecting to namenode via http://localhost:9870/fsck?ugi=shc&path=%2F
FSCK started by shc (auth:SIMPLE) from /127.0.0.1 for path / at Thu Jul 14 16:00:24 KST 2022
Status: HEALTHY
Number of data-nodes: 1
Number of racks: 1
Total dirs: 3
Total symlinks: 0
Replicated Blocks:
Total size: 0 B
Total files: 0
Total blocks (validated): 0
Minimally replicated blocks: 0
Over-replicated blocks: 0
Under-replicated blocks: 0
Mis-replicated blocks: 0
Default replication factor: 1
Average block replication: 0.0
Missing blocks: 0
Corrupt blocks: 0
Missing replicas: 0
Blocks queued for replication: 0
Erasure Coded Block Groups:
Total size: 0 B
Total files: 0
Total block groups (validated): 0
Minimally erasure-coded block groups: 0
Over-erasure-coded block groups: 0
Under-erasure-coded block groups: 0
Unsatisfactory placement block groups: 0
Average block group size: 0.0
Missing block groups: 0
Corrupt block groups: 0
Missing internal blocks: 0
Blocks queued for replication: 0
FSCK ended at Thu Jul 14 16:00:24 KST 2022 in 0 milliseconds
The filesystem under path '/' is HEALTHY
# fs.defaultFS 설정값 확인
$ bin/hdfs getconf -confKey fs.defaultFS
hdfs://localhost:9000
# 명령어를 인식하지 못함(문서와 내용 다르나 인식 못하는 사실 동일)
$ bin/hadoop getconf
ERROR: getconf is not COMMAND nor fully qualified CLASSNAME.
다음으로 커맨드 명령어 중 대표적인 파일시스템 쉘을 실행하는 명령어인 dfs에 대해 설명해드리겠습니다. dfs는 hdfs dfs, hadoop fs, hadoop dfs 세가지 형태로 실행이 가능합니다. 사용 방법은 다음과 같습니다. 맥 OS의 경우 명령어가 정상적으로 실행되면 다음과 같이 통과됨을 확인할 수 있습니다.
(base) shcDE-ui-MacBookPro:hadoop shc$ bin/hdfs dfs -ls
(base) shcDE-ui-MacBookPro:hadoop shc$
(base) shcDE-ui-MacBookPro:hadoop shc$ bin/hadoop fs -ls
(base) shcDE-ui-MacBookPro:hadoop shc$
cat 명령어는 지정한 파일을 기본 입력으로 읽어서 출력하는 역할을 합니다. 사용 예시는 다음과 같습니다.
$ bin/hadoop fs -cat /user/testfile01.txt
this is test file 01
text 명령어는 지정한 파일을 텍스트 형식으로 읽어줍니다. 이 명령어를 통해 gzip, snappy 등의 형식으로 압축된 파일도 자동으로 텍스트 형식으로 출력해 줄 수 있습니다.
$ bin/hadoop fs -text /user/testfile01.txt
this is test file 01
ls 명령어는 주어진 경로의 파일 목록을 조회하는 역할을 합니다.
$ bin/hadoop fs -ls /user/
Found 2 items
drwxr-xr-x - shc supergroup 0 2022-07-14 15:44 /user/shc
-rw-r--r-- 1 shc supergroup 21 2022-07-14 16:17 /user/testfile01.txt
# 사람이 읽을 수 있는 형태로 파일사이즈를 메가, 기가로 변경하여 출력
$ bin/hadoop fs -ls -h /user/
Found 2 items
drwxr-xr-x - shc supergroup 0 2022-07-14 15:44 /user/shc
-rw-r--r-- 1 shc supergroup 21 2022-07-14 16:17 /user/testfile01.txt
# 하위 폴더까지 조회
$ bin/hadoop fs -ls -R /user/
drwxr-xr-x - shc supergroup 0 2022-07-14 15:44 /user/shc
-rw-r--r-- 1 shc supergroup 21 2022-07-14 16:17 /user/testfile01.txt
# 액세스 시간을 조회, 기본설정은 생성 시간, 마지막 접근 시간을 확인하여 파일 정리 가능
$ bin/hadoop fs -ls -u /user/
Found 2 items
drwxr-xr-x - shc supergroup 0 1970-01-01 09:00 /user/shc
-rw-r--r-- 1 shc supergroup 21 2022-07-14 16:17 /user/testfile01.txt
mkdir 명령어는 디렉토리를 확인하고 생성하는 역할을 합니다.
# 폴더 확인
$ bin/hadoop fs -mkdir /user/folder
mkdir: `hdfs://localhost:9000/user': No such file or directory
#/user/folder1/folder2를 생성, 상위 폴더가 없으면 자동으로 생성
(base) shcDE-ui-MacBookPro:hadoop shc$ bin/hadoop fs -mkdir -p /user/folder1/folder2
(base) shcDE-ui-MacBookPro:hadoop shc$
# 해당 폴더 존재하는지 확인(folder1 존재 확인)
$ bin/hadoop fs -mkdir /user/folder1
mkdir: `/user/folder1': File exists
cp 명령어는 HDFS 상의 파일을 복사하는 역할을 합니다.
(base) shcDE-ui-MacBookPro:hadoop shc$ bin/hadoop fs -cp /user/testfile01.txt /user/testfile02.txt
(base) shcDE-ui-MacBookPro:hadoop shc$
mv 명령어는 HDFS 상의 파일을 이동하거나, 파일 이름을 변경할 때 사용합니다.
(base) shcDE-ui-MacBookPro:hadoop shc$ bin/hadoop fs -mv /user/testfile01.txt /user/testfile03.txt
(base) shcDE-ui-MacBookPro:hadoop shc$
get 명령어는 HDFS의 파일을 로컬에 복사할 때 사용합니다.
(base) shcDE-ui-MacBookPro:hadoop shc$ bin/hadoop fs -get /user/testfile03.txt ./
(base) shcDE-ui-MacBookPro:hadoop shc$
# 동일한 이름의 파일이 존재하면 덮어씀
(base) shcDE-ui-MacBookPro:hadoop shc$ bin/hadoop fs -get -f /user/testfile03.txt ./
(base) shcDE-ui-MacBookPro:hadoop shc$
put 명령어는 로컬의 파일을 HDFS에 복사할 때 사용합니다.
# 해당 파일이 존재할 때는 다음 결과가 나옴
$ bin/hadoop fs -put ./testfile03.txt /user/
put: `/user/testfile03.txt': File exists
# 동일한 이름의 파일이 존재하면 덮어씀
(base) shcDE-ui-MacBookPro:hadoop shc$ bin/hadoop fs -put -f ./testfile03.txt /user/
(base) shcDE-ui-MacBookPro:hadoop shc$
rm 명령어는 HDFS의 파일을 삭제할 때 사용합니다.
$ bin/hadoop fs -rm /user/testfile03.txt
2022-07-14 22:37:56,102 INFO fs.TrashPolicyDefault: Moved: 'hdfs://localhost:9000/user/testfile03.txt' to trash at: hdfs://localhost:9000/user/shc/.Trash/Current/user/testfile03.txt
# 디렉토리를 포함하여 하위의 모든 파일을 삭제, 디렉토리 삭제시 필요함(쓰레기통을 사용하므로 작동 안됨)
$ bin/hadoop fs -rm -r /user/
rm: Cannot move "hdfs://localhost:9000/user" to the trash, as it contains the trash. Consider using -skipTrash option
# 쓰레기통을 사용하지 않고 파일 삭제
$ bin/hadoop fs -rm -skipTrash /user/
rm: `/user': Is a directory
setrep 명령어는 디렉토리, 파일의 레플리케이션 팩터를 수정합니다.
# 디렉토리의 복제개수를 5로 설정
$ bin/hadoop fs -setrep 5 /user/
Replication 5 set: /user/shc/.Trash/Current/user/testfile03.txt
Replication 5 set: /user/testfile02.txt
# bin/hadoop fs -setrep 5 -R /user/ 명령어는 유효하지 않아서 기재하지 않음
test 명령어는 파일, 디렉토리의 존재 여부를 확인합니다.
# -d: 경로가 디렉토리이면 0을 반환합니다.
# -e: 경로가 있으면 0을 반환합니다.
# -f: 경로가 파일이면 0을 반환합니다.
# -s: 경로가 비어 있지 않으면 0을 반환합니다.
# -w: 경로가 존재하고 쓰기 권한이 부여 된 경우 0을 반환합니다.
# -r: 경로가 존재하고 읽기 권한이 부여 된 경우 0을 반환합니다.
# -z: 파일 길이가 0이면 0을 반환합니다.
# /user/test.txt 파일이 존재하면 0을 반환(맥은 그냥 통과)
(base) shcDE-ui-MacBookPro:hadoop shc$ bin/hadoop fs -test -e /user/testfile02.txt
(base) shcDE-ui-MacBookPro:hadoop shc$
touchz 명령어는 0byte 파일을 생성합니다.
(base) shcDE-ui-MacBookPro:hadoop shc$ bin/hadoop fs -touchz /user/test.txt
(base)shcDE-ui-MacBookPro:hadoop shc$
stat 명령어는 주어진 포맷에 따른 파일의 정보를 확인합니다.
# 주요 포맷
# %y : 마지막 수정 시간
# %x : 마지막 접근 시간
# %n : 파일 이름
# %b : 파일 사이즈 (byte)
$ bin/hadoop fs -stat "%y %n" hdfs://127.0.0.1:9870/*
stat: RPC response exceeds maximum data length
setfacl 명령어는 파일의 ACL을 설정합니다. ls명령으로 확인할 수 있는 파일의 권한과 별도로 권한을 설정할 수있습니다.
# user a에게 /user/file의 읽기(r), 쓰기(w) 권한을 줌
(base) shcDE-ui-MacBookPro:hadoop shc$ bin/hadoop fs -setfacl -m user:a:rw- /user/file
(base) shcDE-ui-MacBookPro:hadoop shc$
# /user/file에서 신규로 생성되는 파일, 디렉토리에 대하여 user a에게 의 읽기(r), 쓰기(w) 권한을 줌
(base) shcDE-ui-MacBookPro:hadoop shc$ bin/hadoop fs -setfacl -m default:user:a:rw- /user/file
(base)shcDE-ui-MacBookPro:hadoop shc$
getfacl 명령어는 파일의 ACL을 확인합니다.
$ bin/hadoop fs -getfacl /user/file
# file: /user/file
# owner: shc
# group: supergroup
user::rwx
user:a:rw-
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:a:rw-
default:group::r-x
default:mask::rwx
default:other::r-x
count 명령어는 지정한 경로의 디렉토리 개수, 파일개수, 파일 사이즈 확인합니다. -q, -v 옵션과 함께 사용하여 더 많은 정보를 확인할 수 있습니다.
# /user 디렉토리 확인
$ bin/hadoop fs -count /user
8 3 42 /user
# 헤더 함께 출력
$ bin/hadoop fs -count -q -v hdfs:///user/file
QUOTA REM_QUOTA SPACE_QUOTA REM_SPACE_QUOTA DIR_COUNT FILE_COUNT CONTENT_SIZE PATHNAME
none inf none inf 1 0 0 hdfs:///user/file
이번 포스팅에서는 명령어를 여기까지 다루겠습니다. 다음 포스팅에서 추가적으로 주요 명령어를 살펴보겠습니다.
오늘도 긴 글 읽어주시느라 고생하셨습니다.
감사합니다.
[레퍼런스]
- 빅데이터 - 하둡, 하이브로 시작하기(위키독스) : https://wikidocs.net/book/2203
- 07-HDFS 명령어(빅데이터 - 하둡, 하이브로 시작하기(위키독스)) : https://wikidocs.net/26496