Hadoop Azure 支援:Azure Blob 儲存

另請參閱

簡介

hadoop-azure 模組提供與 Azure Blob Storage 整合的支援。名為 hadoop-azure.jar 的建置 jar 檔,也會宣告它所需的額外人工製品的遞移相依性,特別是 Azure Storage SDK for Java

若要讓它成為 Apache Hadoop 的預設類別路徑的一部分,只需確定 hadoop-env.sh 中的 HADOOP_OPTIONAL_TOOLS 在清單中包含 'hadoop-azure 即可。範例

export HADOOP_OPTIONAL_TOOLS="hadoop-azure,hadoop-azure-datalake"

功能

  • 讀取和寫入儲存在 Azure Blob Storage 帳戶中的資料。
  • 透過實作標準 Hadoop FileSystem 介面,提供階層式檔案系統檢視。
  • 支援多個 Azure Blob Storage 帳戶的組態。
  • 同時支援區塊 blob(適用於大多數使用案例,例如 MapReduce)和頁面 blob(適用於連續寫入使用案例,例如 HBase 寫入先寫入記錄檔)。
  • 使用 wasb 架構,使用 URL 參照檔案系統路徑。
  • 也使用 URL 參照檔案系統路徑,其中 wasbs 架構用於 SSL 加密存取。
  • 可以在 MapReduce 工作中擔任資料來源或接收器。
  • 已在 Linux 和 Windows 上測試。
  • 已大規模測試。

限制

  • 檔案擁有者和群組會持續存在,但不會強制執行權限模型。授權發生在整個 Azure Blob Storage 帳戶的層級。
  • 不會追蹤檔案最後存取時間。

用法

概念

Azure Blob Storage 資料模型提供 3 個核心概念

  • 儲存體帳戶:所有存取都是透過儲存體帳戶進行。
  • 容器:容器是多個 blob 的群組。儲存體帳戶可能有多個容器。在 Hadoop 中,整個檔案系統階層儲存在單一容器中。也可以組態多個容器,有效地提供多個檔案系統,可以使用不同的 URL 參照。
  • Blob:任何類型和大小的檔案。在 Hadoop 中,檔案儲存在 blob 中。內部實作也使用 blob 來持續存在檔案系統階層和其他元資料。

組態認證

使用 Azure Blob Storage 需要組態認證。這通常設定在 core-site.xml 中。組態屬性名稱的格式為 fs.azure.account.key.<account name>.blob.core.windows.net,值是存取金鑰。存取金鑰是保護您儲存體帳戶存取權的機密。請勿與不受信任的對象分享存取金鑰(或 core-site.xml 檔案)。

例如

<property>
  <name>fs.azure.account.key.youraccount.blob.core.windows.net</name>
  <value>YOUR ACCESS KEY</value>
</property>

在許多 Hadoop 集群中,core-site.xml 檔案是全世界可讀取的。也可以在憑證提供者中保護存取金鑰。這會提供加密的檔案格式,並搭配檔案權限保護。

使用憑證提供者保護 WASB 的 Azure 憑證

為了保護這些憑證不被窺探,建議您使用憑證提供者架構來安全儲存這些憑證,並透過組態存取這些憑證。以下說明如何在 WASB FileSystem 中使用 Azure 憑證。

如需有關憑證提供者 API 的其他資訊,請參閱:憑證提供者 API

使用憑證提供者執行 Distcp 和 WASB 的步驟
提供
% hadoop credential create fs.azure.account.key.youraccount.blob.core.windows.net -value 123
    -provider localjceks://file/home/lmccay/wasb.jceks
組態 core-site.xml 或命令列系統屬性
<property>
  <name>hadoop.security.credential.provider.path</name>
  <value>localjceks://file/home/lmccay/wasb.jceks</value>
  <description>Path to interrogate for protected credentials.</description>
