복붙노트

[HADOOP] 하둡의 파일 분할 크기 변경

HADOOP

하둡의 파일 분할 크기 변경

HDFS 디렉토리에 작은 파일들이 있습니다. 파일의 볼륨은 비교적 적지 만 파일 당 처리 시간은 엄청납니다. 즉, TextInputFormat의 기본 분할 크기 인 64MB 파일은 처리하는 데 몇 시간이 걸립니다.

내가해야할 일은 분할 크기를 줄이는 것입니다. 그래서 더 많은 노드를 작업에 활용할 수 있습니다.

그래서 문제는 10kb라고 가정 해 파일을 분할하는 것이 가능하다는 것입니다. 이를 위해 내 자신의 InputFormat과 RecordReader를 구현해야합니까, 아니면 설정할 매개 변수가 있습니까? 감사.

해결법

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

    1.개별적으로 작업 당 설정할 수있는 mapred.max.split.size 매개 변수가 사용자가 원하는 것입니다. dfs.block.size를 변경하지 마십시오. dfs.block.size는 HDFS에 대해 전역이며 문제를 일으킬 수 있습니다.

    개별적으로 작업 당 설정할 수있는 mapred.max.split.size 매개 변수가 사용자가 원하는 것입니다. dfs.block.size를 변경하지 마십시오. dfs.block.size는 HDFS에 대해 전역이며 문제를 일으킬 수 있습니다.

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

    2.Hadoop the Definitive Guide, 203 페이지 "최대 분할 크기의 기본값은 Java long 형식으로 표현할 수있는 최대 값입니다. 블록 크기보다 작은 경우에만 효과가 나타나 분할을 블록보다 작게 만듭니다. 분할 크기는 다음 공식으로 계산됩니다.

    Hadoop the Definitive Guide, 203 페이지 "최대 분할 크기의 기본값은 Java long 형식으로 표현할 수있는 최대 값입니다. 블록 크기보다 작은 경우에만 효과가 나타나 분할을 블록보다 작게 만듭니다. 분할 크기는 다음 공식으로 계산됩니다.

    max(minimumSize, min(maximumSize, blockSize))
    

    기본적으로

    minimumSize < blockSize < maximumSize
    

    분할 된 크기는 blockSize입니다.

    예를 들어,

    Minimum Split Size 1
    Maximum Split Size 32mb
    Block Size  64mb
    Split Size  32mb
    

    Hadoop 많은 수의 작은 파일보다 적은 수의 대용량 파일로 더 잘 작동합니다. 한 가지 이유는 FileInputFormat이 각 분할이 하나의 파일 전체 또는 일부인 방식으로 분할을 생성하기 때문입니다. 파일이 매우 작 으면 ( "작은"은 HDFS 블록보다 훨씬 작음을 의미) 많은 파일이있는 경우 각 맵 작업은 매우 적은 입력을 처리하며 많은 파일이 하나씩 있습니다 (파일 당 하나). 각각은 여분의 부기 오버 헤드를 부과한다. 1GB의 파일을 16 개의 64MB 블록과 10,000 또는 100KB의 파일로 나누십시오. 10.000 개의 파일은 각각 하나의 맵을 사용하며, 작업 시간은 단일 입력 파일 및 16 개의 맵 태스크가있는 동등한 것보다 수십 배 또는 수백 배 느려질 수 있습니다.

  3. ==============================

    3.다음은 마술 구성 문자열없이 필요한 작업을 수행하는 올바른 방법을 보여주는 부분입니다. 필요한 상수는 FileInputFormat 내에서 정의됩니다. 블록 크기는 필요한 경우 기본 HDFS 블록 상수에서 가져올 수 있지만 사용자 정의 가능성은 매우 높습니다.

    다음은 마술 구성 문자열없이 필요한 작업을 수행하는 올바른 방법을 보여주는 부분입니다. 필요한 상수는 FileInputFormat 내에서 정의됩니다. 블록 크기는 필요한 경우 기본 HDFS 블록 상수에서 가져올 수 있지만 사용자 정의 가능성은 매우 높습니다.

    여기서는 정의 된 경우 최대 분할 크기를 2로 나누기 만합니다.

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    
    // ....
    
    final long DEFAULT_SPLIT_SIZE = 128 * 1024 * 1024;
    final Configuration conf = ...
    
    // We need to lower input block size by factor of two.
    conf.setLong(
        FileInputFormat.SPLIT_MAXSIZE,
        conf.getLong(
            FileInputFormat.SPLIT_MAXSIZE, DEFAULT_SPLIT_SIZE) / 2);
    
  4. ==============================

    4.combinefileinputformat을 확장하는 커스텀 입력 포맷을 작성하십시오. 입력 된 스플릿을 mapred.max.split.size에 지정된 값과 결합합니다.

    combinefileinputformat을 확장하는 커스텀 입력 포맷을 작성하십시오. 입력 된 스플릿을 mapred.max.split.size에 지정된 값과 결합합니다.

  5. ==============================

    5."하둡 : 확실한 가이드", p. 202 :

    "하둡 : 확실한 가이드", p. 202 :

    따라서 HDFS 블록의 크기를 변경해야하지만 이는 잘못된 방식입니다. 아마도 MapReduce 애플리케이션의 아키텍처를 검토해야 할 것입니다.

  6. from https://stackoverflow.com/questions/9678180/change-file-split-size-in-hadoop by cc-by-sa and MIT license