HDFS 에도 find 가 있다. 로컬 find 와 옵션이 다르며 -name, -iname, -print 정도를 지원한다.
hdfs dfs -find /aaa/bbb/ccc -name '*specific_text*'
hdfs dfs -find / -iname 'part-*' -print | head
-ls -R 과 grep 조합도 흔히 쓴다. 출력 8번째 열이 경로다.
hdfs dfs -ls -R /aaa/bbb/ccc | awk '{print $8}' | grep 'specific_text'
파일 내용을 뒤지려면 읽어서 걸러야 한다. 파일 수가 많으면 부하가 크므로 대상을 먼저 좁힌다.
for f in $(hdfs dfs -ls /aaa/bbb/ccc | awk 'NR>1 {print $8}'); do
if hdfs dfs -cat "$f" | grep -q "specific_text"; then
echo "$f"
fi
done
압축 파일이나 SequenceFile 이면 -cat 대신 -text 를 쓴다. -text 는 코덱을 인식해 평문으로 풀어 준다.
hdfs dfs -text /aaa/bbb/ccc/part-00000.gz | grep 'specific_text'
파일이 많으면 셸 반복 대신 Spark 나 MapReduce 로 병렬 처리하는 편이 훨씬 빠르다.
hdfs dfs -ls 출력의 6번째와 7번째 열이 날짜와 시각이다.
hdfs dfs -ls -R /path/to/dir | sort -k6,7
hdfs dfs -ls -R /path/to/dir | sort -k6,7 -r | head -20
Hadoop 3 에는 정렬 옵션이 있다. -t 는 수정 시각순, -r 은 역순, -S 는 크기순이다.
hdfs dfs -ls -t -r /path/to/dir
hdfs dfs -ls -S /path/to/dir | head
hdfs dfs -count /path/to/dir
hdfs dfs -count -q -h -v /path/to/dir
hdfs dfs -du -s -h /path/to/dir
-count 출력의 첫 열이 디렉터리 수, 둘째가 파일 수, 셋째가 바이트 크기다. -v 를 붙이면 헤더가 나와 열을 헷갈리지 않는다. 하위 디렉터리만 세려면 다음처럼 한다.
hdfs dfs -ls -R /path/to/dir | grep -c '^d'
-ls -R 은 NameNode 에 경로 하나하나를 묻는다. 수백만 개 파일이 있는 경로에서 돌리면 NameNode RPC 가 밀려 클러스터 전체가 느려진다. 전수 조사가 필요하면 fsimage 를 덤프해 오프라인에서 분석한다.
hdfs dfsadmin -fetchImage /tmp/
hdfs oiv -i /tmp/fsimage_0000000000000123456 -o /tmp/fsimage.csv -p Delimited