Hadoop:可插入式洗牌和可插入式排序

簡介

可插入式洗牌和可插入式排序功能允許使用替代實作取代內建的洗牌和排序邏輯。此功能的範例使用案例包括:使用 HTTP 以外的不同應用程式通訊協定(例如 RDMA),從 Map 節點將資料洗牌到 Reducer 節點;或使用自訂演算法取代排序邏輯,以啟用雜湊聚合和 Limit-N 查詢。

重要:可插入式洗牌和可插入式排序功能為實驗性質且不穩定。這表示提供的 API 可能會在 Hadoop 的未來版本中變更並破壞相容性。

實作自訂 Shuffle 和自訂排序

自訂 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 中設定,以變更所有工作的預設值。

收集器類別組態可以指定收集器實作的逗號分隔清單。在此情況下,映射工作會嘗試依序建立每個實作,直到其中一個實作成功初始化為止。例如,如果給定的收集器實作僅與特定類型的金鑰或值相容,這會很有用。

NodeManager 組態屬性,所有節點中的 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 檔案的遠端絕對或相對路徑

從 HDFS 載入 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>

從本機檔案系統載入 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": "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 檔案,則應將服務新增至服務清單。