加密的 Shuffle 功能允許使用 HTTPS 加密 MapReduce Shuffle,並可選擇用戶端驗證(也稱為雙向 HTTPS 或具有用戶端憑證的 HTTPS)。它包含
用於在 HTTP 和 HTTPS 之間切換 Shuffle 的 Hadoop 組態設定。
用於指定 Shuffle 服務和擷取 Shuffle 資料的 Reducer 任務所使用的金鑰庫和信任庫屬性(位置、類型、密碼)的 Hadoop 組態設定。
當叢集新增或移除節點時,重新載入信任儲存庫的方法。
若要啟用加密式洗牌,請在叢集內所有節點的 core-site.xml 中設定下列屬性
屬性 | 預設值 | 說明 |
---|---|---|
hadoop.ssl.require.client.cert |
false |
是否需要用戶端憑證 |
hadoop.ssl.hostname.verifier |
DEFAULT |
提供給 HttpsURLConnections 的主機名稱驗證器。有效值為:DEFAULT、STRICT、STRICT_IE6、DEFAULT_AND_LOCALHOST 和 ALLOW_ALL |
hadoop.ssl.keystores.factory.class |
org.apache.hadoop.security.ssl.FileBasedKeyStoresFactory |
要使用的 KeyStoresFactory 實作 |
hadoop.ssl.server.conf |
ssl-server.xml |
將從中擷取 ssl 伺服器金鑰儲存庫資訊的資源檔案。此檔案會在類別路徑中查詢,通常應該在 Hadoop conf/ 目錄中 |
hadoop.ssl.client.conf |
ssl-client.xml |
將從中擷取 ssl 伺服器金鑰儲存庫資訊的資源檔案。此檔案會在類別路徑中查詢,通常應該在 Hadoop conf/ 目錄中 |
hadoop.ssl.enabled.protocols |
TLSv1.2 |
受支援的 SSL 通訊協定。此參數只會由 DatanodeHttpServer 使用。 |
重要:目前需要用戶端憑證應設為 false。有關詳細資訊,請參閱 用戶端憑證 區段。
重要:所有這些屬性都應在叢集設定檔中標示為 final。
<property> <name>hadoop.ssl.require.client.cert</name> <value>false</value> <final>true</final> </property> <property> <name>hadoop.ssl.hostname.verifier</name> <value>DEFAULT</value> <final>true</final> </property> <property> <name>hadoop.ssl.keystores.factory.class</name> <value>org.apache.hadoop.security.ssl.FileBasedKeyStoresFactory</value> <final>true</final> </property> <property> <name>hadoop.ssl.server.conf</name> <value>ssl-server.xml</value> <final>true</final> </property> <property> <name>hadoop.ssl.client.conf</name> <value>ssl-client.xml</value> <final>true</final> </property>
mapred-site.xml
屬性若要啟用加密式洗牌,請在叢集內所有節點的 mapred-site.xml 中設定下列屬性
屬性 | 預設值 | 說明 |
---|---|---|
mapreduce.shuffle.ssl.enabled |
false |
是否啟用加密式洗牌 |
重要:此屬性應在叢集設定檔中標示為 final。
<property> <name>mapreduce.shuffle.ssl.enabled</name> <value>true</value> <final>true</final> </property>
應設定 Linux 容器執行器,以防止工作任務讀取伺服器金鑰儲存庫資訊並取得洗牌伺服器憑證的存取權。
有關如何執行此操作的詳細資訊,請參閱 Hadoop Kerberos 設定。
目前 FileBasedKeyStoresFactory
是唯一的 KeyStoresFactory
實作。FileBasedKeyStoresFactory
實作使用 ssl-server.xml 和 ssl-client.xml 檔案中的下列屬性來設定金鑰儲存庫和信任儲存庫。
ssl-server.xml
(洗牌伺服器) 設定mapred 使用者應擁有 ssl-server.xml 檔案,並擁有其獨佔讀取權限。
屬性 | 預設值 | 說明 |
---|---|---|
ssl.server.keystore.type |
jks |
金鑰庫檔案類型 |
ssl.server.keystore.location |
無 | 金鑰庫檔案位置。mapred 使用者應擁有此檔案並擁有獨佔的讀取權限。 |
ssl.server.keystore.password |
無 | 金鑰庫檔案密碼 |
ssl.server.truststore.type |
jks |
信任儲存庫檔案類型 |
ssl.server.truststore.location |
無 | 信任儲存庫檔案位置。mapred 使用者應擁有此檔案並擁有獨佔的讀取權限。 |
ssl.server.truststore.password |
無 | 信任儲存庫檔案密碼 |
ssl.server.truststore.reload.interval |
10000 | 信任儲存庫重新載入間隔,以毫秒為單位 |
<configuration> <!-- Server Certificate Store --> <property> <name>ssl.server.keystore.type</name> <value>jks</value> </property> <property> <name>ssl.server.keystore.location</name> <value>${user.home}/keystores/server-keystore.jks</value> </property> <property> <name>ssl.server.keystore.password</name> <value>serverfoo</value> </property> <!-- Server Trust Store --> <property> <name>ssl.server.truststore.type</name> <value>jks</value> </property> <property> <name>ssl.server.truststore.location</name> <value>${user.home}/keystores/truststore.jks</value> </property> <property> <name>ssl.server.truststore.password</name> <value>clientserverbar</value> </property> <property> <name>ssl.server.truststore.reload.interval</name> <value>10000</value> </property> </configuration>
ssl-client.xml
(Reducer/Fetcher) 組態mapred 使用者應擁有 ssl-client.xml 檔案,且應具有預設權限。
屬性 | 預設值 | 說明 |
---|---|---|
ssl.client.keystore.type |
jks |
金鑰庫檔案類型 |
ssl.client.keystore.location |
無 | 金鑰庫檔案位置。mapred 使用者應擁有此檔案,且應具有預設權限。 |
ssl.client.keystore.password |
無 | 金鑰庫檔案密碼 |
ssl.client.truststore.type |
jks |
信任儲存庫檔案類型 |
ssl.client.truststore.location |
無 | 信任儲存庫檔案位置。mapred 使用者應擁有此檔案,且應具有預設權限。 |
ssl.client.truststore.password |
無 | 信任儲存庫檔案密碼 |
ssl.client.truststore.reload.interval |
10000 | 信任儲存庫重新載入間隔,以毫秒為單位 |
<configuration> <!-- Client certificate Store --> <property> <name>ssl.client.keystore.type</name> <value>jks</value> </property> <property> <name>ssl.client.keystore.location</name> <value>${user.home}/keystores/client-keystore.jks</value> </property> <property> <name>ssl.client.keystore.password</name> <value>clientfoo</value> </property> <!-- Client Trust Store --> <property> <name>ssl.client.truststore.type</name> <value>jks</value> </property> <property> <name>ssl.client.truststore.location</name> <value>${user.home}/keystores/truststore.jks</value> </property> <property> <name>ssl.client.truststore.password</name> <value>clientserverbar</value> </property> <property> <name>ssl.client.truststore.reload.interval</name> <value>10000</value> </property> </configuration>
在您進行上述組態變更後,重新啟動所有 NodeManager 以啟用加密 Shuffle。
重要:使用加密 Shuffle 會造成顯著的效能影響。使用者應分析此效能並潛在保留 1 個或多個核心給加密 Shuffle。
使用用戶端憑證無法完全確保用戶端是該工作的 reducer 工作。目前,用戶端憑證(其私密金鑰)金鑰庫檔案必須讓提交工作至叢集的所有使用者都能讀取。這表示惡意工作可以讀取此類金鑰庫檔案,並使用其中的用戶端憑證與 Shuffle 伺服器建立安全連線。不過,除非惡意工作擁有適當的 JobToken,否則它無法從 Shuffle 伺服器擷取 Shuffle 資料。工作使用自己的 JobToken,只能擷取屬於自己的 Shuffle 資料。
預設情況下,信任儲存庫會每 10 秒重新載入其組態。如果新的信任儲存庫檔案覆蓋舊檔案,它將重新讀取,且其憑證將取代舊憑證。此機制對於新增或移除叢集中的節點,或新增或移除受信任的用戶端很有用。在這些情況下,用戶端或 NodeManager 憑證會新增至(或移除自)系統中所有的信任儲存庫檔案,且新的組態會在您不必重新啟動 NodeManager 惡魔的情況下被選取。
注意:僅在進行問題排除時啟用除錯,而且僅對執行少量資料的作業啟用。它非常詳細,而且會將作業速度降低好幾個數量級。(您可能需要增加 mapred.task.timeout,以防止作業因作業執行得太慢而失敗。)
若要在還原器中啟用 SSL 除錯,請在 mapreduce.reduce.child.java.opts
屬性中設定 -Djavax.net.debug=all
;例如
<property> <name>mapred.reduce.child.java.opts</name> <value>-Xmx-200m -Djavax.net.debug=all</value> </property>
您可以針對每個作業執行此操作,或透過 mapred-site.xml
檔案中的群集範圍設定來執行。
若要設定 NodeManager 中的這個屬性,請在 yarn-env.sh
檔案中設定
YARN_NODEMANAGER_OPTS="-Djavax.net.debug=all"
此功能允許在合併和洗牌階段中產生的暫時檔案加密。它可以透過將 mapreduce.job.encrypted-intermediate-data
作業屬性設定為 true
來啟用。
名稱 | 類型 | 說明 |
---|---|---|
mapreduce.job.encrypted-intermediate-data | 布林 | 啟用或停用加密暫時的 MapReduce 溢出檔案。預設值為 false。 |
mapreduce.job.encrypted-intermediate-data-key-size-bits | 整數 | 金鑰產生器用於加密溢出到磁碟資料的金鑰長度。 |
mapreduce.job.encrypted-intermediate-data.buffer.kb | 整數 | 加密後寫入磁碟的串流緩衝區大小(以 KB 為單位)。 |
注意:目前,啟用加密的暫時資料溢出會將作業的嘗試次數限制為 1。