Hadoop Azure Data Lake 支援

簡介

hadoop-azure-datalake 模組提供與 Azure Data Lake Store 整合的支援。此支援透過 JAR 檔案 azure-datalake-store.jar 提供。

相關文件

功能

  • 讀取和寫入儲存在 Azure Data Lake Storage 帳戶中的資料。
  • 使用 adl 架構的 URL 參照檔案系統路徑,以進行安全 Webhdfs,亦即 SSL 加密存取。
  • 可用作 MapReduce 作業中的資料來源或接收器。
  • 已在 Linux 和 Windows 上測試。
  • 已針對規模進行測試。
  • API setOwner()setAclremoveAclEntries()modifyAclEntries() 接受 UPN 或 OID(物件 ID)作為使用者和群組名稱。
  • 支援每個帳戶組態。

限制

部分或不支援下列作業

  • 符號連結作業
  • 代理人使用者
  • 檔案截斷
  • 檔案檢查碼
  • 檔案複製係數
  • Hadoop 集群上活動使用者的家目錄。
  • 延伸屬性 (XAttrs) 作業
  • 快照作業
  • 委派權杖作業
  • 使用 listStatus()getFileStatus() 傳回的使用者和群組資訊,其格式為 Azure Active Directory 中關聯的 GUID。

用法

概念

Azure Data Lake Storage 存取路徑語法為

adl://<Account Name>.azuredatalakestore.net/

有關使用儲存體的詳細資訊,請參閱 使用 Azure 入口網站開始使用 Azure Data Lake Store

OAuth2 支援

使用 Azure Data Lake Storage 需要 OAuth2 持有者權杖,作為 HTTPS 標頭的一部分,符合 OAuth2 規範。必須從 Azure Active Directory 服務取得有效的 OAuth2 持有者權杖,供有權存取 Azure Data Lake Storage 帳戶的有效使用者使用。

Azure Active Directory (Azure AD) 是 Microsoft 的多租用戶雲端目錄和身分管理服務。請參閱 什麼是 ActiveDirectory

下列各節說明 core-site.xml 中的 OAuth2 組態。

組態憑證和檔案系統

可以使用更新權杖(與使用者關聯)或客戶端憑證(類比於服務主體)來組態憑證。

使用更新權杖

將下列屬性新增至叢集的 core-site.xml

<property>
  <name>fs.adl.oauth2.access.token.provider.type</name>
  <value>RefreshToken</value>
</property>

應用程式必須設定與客戶端 ID 關聯的 Azure Active Directory 服務的客戶端 ID 和 OAuth2 更新權杖。請參閱 Active Directory Library For Java

請勿分享客戶端 ID 和更新權杖,必須保密。

<property>
  <name>fs.adl.oauth2.client.id</name>
  <value></value>
</property>

<property>
  <name>fs.adl.oauth2.refresh.token</name>
  <value></value>
</property>

使用客戶端金鑰

產生服務主體
  1. 前往 入口網站
  2. 在左側導覽中的服務中,尋找 Azure Active Directory 並按一下。
  3. 在功能表中使用「應用程式註冊」,建立「Web 應用程式」。記住您在此建立的名稱,因為您會將其新增至您的 ADL 帳戶作為授權使用者。
  4. 執行精靈
  5. 建立應用程式後,前往應用程式的「設定」中的「金鑰」
  6. 選擇金鑰持續時間並按一下儲存。儲存產生的金鑰。
  7. 回到應用程式註冊頁面,並按一下頂端的「端點」按鈕。記下「權杖端點」URL
  8. 記下您需要進行驗證的屬性
    • 您在上方建立的 Web 應用程式的「應用程式 ID」
    • 您剛在上方產生的金鑰
    • 權杖端點
將服務主體新增至您的 ADL 帳戶
  1. 再次前往入口網站,並開啟您的 ADL 帳戶
  2. 選擇 存取控制 (IAM)
  3. 新增您在步驟 6 中建立的使用者名稱(請注意,它不會顯示在清單中,但如果搜尋名稱,會找到它)
  4. 新增「擁有者」角色
