2012-07-28 2 views
13

Hadoop을 사용하면서 Hadoop 파일 시스템에서 특정 문자열을 포함하는 ~ 100 개의 파일을 찾아야합니다. 다음과 같은 몇 가지 항목을 반환 요식Hadoop 파일 시스템의 여러 파일에 걸친 grep

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 ? 일단 내가 알게되면 수동으로 편집 할 수 있습니다.

+0

Grep 또는 Sed? 아니요? – plast1K

+0

이 파일은'bash-3 '처럼하려고 할 때마다 UNIX 파일 시스템이 아니라 Hadoop 파일 시스템입니다.00 cd/apps/hdmi-technology/b_dps/실시간 bash : cd :/apps/hdmi-technology/b_dps/real-time : 해당 파일이나 디렉토리가 없습니다. 그래서이 문제를 해결하기 위해 다른 방법이 필요합니다. – ferhan

답변

28

이것은 하둡 "파일 시스템"이 아닌 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 또는 네트워크 대역폭이 포화 될 때까지 수를 늘리십시오.

편집 : hadoop fs -cat를 사용

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 
+0

bash-3.00 $ cd/apps/hdmi-technology/b_dps/real-time bash : cd : /와 같이 해보려고 할 때, 문제는 유닉스 파일 시스템이 아니라 Hadoop 파일 시스템이다. apps/hdmi-technology/b_dps/real-time : 그런 파일이나 디렉토리가 없습니다'그런 파일이나 디렉토리가 없습니다. – ferhan

+0

이 디렉토리가 존재한다는 것에 긍정적입니까? 위치에 마운트 한 다음 CD로 옮길 수 있습니까? – plast1K

+0

폴더에 데이터가 들어 있으므로이 작업을 수행 할 수 있는지 여부는 잘 모르겠습니다. 그런데 내가 어떻게 그 위치에 그것을 탑재 할 수 있습니까? – ferhan

0

(또는 더 일반적인 hadoop fs -text) 방금이있는 경우 가능한 수 있습니다 : 당신이 (약간 뇌사 인) SunOS의에있어 감안할 때이 시도 1GB 파일. 100 파일에 대해서는 streaming-api을 사용 하겠지만 완전한 깃털이없는 mapreduce 작업을 사용하지 않고 adhoc- 쿼리에 사용할 수 있기 때문입니다. 예 : java.io.IOException: Stream closed 예외를 받고 방지하기 위해, 당신은 전체 입력을 읽을 필요

#!/bin/bash 
grep -q $1 && echo $mapreduce_map_input_file 
cat >/dev/null # ignore the rest 

참고 : 귀하의 경우 스크립트 get_filename_for_pattern.sh을 만들 수 있습니다.

그런 다음 명령 대신 hadoop jar $HADOOP_HOME/hadoop-streaming.jarmapred streaming 작동합니다 새로운 배포판에서

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_HOME을 설정해야합니다.

간단한 쿼리의 경우 스크립트가 없어도 직접 -mapper 매개 변수에 명령을 제공 할 수 있습니다. 그러나 약간 복잡한 경우에는 스크립트를 사용하는 것이 바람직합니다. 이스케이프 권한을 얻는 것이 자질구리 일 수 있기 때문입니다.

감축 단계가 필요하지 않은 경우 각각의 -reduce 옵션에 기호 NONE 매개 변수를 제공하십시오 (또는 -numReduceTasks 0 만 사용하십시오). 그러나 출력을 단일 파일로 통합하려면 축소 단계가 필요합니다.

관련 문제