복붙노트

[HADOOP] 1000 개 파일에서 문자열을 검색하고 각 파일 크기 1GB의입니다

HADOOP

1000 개 파일에서 문자열을 검색하고 각 파일 크기 1GB의입니다

나는 (약간 뇌사 인) SunOS의 작업입니다. 그리고 아래 위의 솔라리스 기계 -에 대한 디스크 처리량은

bash-3.00$ iostat -d 1 10
    sd0           sd1           sd2           sd3
kps tps serv  kps tps serv  kps tps serv  kps tps serv
  0   0    0  551  16    8  553  16    8  554  16    8
  0   0    0  701  11   25    0   0    0  1148  17   33
  0   0    0    0   0    0    0   0    0    0   0    0
  0   0    0    0   0    0    0   0    0    0   0    0
  0   0    0    0   0    0    0   0    0    0   0    0
  0   0    0    0   0    0    0   0    0    0   0    0
  0   0    0    0   0    0    0   0    0    0   0    0
  0   0    0    0   0    0    0   0    0    0   0    0
  0   0    0    0   0    0    0   0    0    0   0    0
  0   0    0    0   0    0    0   0    0    0   0    0

문제 설명

나는 주변에 1000 파일이 각 파일 1GB의 크기이다. 그리고이 모든 1000 개 파일에서 문자열을 찾을 필요도 어떤 파일은 특정 문자열이 포함되어 있습니다. 나는 하둡 파일 시스템과 함께 일하고 모든 1000 개 파일은 하둡 파일 시스템에 있습니다.

모든 1000 개 파일을 실시간으로 폴더 아래에, 그래서 나는 다음과 같은 경우에, 나는 모든 1000 개 파일을 받고있을 것입니다. 그리고 특정 문자열을 포함하는 파일을 찾을 필요가있다.

bash-3.00$ hadoop fs -ls /apps/technology/b_dps/real-time

그래서 위의 문제 설명을 위해, 나는 특히 현악기와 포함되어있는 모든 파일을 찾을 수 아래의 명령을 사용하고

hadoop fs -ls /apps/technology/b_dps/real-time | awk '{print $8}' | while read f; do hadoop fs -cat $f | grep cec7051a1380a47a4497a107fecb84c1 >/dev/null && echo $f; done

그래서 위의 경우에이 문자열 cec7051a1380a47a4497a107fecb84c1가 포함되어있는 모든 파일을 찾을 수 있습니다. 그리고 그것은 나를 위해 잘 작동하고 나는 특정 문자열이 포함 된 파일 이름을 얻을 수 있어요.

내 질문은 -

그러나 위의 명령의 문제는 매우 매우 느립니다입니다. 그래서 우리는 위의 명령을 병렬 또는 훨씬 빨리 파일을 검색 할 수 위의 명령을 할 수있는 방법은 무엇입니까?

모든 제안을 이해할 수있을 것이다.

해결법

  1. ==============================

    1.당신은 당신이 원하는 경우이를 간단한 맵리 듀스 작업을 작성할 수 있습니다. 감속기의 수를 0으로 설정 될 수 있도록 사실, 그러나 어떤 감속기가 필요하지 않습니다. 직렬 그렙보다 훨씬 빠르게 파일 비록 병렬 처리 맵리 듀스의 전력 및 청크를 사용할 수있다이 방법.

    당신은 당신이 원하는 경우이를 간단한 맵리 듀스 작업을 작성할 수 있습니다. 감속기의 수를 0으로 설정 될 수 있도록 사실, 그러나 어떤 감속기가 필요하지 않습니다. 직렬 그렙보다 훨씬 빠르게 파일 비록 병렬 처리 맵리 듀스의 전력 및 청크를 사용할 수있다이 방법.

    그냥 당신이 원하는 문자열을 검색하도록 구성 할 수있는 매퍼를 설정합니다. 당신은 아마 TextInputFormat를 사용하여 파일에서 읽 라인을 분할하고 당신이 찾고있는 값을 확인합니다. 그런 다음 일치하는 매퍼에 대한 현재의 입력 파일의 이름을 쓸 수 있습니다.

    최신 정보:

    http://wiki.apache.org/hadoop/WordCount : 당신은 예를 계산 표준 단어로 시작할 수 이것에 가야합니다. 당신은 감속기를 제거하고 바로 매퍼을 수정할 수 있습니다. 이 입력을 광고가 텍스트 객체와 같은 값을 포함하는 시간에서 라인을 판독한다. 나는 당신의 데이터가 어떤 형식 몰라요,하지만 당신은 심지어 당신이 검색하는 문자열을 찾을 문자열로 텍스트를 변환하고 그 값에 대해 ( "")를 .contains를 하드 수 (편의상, 속도를 높이거나 가장 좋은 방법이 아닙니다 ). 당신은 당신이 타격을받을 후 파일 이름을 쓸 때 매퍼가 처리하는 파일을 어떤 운동을해야합니다.

  2. ==============================

    2.당신은 그렙 클래스에서 힌트를 얻을 수 있습니다. 그것은 예를 들어 폴더에 분포되어 있습니다.

    당신은 그렙 클래스에서 힌트를 얻을 수 있습니다. 그것은 예를 들어 폴더에 분포되어 있습니다.

    항아리 하둡 mapred-예-0.22.0.jar 그렙 입출력 정규식 ./bin/hadoop

    이 클래스의 구현에 대한 자세한 소스는 디렉토리로 이동 할 수 있습니다. "의 src \ 예 \ 조직 아파치 \의 하둡 \ 예 \"분배와 함께 제공

     Job searchjob = new Job(conf);    
     FileInputFormat.setInputPaths("job Name", "input direcotory in hdfs");
          searchjob.setMapperClass(SearchMapper.class);    
          searchjob.setCombinerClass(LongSumReducer.class);
          searchjob.setReducerClass(LongSumReducer.class);
    

    당신의 SearchMapper.class에서 당신은이 작업을 수행 할 수 있습니다.

       public void map(K key, Text value,
                          OutputCollector<Text, LongWritable> output,
                          Reporter reporter)
            throws IOException {
            String text = value.toString();
            Matcher matcher = pattern.matcher(text);
            if(matcher.find()) {
              output.collect(key,value);
    }
    
  3. ==============================

    3.1000 개 파일이있는 경우, 미세 그레인 병렬화 기술을 사용하는 어떤 이유가? 이유는 단지 xargs를, 또는 GNU 병렬를 사용하는 대신 파일 내에서 작업을 분할의, 파일을 통해 작업을 분할하지?

    1000 개 파일이있는 경우, 미세 그레인 병렬화 기술을 사용하는 어떤 이유가? 이유는 단지 xargs를, 또는 GNU 병렬를 사용하는 대신 파일 내에서 작업을 분할의, 파일을 통해 작업을 분할하지?

    당신이 리터럴 문자열 (안 정규식) grepping있는 것처럼 또한 그것은 보이는; 당신은 그렙 구현 방법 / 최적화에 따라 일의 속도가 빨라질 수 있습니다 문자열 리터럴, 검색 할 -F 그렙 플래그를 사용할 수 있습니다.

    내가 특별히 맵리 듀스와 함께 근무 한 적이없는, 그래서이 게시물은 또는 지점에있을 수도 있고 그렇지 않을 수도 있습니다.

  4. from https://stackoverflow.com/questions/11732396/search-for-a-string-in-1000-files-and-each-file-size-is-1gb by cc-by-sa and MIT license