設定 core-site.xml

將下列屬性新增至您的 core-site.xml

<property>
  <name>fs.adl.oauth2.access.token.provider.type</name>
  <value>ClientCredential</value>
</property>

<property>
  <name>fs.adl.oauth2.refresh.url</name>
  <value>TOKEN ENDPOINT FROM STEP 7 ABOVE</value>
</property>

<property>
  <name>fs.adl.oauth2.client.id</name>
  <value>CLIENT ID FROM STEP 7 ABOVE</value>
</property>

<property>
  <name>fs.adl.oauth2.credential</name>
  <value>PASSWORD FROM STEP 7 ABOVE</value>
</property>

使用 MSI (受管理服務身分識別)

Azure VM 可以配置「服務身分識別」,由 VM 內的的身分識別擴充功能管理。這樣做的優點是,身分識別由擴充功能管理,不必放入 core-site.xml。

若要使用 MSI,請修改 VM 部署範本以使用身分識別擴充功能。請注意您在範本中指定的埠號:這是身分識別擴充功能在 VM 中公開給本機端權杖服務的 REST 端點的埠號。建議的預設埠號為 50342 - 如果使用建議的埠號,則設定中可以省略 msi.port 設定。

設定 core-site.xml

將下列屬性新增至您的 core-site.xml

<property>
  <name>fs.adl.oauth2.access.token.provider.type</name>
  <value>Msi</value>
</property>

<property>
  <name>fs.adl.oauth2.msi.port</name>
  <value>PORT NUMBER FROM ABOVE (if different from the default of 50342)</value>
</property>

使用裝置碼驗證進行互動式登入

注意:此驗證方法適合執行互動式工具,但無法用於提交至叢集的作業。

若要使用基於使用者的登入,Azure ActiveDirectory 提供使用裝置碼的登入流程。

若要使用裝置碼流程,使用者必須先在 Azure 入口網站中建立一個原生應用程式註冊,並提供應用程式的客戶端 ID 作為設定。以下是步驟

  1. 前往 入口網站
  2. 在左側導覽中的服務中,尋找 Azure Active Directory 並按一下。
  3. 在功能表中使用「應用程式註冊」,建立「原生應用程式」。
  4. 執行精靈
  5. 建立應用程式後,記下應用程式的「應用程式 ID」
  6. 授予應用程式權限
    1. 按一下應用程式的「權限」,然後新增「Azure Data Lake」和「Windows Azure 服務管理 API」權限
    2. 按一下「授予權限」將權限新增至應用程式

將下列屬性新增至您的 core-site.xml

<property>
  <name>fs.adl.oauth2.devicecode.clientappid</name>
  <value>APP ID FROM STEP 5 ABOVE</value>
</property>

通常不建議將 DeviceCode 新增為預設權杖提供者類型。但使用本機命令時可以使用它

 hadoop fs -Dfs.adl.oauth2.access.token.provider.type=DeviceCode -ls ...

執行此操作會列印一個 URL 和裝置代碼,可從任何瀏覽器(甚至在 ssh 會話外部的不同機器上)使用來登入。登入後,指令會繼續執行。

使用憑證提供者保護憑證

在許多 Hadoop 群集中,core-site.xml 檔案是所有人都可讀取的。若要保護這些憑證,建議您使用憑證提供者架構安全地儲存和存取它們。

所有 ADLS 憑證屬性都可以由憑證提供者保護。如需有關憑證提供者 API 的其他資訊,請參閱 憑證提供者 API

配置
hadoop credential create fs.adl.oauth2.client.id -value 123
    -provider localjceks://file/home/foo/adls.jceks
hadoop credential create fs.adl.oauth2.refresh.token -value 123
    -provider localjceks://file/home/foo/adls.jceks
設定 core-site.xml 或命令列屬性
<property>
  <name>fs.adl.oauth2.access.token.provider.type</name>
  <value>RefreshToken</value>
</property>
<property>
  <name>hadoop.security.credential.provider.path</name>
  <value>localjceks://file/home/foo/adls.jceks</value>
  <description>Path to interrogate for protected credentials.</description>
