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.ShuffleHandlerorg.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$MapOutputBufferorg.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)
- 원문: 문서