</property>
distcp
% hadoop distcp
    [-D hadoop.security.credential.provider.path=localjceks://file/home/lmccay/wasb.jceks]
    hdfs://hostname:9001/user/lmccay/007020615 wasb://yourcontainer@youraccount.blob.core.windows.net/testDir/

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

在加密的檔案中保護 WASB 的 Azure 憑證

除了使用憑證提供者架構來保護您的憑證之外,也可以將其組態為加密格式。額外的組態屬性會指定一個外部程式,由 Hadoop 程序呼叫以解密金鑰。加密的金鑰值會以命令列引數傳遞給此外部程式

<property>
  <name>fs.azure.account.keyprovider.youraccount</name>
  <value>org.apache.hadoop.fs.azure.ShellDecryptionKeyProvider</value>
</property>

<property>
  <name>fs.azure.account.key.youraccount.blob.core.windows.net</name>
  <value>YOUR ENCRYPTED ACCESS KEY</value>
</property>

<property>
  <name>fs.azure.shellkeyprovider.script</name>
  <value>PATH TO DECRYPTION PROGRAM</value>
</property>

區塊 Blob 與壓縮支援和組態

區塊 Blob 是預設的 Blob 類型,適用於大多數大數據使用案例。不過,區塊 Blob 對每個 Blob 有 50,000 個區塊的嚴格限制。為了避免達到 WASB 的限制,預設情況下,在每次 hflush()hsync() 之後,不會將新的區塊上傳至服務。

在大部分情況下,將來自多個 write() 呼叫的資料合併成 4Mb 的區塊,是一種很好的最佳化方式。但在其他情況下,例如 HBase 記錄檔,每次呼叫 hflush()hsync() 都必須將資料上傳至服務。

區塊 Blob 與壓縮會在每次 hflush()/hsync() 之後將資料上傳至雲端服務。為了減輕 50000 個區塊的限制,如果 Blob 中的區塊數目超過 32,000,hflush()/hsync() 會執行一次壓縮程序。

區塊壓縮搜尋並以一個大區塊取代一連串小區塊。這表示區塊壓縮會產生相關成本:將小區塊讀回至用戶端並再次寫入為一個大區塊。

若要讓您建立的檔案成為啟用區塊壓縮的區塊 blob,用戶端必須將組態變數 fs.azure.block.blob.with.compaction.dir 設定為資料夾名稱的逗號分隔清單。

例如

<property>
  <name>fs.azure.block.blob.with.compaction.dir</name>
  <value>/hbase/WALs,/data/myblobfiles</value>
</property>

頁面 Blob 支援和組態

Hadoop 的 Azure Blob Storage 介面支援兩種 blob,區塊 blob 和頁面 blob。區塊 blob 是預設的 blob 類型,且適用於大多數大資料使用案例,例如 Hive、Pig、分析性 MapReduce 任務的輸入資料等。Hadoop-Azure 中的頁面 blob 處理功能是為了支援 HBase 記錄檔而推出。頁面 blob 可以寫入任意次數,而區塊 blob 在用完區塊之前只能附加寫入 50,000 次,否則寫入作業將會失敗。這不適用於 HBase 記錄檔,因此推出頁面 blob 支援來克服此限制。

頁面 blob 的大小最高可達 1TB,大於區塊 blob 的最大大小 200GB。您應將大多數使用案例堅持使用區塊 blob,而頁面 blob 僅在 HBase 預寫入記錄檔的脈絡中進行測試。

若要讓您建立的檔案成為頁面 blob,您必須將組態變數 fs.azure.page.blob.dir 設定為資料夾名稱的逗號分隔清單。

例如

<property>
  <name>fs.azure.page.blob.dir</name>
  <value>/hbase/WALs,/hbase/oldWALs,/data/mypageblobfiles</value>
</property>

您可以將此設定為 /,以將所有檔案設為頁面 blob。

組態選項 fs.azure.page.blob.size 是頁面 blob 的預設初始大小。它必須為 128MB 或更大,且不得超過 1TB,並指定為整數位元組數。

組態選項 fs.azure.page.blob.extension.size 是頁面 blob 延伸大小。這會定義頁面 blob 開始變滿時要延伸的量。它必須為 128MB 或更大,並指定為整數位元組數。

自訂使用者代理程式

WASB 將使用者代理程式標頭傳遞至 Azure 後端。預設值包含 WASB 版本、Java 執行時期版本、Azure Client 函式庫版本,以及組態選項 fs.azure.user.agent.prefix 的值。自訂使用者代理程式標頭可讓 Azure 服務更有效率地進行疑難排解和分析。

<property>
    <name>fs.azure.user.agent.prefix</name>
    <value>Identifier</value>
</property>

原子資料夾重新命名

Azure 儲存空間將檔案儲存為平面式金鑰/值儲存空間,未正式支援資料夾。Hadoop-Azure 檔案系統層會在 Azure 儲存空間上模擬資料夾。預設情況下,Hadoop-Azure 檔案系統層中的資料夾重新命名並非原子性的。這表示在資料夾重新命名期間發生失敗時,可能會導致部分資料夾留在原始目錄中,而部分資料夾則留在新的目錄中。

HBase 依賴原子資料夾重新命名。因此,已引入名為 fs.azure.atomic.rename.dir 的組態設定,讓您可以指定一個以逗號分隔的資料夾清單,以接收特殊處理,以便資料夾重新命名成為原子。此設定的預設值僅為 /hbase。將套用重做以完成重新命名資料夾失敗的動作。檔案 <folderName>-renamePending.json 可能會暫時出現,並記錄重新命名作業的意圖,以便在發生失敗時重做。

例如

<property>
  <name>fs.azure.atomic.rename.dir</name>
  <value>/hbase,/data</value>
</property>

存取 wasb URL

在 core-site.xml 中組態認證資訊後,任何 Hadoop 元件都可以透過使用下列格式的 URL 來參照該 Azure Blob Storage 帳戶中的檔案

wasb[s]://<containername>@<accountname>.blob.core.windows.net/<path>

wasbwasbs 範例識別由 Azure Blob Storage 支援的檔案系統上的 URL。wasb 使用未加密的 HTTP 存取來與 Azure Blob Storage API 進行所有互動。wasbs 使用 SSL 加密的 HTTPS 存取。

例如,下列 檔案系統殼層 命令示範如何存取名為 youraccount 的儲存體帳戶和名為 yourcontainer 的容器。

% hadoop fs -mkdir wasb://yourcontainer@youraccount.blob.core.windows.net/testDir

% hadoop fs -put testFile wasb://yourcontainer@youraccount.blob.core.windows.net/testDir/testFile

% hadoop fs -cat wasbs://yourcontainer@youraccount.blob.core.windows.net/testDir/testFile
test file content

也可以組態 fs.defaultFS 以使用 wasbwasbs URL。這會導致所有裸路徑(例如 /testDir/testFile)自動解析為該檔案系統。

附加 API 支援和組態

Azure Blob Storage 介面 for Hadoop 可選擇支援單一寫入者的附加 API,方法是將組態 fs.azure.enable.append.support 設為 true。

例如

<property>
  <name>fs.azure.enable.append.support</name>
  <value>true</value>
</property>

必須注意 Azure Blob Storage 介面中的附加支援與 HDFS 語意不同。附加支援並未在內部強制執行單一寫入者,而是要求應用程式保證此語意。應用程式有責任確保特定檔案路徑的單一執行緒處理,或依賴其本身的外部鎖定機制。如果未執行此動作,將導致意外行為。

多執行緒支援

對於具有大量檔案和子目錄的目錄,重新命名和刪除 blob 作業目前非常慢,因為這些作業一次一個 blob 地串行執行。這些檔案和子資料夾可以並行刪除或重新命名。下列組態可用於啟用執行緒以進行並行處理

為刪除作業啟用 10 個執行緒。將組態值設為 0 或 1 以停用執行緒。預設行為是停用執行緒。

<property>
  <name>fs.azure.delete.threads</name>
  <value>10</value>
</property>

為重新命名作業啟用 20 個執行緒。將組態值設為 0 或 1 以停用執行緒。預設行為是停用執行緒。

<property>
  <name>fs.azure.rename.threads</name>
  <value>20</value>
</property>

WASB 安全模式和組態

WASB 可以以安全模式運作,其中與 Azure 儲存體通訊所需的儲存體存取金鑰不必與使用 WASB 的處理程序位於相同的地址空間中。在此模式中,與 Azure 儲存體的所有互動都使用 SAS URI 執行。安全模式中有兩個子模式,一個是遠端 SAS 金鑰模式,其中 SAS 金鑰是由遠端處理程序產生,另一個是本機模式,其中 SAS 金鑰是在 WASB 中產生。預設情況下,SAS 金鑰模式預期以遠端模式執行,不過,為了測試目的,可以啟用本機模式以在與 WASB 相同的處理程序中產生 SAS 金鑰。

若要啟用安全模式,需要將下列屬性設定為 true。

<property>
  <name>fs.azure.secure.mode</name>
  <value>true</value>
</property>

若要啟用 SAS 金鑰產生,需要將下列屬性設定為 true。

<property>
  <name>fs.azure.local.sas.key.mode</name>
  <value>true</value>
</property>

若要使用遠端 SAS 金鑰產生模式,則預期以逗號分隔的外部 REST 服務會提供所需的 SAS 金鑰。下列屬性可提供遠端 SAS 金鑰產生的終端點

<property>
  <name>fs.azure.cred.service.urls</name>
  <value>{URL}</value>
</property>

預期遠端服務會提供支援兩個 REST 呼叫 {URL}/GET_CONTAINER_SAS{URL}/GET_RELATIVE_BLOB_SAS,以產生容器和相對 blob sas 金鑰。範例要求

{URL}/GET_CONTAINER_SAS?storage_account=<account_name>&container=<container>&sas_expiry=<expiry period>&delegation_token=<delegation token> {URL}/GET_CONTAINER_SAS?storage_account=<account_name>&container=<container>&relative_path=<relative path>&sas_expiry=<expiry period>&delegation_token=<delegation token>

預期服務會以 JSON 格式傳回回應

{
  "responseCode" : 0 or non-zero <int>,
  "responseMessage" : relavant message on failure <String>,
  "sasKey" : Requested SAS Key <String>
}

WASB 中的授權支援

可以使用下列組態在 WASB 中啟用授權支援

<property>
  <name>fs.azure.authorization</name>
  <value>true</value>
</property>

目前的授權實作仰賴外部服務的存在,該服務可以強制執行授權。預期服務會在下列組態提供的以逗號分隔的 URL 上執行。

<property>
  <name>fs.azure.authorization.remote.service.urls</name>
  <value>{URL}</value>
</property>

預期遠端服務會提供支援下列 REST 呼叫:{URL}/CHECK_AUTHORIZATION 範例要求:{URL}/CHECK_AUTHORIZATION?wasb_absolute_path=<absolute_path>&operation_type=<operation type>&delegation_token=<delegation token>

預期服務會以 JSON 格式傳回回應

{
    "responseCode" : 0 or non-zero <int>,
    "responseMessage" : relevant message on failure <String>,
    "authorizationResult" : true/false <boolean>
}

WASB 中的委派權杖支援

可以使用下列組態在 WASB 中啟用委派權杖支援

<property>
  <name>fs.azure.enable.kerberos.support</name>
  <value>true</value>
</property>

目前的委派權杖實作仰賴外部服務執行個體的存在,該服務可以產生和管理委派權杖。預期服務會在下列組態提供的以逗號分隔的 URL 上執行。

<property>
  <name>fs.azure.delegation.token.service.urls</name>
  <value>{URL}</value>
</property>

預期遠端服務會提供支援下列 REST 呼叫:{URL}?op=GETDELEGATIONTOKEN{URL}?op=RENEWDELEGATIONTOKEN{URL}?op=CANCELDELEGATIONTOKEN 範例要求:{URL}?op=GETDELEGATIONTOKEN&renewer=<renewer> {URL}?op=RENEWDELEGATIONTOKEN&token=<delegation token> {URL}?op=CANCELDELEGATIONTOKEN&token=<delegation token>

預期服務會以 JSON 格式傳回 GETDELEGATIONTOKEN 要求的回應

{
    "Token" : {
        "urlString": URL string of delegation token.
    }
}

在 WASB 中啟用授權時,chown 行為

在啟用授權時,只有下列組態中列出的使用者可以變更 WASB 中檔案/資料夾的所有者使用者。組態值會採用允許執行 chown 的使用者名稱的以逗號分隔的清單。

<property>
  <name>fs.azure.chown.allowed.userlist</name>
  <value>user1,user2</value>
</property>

在 WASB 中啟用授權時的 chmod 行為

當授權已啟用時,只有擁有者和下列組態中所列的使用者才能變更 WASB 中檔案/資料夾的權限。組態值會取得允許執行 chmod 的使用者名稱的逗號分隔清單。

<property>
  <name>fs.azure.daemon.userlist</name>
  <value>user1,user2</value>
</property>
<property>
  <name>fs.azure.chmod.allowed.userlist</name>
  <value>userA,userB</value>
</property>

可以使用下列設定啟用 SAS 金鑰和授權回應的快取:快取設定僅在啟用 fs.azure.authorization 時適用。快取會在檔案系統物件層級中維護。

    <property>
      <name>fs.azure.authorization.caching.enable</name>
      <value>true</value>
    </property>

可以使用下列設定自訂快取可以容納的最大項目數目

    <property>
      <name>fs.azure.authorization.caching.maxentries</name>
      <value>512</value>
    </property>

可以使用下列設定控制授權快取項目的有效性:將值設定為零會停用授權快取。如果未指定金鑰,則預設過期時間為 5m 會生效。

   <property>
     <name>fs.azure.authorization.cacheentry.expiry.period</name>
     <value>5m</value>
   </property>

可以使用下列設定控制 SASKey 快取項目的有效性。將值設定為零會停用 SASKey 快取。如果未指定金鑰,則會生效 sas 金鑰要求中指定的預設過期時間。

   <property>
     <name>fs.azure.saskey.cacheentry.expiry.period</name>
     <value>90d</value>
   </property>

使用容器 saskey 存取容器中的所有 blob。啟用此設定時,不會使用特定 blob 的 saskey。與特定 blob 的 saskey 相比,此設定提供更好的效能。

   <property>
     <name>fs.azure.saskey.usecontainersaskeyforallaccess</name>
     <value>true</value>
   </property>

效能最佳化組態

fs.azure.block.blob.buffered.pread.disable:預設情況下,位置讀取 API 會在輸入串流上執行搜尋和讀取。此讀取會填滿 BlockBlobInputStream 中的緩衝快取。如果此組態為 true,它會略過緩衝區的使用,並執行鎖定免費呼叫以從 blob 讀取。此最佳化對於 HBase 類型的短亂數讀取透過共用 InputStream 執行個體非常有幫助。注意:這不是可以在叢集層級設定的組態。它可以用作 FutureDataInputStreamBuilder 的選項。請參閱 FileSystem#openFile(Path path)

進一步閱讀