[HADOOP] Hadoop 파일 시스템의 여러 파일에 걸친 Grep
HADOOPHadoop 파일 시스템의 여러 파일에 걸친 Grep
나는 Hadoop과 협력 중이고 Hadoop 파일 시스템에서 ~ 100 개의 파일 중 특정 문자열이 무엇인지 찾아야한다.
이렇게 검색 할 파일을 볼 수 있습니다.
bash-3.00$ hadoop fs -ls /apps/mdhi-technology/b_dps/real-time
..이 같은 여러 항목을 반환합니다 :
-rw-r--r-- 3 b_dps mdhi-technology 1073741824 2012-07-18 22:50 /apps/mdhi-technology/b_dps/HADOOP_consolidated_RT_v1x0_20120716_aa
-rw-r--r-- 3 b_dps mdhi-technology 1073741824 2012-07-18 22:50 /apps/mdhi-technology/b_dps/HADOOP_consolidated_RT_v1x0_20120716_ab
이 중 bcd4bc3e1380a56108f486a4fffbc8dc 문자열이 포함 된 것을 어떻게 찾을 수 있습니까? 일단 내가 알게되면 수동으로 편집 할 수 있습니다.
해결법
-
==============================
1.이 파일은 POSIX 파일 시스템이 아닌 "파일 시스템"입니다.
이 파일은 POSIX 파일 시스템이 아닌 "파일 시스템"입니다.
hadoop fs -ls /apps/hdmi-technology/b_dps/real-time | awk '{print $8}' | \ while read f do hadoop fs -cat $f | grep -q bcd4bc3e1380a56108f486a4fffbc8dc && echo $f done
이것은 작동해야하지만, 그것은 연속적이므로 느려질 수 있습니다. 클러스터가 열을받을 수 있다면 우리는 병렬화 할 수 있습니다.
hadoop fs -ls /apps/hdmi-technology/b_dps/real-time | awk '{print $8}' | \ xargs -n 1 -I ^ -P 10 bash -c \ "hadoop fs -cat ^ | grep -q bcd4bc3e1380a56108f486a4fffbc8dc && echo ^"
xargs에 -P 10 옵션이 있음을 알 수 있습니다 : 이것은 우리가 병렬로 다운로드하고 검색 할 파일 수입니다. 구성에 관련된 디스크 I / O 또는 네트워크 대역폭이 포화 될 때까지 숫자를 낮추고 시작하십시오.
편집 : SunOS에있어 (약간 뇌사 상태) 당신이 이것을 감안할 때 :
hadoop fs -ls /apps/hdmi-technology/b_dps/real-time | awk '{print $8}' | while read f; do hadoop fs -cat $f | grep bcd4bc3e1380a56108f486a4fffbc8dc >/dev/null && echo $f; done
-
==============================
2.hadoop fs -cat (또는 좀 더 일반적인 hadoop fs -text)을 사용하면 2 개의 1GB 파일 만 있으면 가능할 수 있습니다. 100 개 파일에 대해서는 streaming-api를 사용 하겠지만 완전한지도 제작 작업에 의지하지 않고 adhoc-queries에 사용할 수 있기 때문입니다. 예 : 귀하의 경우 get_filename_for_pattern.sh 스크립트를 작성하십시오.
hadoop fs -cat (또는 좀 더 일반적인 hadoop fs -text)을 사용하면 2 개의 1GB 파일 만 있으면 가능할 수 있습니다. 100 개 파일에 대해서는 streaming-api를 사용 하겠지만 완전한지도 제작 작업에 의지하지 않고 adhoc-queries에 사용할 수 있기 때문입니다. 예 : 귀하의 경우 get_filename_for_pattern.sh 스크립트를 작성하십시오.
#!/bin/bash grep -q $1 && echo $mapreduce_map_input_file cat >/dev/null # ignore the rest
java.io.IOException의 발생을 피하기 위해서 (때문에), 입력 전체를 읽어 들일 필요가 있습니다. Stream 닫힌 예외.
그런 다음 명령을 실행하십시오.
hadoop jar $HADOOP_HOME/hadoop-streaming.jar\ -Dstream.non.zero.exit.is.failure=false\ -files get_filename_for_pattern.sh\ -numReduceTasks 1\ -mapper "get_filename_for_pattern.sh bcd4bc3e1380a56108f486a4fffbc8dc"\ -reducer "uniq"\ -input /apps/hdmi-technology/b_dps/real-time/*\ -output /tmp/files_matching_bcd4bc3e1380a56108f486a4fffbc8dc hadoop fs -cat /tmp/files_matching_bcd4bc3e1380a56108f486a4fffbc8dc/*
보다 새로운 배포판에서 hadoop jar 대신 $ HADOOP_HOME / hadoop-streaming.jar 스트리밍이 작동해야합니다. 후자의 경우에는 항아리를 찾으려면 (또는 전체 경로를 직접 제공하기 위해) $ HADOOP_HOME을 올바르게 설정해야합니다.
간단한 쿼리의 경우 스크립트가 필요하지 않지만 -mapper 매개 변수에 직접 명령을 제공 할 수 있습니다. 그러나 약간 복잡한 것이면 스크립트를 사용하는 것이 바람직합니다. 이스케이프 권한을 얻는 것이 자질구리 일 수 있기 때문입니다.
감소 단계가 필요하지 않으면 각 -reduce 옵션에 기호 NONE 매개 변수를 제공하십시오 (또는 -numReduceTasks 0을 사용하십시오). 그러나 출력을 단일 파일로 통합하려면 축소 단계가 필요합니다.
-
==============================
3.hdfs 폴더에 grep 명령을 적용하려고합니다.
hdfs 폴더에 grep 명령을 적용하려고합니다.
hdfs dfs -cat /user/coupons/input/201807160000/* | grep -c null
여기 cat은 반복적으로 폴더의 모든 파일을 검사하며 grep을 적용하여 개수를 찾습니다.
-
==============================
4.hdfs 위치에 확장자가있는 모든 파일을 재귀 적으로 찾으려면 다음을 수행하십시오.
hdfs 위치에 확장자가있는 모든 파일을 재귀 적으로 찾으려면 다음을 수행하십시오.
hadoop fs -find hdfs_loc_path -name ".log"
from https://stackoverflow.com/questions/11697810/grep-across-multiple-files-in-hadoop-filesystem by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Hadoop 암호가없는 ssh가 필요한 이유는 무엇입니까? (0) | 2019.07.15 |
---|---|
[HADOOP] Mapreduce shuffle 단계의 메모리 부족 오류 (0) | 2019.07.15 |
[HADOOP] HDFS : 어떻게 재귀 적으로 파일을 나열합니까? (0) | 2019.07.15 |
[HADOOP] hadoop 0.23.8을 구성하면서 "namenode와의 데이터 노드 거부 통신"오류 발생 (0) | 2019.07.15 |
[HADOOP] 아파치 2.0 버전 vs 0.23 버전 (0) | 2019.07.15 |