可插入式洗牌和可插入式排序功能允許使用替代實作取代內建的洗牌和排序邏輯。此功能的範例使用案例包括:使用 HTTP 以外的不同應用程式通訊協定(例如 RDMA),從 Map 節點將資料洗牌到 Reducer 節點;或使用自訂演算法取代排序邏輯,以啟用雜湊聚合和 Limit-N 查詢。
重要:可插入式洗牌和可插入式排序功能為實驗性質且不穩定。這表示提供的 API 可能會在 Hadoop 的未來版本中變更並破壞相容性。
自訂 Shuffle 實作需要一個在 NodeManager 中執行的 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
自訂排序實作需要一個在 Mapper 工作中執行的 org.apache.hadoop.mapred.MapOutputCollector
實作類別,以及(依排序實作而定,為選用)一個在 Reducer 工作中執行的 org.apache.hadoop.mapred.ShuffleConsumerPlugin
實作類別。
Hadoop 提供的預設實作可用作參考
org.apache.hadoop.mapred.MapTask$MapOutputBuffer
org.apache.hadoop.mapreduce.task.reduce.Shuffle
除了在 NodeManager 中執行的輔助服務(預設為 ShuffleHandler
)提供 Shuffle 服務外,所有外掛元件都在工作中執行。這表示它們可以在每個工作中進行組態。提供 Shuffle 服務的輔助服務必須在 NodeManager 組態中進行組態。
屬性 | 預設值 | 說明 |
---|---|---|
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
中設定,以變更所有工作的預設值。
收集器類別組態可以指定收集器實作的逗號分隔清單。在此情況下,映射工作會嘗試依序建立每個實作,直到其中一個實作成功初始化為止。例如,如果給定的收集器實作僅與特定類型的金鑰或值相容,這會很有用。
yarn-site.xml
有兩種方式可以組態輔助服務,透過明細檔或透過組態(舊方法)。如果使用明細檔,輔助服務組態不會從組態中讀取。
如果使用明細檔,必須在 yarn-site.xml 中將屬性 yarn.nodemanager.aux-services.manifest.enabled
設定為 true,才能啟用此功能。可以在 yarn-site.xml 中的屬性 yarn.nodemanager.aux-services.manifest
下設定檔案路徑,或透過 PUT 呼叫將檔案傳送到每個 NM,終端點為 http://nm-http-address:port/ws/v1/node/auxiliaryservices
。如果在組態中設定檔案路徑,NM 會以 yarn.nodemanager.aux-services.manifest.reload-ms
指定的間隔檢查此檔案是否有新的修改(預設為 0;設定間隔 <= 0 表示不會自動重新載入)。
否則,設定下列屬性以透過組態設定 aux 服務。
屬性 | 預設值 | 說明 |
---|---|---|
yarn.nodemanager.aux-services |
...,mapreduce_shuffle |
輔助服務名稱 |
yarn.nodemanager.aux-services.mapreduce_shuffle.class |
org.apache.hadoop.mapred.ShuffleHandler |
要使用的輔助服務類別 |
yarn.nodemanager.aux-services.%s.classpath |
NONE | 包含相關 jar 檔案以及所有相依性 jar 檔案的本機目錄。我們可以指定單一 jar 檔案或使用 /dep/* 來載入 dep 目錄下的所有 jar 檔案。 |
yarn.nodemanager.aux-services.%s.remote-classpath |
NONE | jar 檔案的遠端絕對或相對路徑 |
使用 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> <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>
使用 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> <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 服務 manifest 檔案,則應將服務新增至服務清單。