Hadoop: 플러그형 셔플(Pluggable Shuffle)과 플러그형 정렬(Pluggable Sort)

Hadoop: 플러그형 셔플(Pluggable Shuffle)과 플러그형 정렬(Pluggable Sort)

플러그형 shuffle과 플러그형 sort 기능은 내장된 shuffle·sort 로직을 대체 구현으로 교체할 수 있게 해줘요. 예시 사용 사례: Map 노드에서 Reducer 노드로 데이터를 shuffle할 때 HTTP 대신 RDMA 같은 다른 애플리케이션 프로토콜 사용; 또는 정렬 로직을 Hash 집계와 Limit-N 쿼리를 가능하게 하는 사용자 정의 알고리즘으로 교체.

출처: 문서

본문

소개 (Introduction)

플러그형 shuffle과 플러그형 sort 기능은 내장된 shuffle과 sort 로직을 대체 구현으로 교체할 수 있게 해줘요. 예시 사용 사례는 다음과 같아요:

  • Map 노드에서 Reducer 노드로 데이터를 shuffle할 때 HTTP가 아닌 RDMA 같은 다른 애플리케이션 프로토콜 사용.
  • 정렬 로직을 Hash 집계와 Limit-N 쿼리를 가능하게 하는 사용자 정의 알고리즘으로 교체.

중요: 플러그형 shuffle과 플러그형 sort 기능은 실험적(expreimental)이고 불안정해요. 이것은 제공된 API가 향후 Hadoop 버전에서 변경되거나 호환성을 깨뜨릴 수 있음을 의미해요.

커스텀 Shuffle과 커스텀 Sort 구현 (Implementing a Custom Shuffle and a Custom Sort)

커스텀 shuffle 구현에는 NodeManagers에서 실행되는 org.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServices.AuxiliaryService 구현 클래스와 Reducer 태스크에서 실행되는 org.apache.hadoop.mapred.ShuffleConsumerPlugin 구현 클래스가 필요해요.

Hadoop이 제공하는 기본 구현을 참조로 사용할 수 있어요:

  • org.apache.hadoop.mapred.ShuffleHandler
  • org.apache.hadoop.mapreduce.task.reduce.Shuffle

커스텀 sort 구현에는 Mapper 태스크에서 실행되는 org.apache.hadoop.mapred.MapOutputCollector 구현 클래스와 (선택적으로, sort 구현에 따라) Reducer 태스크에서 실행되는 org.apache.hadoop.mapred.ShuffleConsumerPlugin 구현 클래스가 필요해요.

Hadoop이 제공하는 기본 구현을 참조로 사용할 수 있어요:

  • org.apache.hadoop.mapred.MapTask$MapOutputBuffer
  • org.apache.hadoop.mapreduce.task.reduce.Shuffle

구성 (Configuration)

shuffle을 제공하는 NodeManagers에서 실행되는 보조 서비스(auxiliary service, 기본적으로 ShuffleHandler)를 제외하고, 모든 플러그형 컴포넌트는 작업 태스크에서 실행돼요. 이것은 작업별로 구성할 수 있음을 의미해요. Shuffle을 제공하는 보조 서비스는 NodeManagers 구성에서 구성해야 해요.

작업 구성 속성 (Job Configuration Properties, 작업별)

Property Default Value Explanation
mapreduce.job.reduce.shuffle.consumer.plugin.class org.apache.hadoop.mapreduce.task.reduce.Shuffle 사용할 ShuffleConsumerPlugin 구현
mapreduce.job.map.output.collector.class org.apache.hadoop.mapred.MapTask$MapOutputBuffer 사용할 MapOutputCollector 구현(들)

이 속성들은 mapred-site.xml에 설정해 모든 작업의 기본값을 변경할 수도 있어요. collector 클래스 구성은 쉼표로 구분된 collector 구현 목록을 지정할 수 있어요. 이 경우 map 태스크는 구현 중 하나가 성공적으로 초기화될 때까지 각각을 차례로 인스턴스화하려 시도해요. 이것은 예를 들어 주어진 collector 구현이 특정 유형의 키나 값과만 호환되는 경우 유용할 수 있어요.

