복붙노트

[HADOOP] Hadoop 파일 시스템의 여러 파일에 걸친 Grep

HADOOP

Hadoop 파일 시스템의 여러 파일에 걸친 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. ==============================

    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. ==============================

    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. ==============================

    3.hdfs 폴더에 grep 명령을 적용하려고합니다.

    hdfs 폴더에 grep 명령을 적용하려고합니다.

    hdfs dfs -cat /user/coupons/input/201807160000/* | grep -c null
    

    여기 cat은 반복적으로 폴더의 모든 파일을 검사하며 grep을 적용하여 개수를 찾습니다.

  4. ==============================

    4.hdfs 위치에 확장자가있는 모든 파일을 재귀 적으로 찾으려면 다음을 수행하십시오.

    hdfs 위치에 확장자가있는 모든 파일을 재귀 적으로 찾으려면 다음을 수행하십시오.

    hadoop fs -find  hdfs_loc_path  -name ".log"
    
  5. from https://stackoverflow.com/questions/11697810/grep-across-multiple-files-in-hadoop-filesystem by cc-by-sa and MIT license