</property>
執行 DistCp
hadoop distcp
    [-D fs.adl.oauth2.access.token.provider.type=RefreshToken
     -D hadoop.security.credential.provider.path=localjceks://file/home/user/adls.jceks]
    hdfs://<NameNode Hostname>:9001/user/foo/srcDir
    adl://<Account Name>.azuredatalakestore.net/tgtDir/

注意:您也可以將提供者路徑屬性新增到 distcp 命令列,而不是將工作特定設定新增到一般 core-site.xml。上面方括號說明了此功能。

存取 adl URL

core-site.xml 中設定憑證後,任何 Hadoop 元件都可以使用下列格式的 URL 參照該 Azure Data Lake Storage 帳戶中的檔案

adl://<Account Name>.azuredatalakestore.net/<path>

adl 架構識別由 Azure Data Lake Storage 支援的 Hadoop 相容檔案系統上的 URL。adl 使用加密的 HTTPS 存取來與 Azure Data Lake Storage API 進行所有互動。

例如,下列 檔案系統 Shell 指令示範如何存取名為 youraccount 的儲存帳戶。

hadoop fs -mkdir adl://yourcontainer.azuredatalakestore.net/testDir

hadoop fs -put testFile adl://yourcontainer.azuredatalakestore.net/testDir/testFile

hadoop fs -cat adl://yourcontainer.azuredatalakestore.net/testDir/testFile
test file content

使用者/群組表示

hadoop-azure-datalake 模組提供支援,用於設定在 getFileStatus()listStatus()getAclStatus() 呼叫期間使用者/群組資訊的表示方式。

將下列屬性新增到 core-site.xml

<property>
  <name>adl.feature.ownerandgroup.enableupn</name>
  <value>true</value>
  <description>
    When true : User and Group in FileStatus/AclStatus response is
    represented as user friendly name as per Azure AD profile.

    When false (default) : User and Group in FileStatus/AclStatus
    response is represented by the unique identifier from Azure AD
    profile (Object ID as GUID).

    For performance optimization, Recommended default value.
  </description>
</property>

不同 ADL 帳戶的設定

可以使用不同的 ADL 用戶端設定來存取不同的 ADL 帳戶。這也允許使用不同的登入詳細資料。

  1. 所有 fs.adl 選項都可以針對每個帳戶設定。
  2. 帳戶特定選項是透過將選項上的 fs.adl. 前置詞替換為 fs.adl.account.ACCOUNTNAME. 來設定,其中 ACCOUNTNAME 是帳戶名稱。
  3. 連線到帳戶時,所有明確設定的選項都會覆寫基本 fs.adl. 值。

例如,設定可以有一個基本設定來使用公用帳戶 adl://<some-public-account>.azuredatalakestore.net/,以及一個帳戶特定設定來使用一些私人帳戶 adl://myprivateaccount.azuredatalakestore.net/

<property>
  <name>fs.adl.oauth2.client.id</name>
  <value>CLIENTID</value>
</property>

<property>
  <name>fs.adl.oauth2.credential</name>
  <value>CREDENTIAL</value>
</property>

<property>
  <name>fs.adl.account.myprivateaccount.oauth2.client.id</name>
  <value>CLIENTID1</value>
</property>

<property>
  <name>fs.adl.account.myprivateaccount.oauth2.credential</name>
  <value>CREDENTIAL1</value>
</property>

測試 azure-datalake-store 模組

hadoop-azure 模組包含一整套單元測試。執行 mvn test 時,大多數測試都會在沒有額外設定的情況下執行。這包括對模擬儲存的測試,模擬儲存是 Azure Data Lake Storage 的記憶體模擬。

一些測試可以在 Azure Data Lake Storage 上執行。若要執行這些測試,請使用上述章節中提到的 Adl 帳戶資訊和下列屬性,建立 src/test/resources/auth-keys.xml

<property>
    <name>fs.adl.test.contract.enable</name>
    <value>true</value>
</property>

<property>
    <name>test.fs.adl.name</name>
    <value>adl://yourcontainer.azuredatalakestore.net</value>
</property>