NodeManager 구성 속성 (NodeManager Configuration properties, 모든 노드의 yarn-site.xml)

보조 서비스를 구성하는 방법은 두 가지예요. manifest 파일을 통하거나 Configuration(옛날 방식)을 통하는 거예요. manifest 파일을 사용하면 보조 서비스 구성이 Configuration에서 읽히지 않아요.

manifest를 사용한다면 yarn-site.xml에서 yarn.nodemanager.aux-services.manifest.enabled 속성을 true로 설정해 기능을 활성화해야 해요. 파일 경로는 yarn-site.xml의 yarn.nodemanager.aux-services.manifest 속성 아래에 설정하거나, 각 NM에 http://nm-http-address:port/ws/v1/node/auxiliaryservices 엔드포인트에 대한 PUT 호출로 파일을 보낼 수 있어요. 파일 경로가 Configuration에 설정되면 NM은 yarn.nodemanager.aux-services.manifest.reload-ms에 지정된 간격(기본값 0)으로 새 수정 사항을 이 파일에서 확인해요.

HDFS에서 jar 파일 로드 예시 (Example of loading jar file from HDFS)

manifest 사용:

{
  "services": [
    {
      "name": "mapreduce_shuffle",
      "version": "1",
      "configuration": {
        "properties": {
          "class.name": "org.apache.hadoop.mapred.ShuffleHandler"
        }
      }
    },
    {
      "name": "AuxServiceFromHDFS",
      "version": "1",
      "configuration": {
        "properties": {
          "class.name": "org.apache.auxtest.AuxServiceFromHDFS2"
        },
        "files": [
          {
            "src_file": "hdfs:///aux/test/aux-service-hdfs.jar",
            "type": "STATIC"
          }
        ]
      }
    }
  ]
}

또는 Configuration 사용:

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle,AuxServiceFromHDFS</value>
    </property>

    <property>
        <name>yarn.nodemanager.aux-services.AuxServiceFromHDFS.remote-classpath</name>
        <value>/aux/test/aux-service-hdfs.jar</value>
    </property>

    <property>
        <name>yarn.nodemanager.aux-services.AuxServiceFromHDFS.class</name>
        <value>org.apache.auxtest.AuxServiceFromHDFS2</value>
    </property>
</configuration>
로컬 파일시스템에서 jar 파일 로드 예시 (Example of loading jar file from local file system)

manifest 사용:

{
  "services": [
    {
      "name": "mapreduce_shuffle",
      "version": "1",
      "configuration": {
        "properties": {
          "class.name": "org.apache.hadoop.mapred.ShuffleHandler"
        }
      }
    },
    {
      "name": "AuxServiceFromHDFS",
      "version": "1",
      "configuration": {
        "properties": {
          "class.name": "org.apache.auxtest.AuxServiceFromHDFS2"
        },
        "files": [
          {
            "src_file": "file:///aux/test/aux-service-hdfs.jar",
            "type": "STATIC"
          }
        ]
      }
    }
  ]
}

또는 Configuration 사용:

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle,AuxServiceFromHDFS</value>
    </property>

    <property>
        <name>yarn.nodemanager.aux-services.AuxServiceFromHDFS.classpath</name>
        <value>/aux/test/aux-service-hdfs.jar</value>
    </property>

    <property>
        <name>yarn.nodemanager.aux-services.AuxServiceFromHDFS.class</name>
        <value>org.apache.auxtest.AuxServiceFromHDFS2</value>
    </property>
</configuration>

중요: 기본 mapreduce_shuffle 서비스에 추가로 보조 서비스를 설정한다면, yarn.nodemanager.aux-services 속성에 mapred.shufflex 같은 새 서비스 키를 추가해야 해요. 그러면 해당 클래스를 정의하는 속성은 yarn.nodemanager.aux-services.mapreduce_shufflex.class가 되어야 해요. 또는 aux services manifest 파일을 사용한다면 서비스를 서비스 목록에 추가해야 해요.

더 알아보기 (Learn more)