S3 DistCp (S3-潛入高分析度) - Amazon EMR

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

S3 DistCp (S3-潛入高分析度)

Apache DistCp 是一種開放原始碼工具,可用來複製大量資料。S3 類似DistCp於 DistCp,但優化了使用 AWS,特別是 Amazon S3。Amazon 4.0 及更高EMR版本DistCp 中 S3 的命令是s3-dist-cp,您可以在叢集或命令列中新增為步驟。使用 S3DistCp,您可以有效地將大量資料從 Amazon S3 複製HDFS到 Amazon EMR 叢集中的後續步驟可處理資料的位置。您也可以使用 S3 DistCp 在 Amazon S3 儲存貯體之間複製資料,或從 HDFS Amazon S3 複製資料。S3 DistCp 在儲存貯體和各個 AWS 帳戶之間 parallel 複製大量物件時,具有更高的可擴展性和效率。

如需展示 S3DISCp 在真實世界案例中彈性的特定命令,請參閱 AWS 大數據部落格DistCp上的七個使用 S3 秘訣

就像 DistCp,S3 DistCp 使用 MapReduce 以分佈式方式進行複製。它會跨多個伺服器分享複本、處理錯誤、進行復原,以及回報任務。如需有關 Apache DistCp 開放原始碼專案的詳細資訊,請參閱 Apache Hadoop 文件中的DistCp指南

如果 S3 DistCp 無法複製部分或全部指定的檔案,叢集步驟會失敗,並傳回非零錯誤碼。如果發生這種情況,S3 DistCp 不會清除部分複製的檔案。

重要

S3 DistCp 不支援包含底線字元的 Amazon S3 儲存貯體名稱。

S3 DistCp 不支持拼接文件的串聯。請改為 PySpark 使用。有關更多信息,請參閱在 Amazon EMR 中連接實木複合地板文件

若要避免在使用 S3DISCp 將單一檔案 (而非目錄) 從 S3 複製到時發生錯誤HDFS,請使用 Amazon 5.33.0 或更新EMR版本或 Amazon EMR 6.3.0 或更新版本。

S3 DistCp 選項

雖然與 S3 類似 DistCp,但DistCp 支援一組不同的選項來變更複製和壓縮資料的方式。

當您呼叫 S3 時DistCp,您可以指定下表所述的選項。這些選項會透過引數清單加入步驟中。S3 DistCp 引數的範例如下表所示。

選項 描述 必要
‑‑src=LOCATION

複製資料的位置。這可以是一個HDFS或 Amazon S3 位置。

範例:‑‑src=s3://amzn-s3-demo-bucket1/logs/j-3GYXXXXXX9IOJ/node

重要

S3 DistCp 不支援包含底線字元的 Amazon S3 儲存貯體名稱。

‑‑dest=LOCATION

資料的目的地。這可以是一個HDFS或 Amazon S3 位置。

範例:‑‑dest=hdfs:///output

重要

S3 DistCp 不支援包含底線字元的 Amazon S3 儲存貯體名稱。

‑‑srcPattern=PATTERN

規則運算式,能夠篩選以 ‑‑src 資料子集為目標的複製操作。若並未指定 ‑‑srcPattern‑‑groupBy‑‑src 的所有資料均會複製到 ‑‑dest

若規則表達式引數含有星號 (*) 等特殊字元,則需將規則表達式或整個 ‑‑args 字串以單引號 (') 括起來。

範例:‑‑srcPattern=.*daemons.*-hadoop-.*

‑‑groupBy=PATTERN

DistCp 使 S3 連接符合運算式的檔案的規則運算式。舉例而言,您可以使用此選項將所有在一小時內寫入的記錄檔結合成單個檔案。串連的檔案名稱是與分組用的規則表達式相符的該值。

括號代表檔案的分組方式,所有與括號中的陳述相符的項目均會結合成同一個輸出檔案。如果規則運算式不包含括號陳述式,叢集會在 S3 DistCp 步驟失敗並傳回錯誤。

若規則表達式引數含有星號 (*) 等特殊字元,則需將規則表達式或整個 ‑‑args 字串以單引號 (') 括起來。

指定 ‑‑groupBy 時,僅會複製符合指定模式的檔案。不需要同時指定 ‑‑groupBy‑‑srcPattern

範例:‑‑groupBy=.*subnetid.*([0-9]+-[0-9]+-[0-9]+-[0-9]+).*

‑‑targetSize=SIZE

根據 ‑‑groupBy 選項建立檔案大小,單位為 mebibytes (MiB)。該值必須為整數。設‑‑targetSize定後,S3 會DistCp 嘗試符合此大小;複製檔案的實際大小可能會大於或小於此值。根據資料檔案大小彙總的作業,因此目標檔案大小可能會與來源資料檔案大小相符。

若由 ‑‑groupBy 串連的檔案大於 ‑‑targetSize 的值,會將檔案分解為多個分割檔,並按順序在名稱結尾加上數字編號。舉例而言,串連為 myfile.gz 的檔案會分割為:myfile0.gzmyfile1.gz 等。

範例:‑‑targetSize=2

‑‑appendToLastFile

指定 S3 從 Amazon S3 複製DistCp 到已存在的檔案時HDFS的行為。會將新的檔案資料附加到既有檔案中。如果使用 ‑‑appendToLastFile 搭配 ‑‑groupBy,新資料會附加到符合相同群組的檔案上。搭配 ‑‑targetSize 使用時,此操作也會遵守 ‑‑groupBy. 的行為

‑‑outputCodec=CODEC

指定要用複製檔案的壓縮代碼。可能會使用到這些值:gzipgzlzosnappynone。例如,您可以使用此選項將以 Gzip 壓縮的輸入檔案轉換為具有LZO壓縮功能的輸出檔案,或將檔案解壓縮為複製作業的一部分。若選擇了輸出代碼,檔案名稱會附加上合適的副檔名 (例如 gzgzip 的副檔名為 .gz)。若不指定 ‑‑outputCodec 的值,將檔案複製過去時就不會變更壓縮方式。

範例:‑‑outputCodec=lzo

‑‑s3ServerSideEncryption

確保使用 Amazon S3 中的目標資料傳輸,SSL並使用 AWS 服務端金鑰自動加密。使用 S3 擷取資料時DistCp,物件會自動取消加密。如果嘗試將未加密的物件複製到需要加密的 Amazon S3 儲存貯體,複製操作會失敗。如需詳細資訊,請參閱使用資料加密

範例:‑‑s3ServerSideEncryption

‑‑deleteOnSuccess

如果複製作業成功,此選項會導致 S3 DistCp 從來源位置刪除複製的檔案。若是要將記錄檔這類輸出檔案當做排程任務處理,從一個位置複製到另個位置,且您不想重複複製相同的檔案,此功能便相當實用。

範例:‑‑deleteOnSuccess

‑‑disableMultipartUpload

停用分段上傳。

範例:‑‑disableMultipartUpload

‑‑multipartUploadChunkSize=SIZE

Amazon S3 分段上傳中每個部分的大小 (MiB)。S3 DistCp 會在multipartUploadChunkSize複製大於. 若要提高作業效能,您可以增加每個部分的大小。預設大小為 128 MiB。

範例:‑‑multipartUploadChunkSize=1000

‑‑numberFiles

會在輸出檔案的開頭加上順序編號。數字會從 0 開始,除非由 ‑‑startingIndex 指定不同的值。

範例:‑‑numberFiles

‑‑startingIndex=INDEX

搭配 ‑‑numberFiles 使用,以指令序列中的第一個編號。

範例:‑‑startingIndex=1

‑‑outputManifest=FILENAME

創建一個文本文件,用 Gzip 壓縮,其中包含 S3 DistCp 複製的所有文件的列表。

範例:‑‑outputManifest=manifest-1.gz

‑‑previousManifest=PATH

讀取上次DistCp 使用‑‑outputManifest旗標呼叫 S3 期間建立的資訊清單檔案。設定‑‑previousManifest旗標後,S3 會將資訊清單中列出的檔案從複製作業中DistCp 排除。若與 ‑‑outputManifest 一起指定 ‑‑previousManifest,列在之前的資料清單中的檔案也匯出現在新的資訊清單檔案中,但不會複製檔案。

範例:‑‑previousManifest=/usr/bin/manifest-1.gz

‑‑requirePreviousManifest

需要先前呼叫 S3 期間建立的資訊清單DistCp。若設定為 false,未指定先前的資訊清單,也不會產生任何錯誤。預設值為 true。

‑‑copyFromManifest

反轉的行為,使 S3 ‑‑previousManifest DistCp 使用指定的資訊清單檔案做為要複製的檔案清單,而不是要從複製中排除的檔案清單。

範例:‑‑copyFromManifest ‑‑previousManifest=/usr/bin/manifest-1.gz

‑‑s3Endpoint=ENDPOINT

指定上傳檔案時要使用的 Amazon S3 端點。此選項會設定來源和目的地兩邊的端點。若未設定,預設端點則為 s3.amazonaws.com。如需 Amazon S3 端點的清單,請參閱區域與端點

範例:‑‑s3Endpoint=s3.eu-west-1.amazonaws.com

‑‑storageClass=CLASS

目的地是 Amazon S3 時所用的儲存類別。有效值為STANDARD和 REDUCED _ REDUNDANCY。如果未指定此選項,S3 DistCp 會嘗試保留儲存類別。

範例:‑‑storageClass=STANDARD

‑‑srcPrefixesFile=PATH

Amazon S3 (s3://)、(hdfs:///) 或本機檔案系統 HDFS (file:/) 中的文字檔案,其中包含前置詞清單,每行src一個前置詞。

如果srcPrefixesFile有提供,S3 DistCp 將不會列出 src 路徑。反之會產生一份來源清單做為合併的結果,其中列出此檔案中指定的所有字首。會使用相對於 src 路徑的相對路徑來產生目的地路徑,而非這些字首。若也有指定 srcPattern,會將之套用到來源字首的合併清單結果,以進一步篩選輸入結果。若有使用 copyFromManifest,則會複製資訊清單中的物件,並略過 srcPrefixesFile

範例:‑‑srcPrefixesFile=PATH

除了上述選項之外,S3 還DistCp 實現了 Tool 接口,這意味著它支持通用選項。

將 S3 新增DistCp 為叢集中的步驟

您可以將 S3 新DistCp 增為叢集中的步驟來呼叫 S3。您可以在啟動時將步驟新增至叢集,或使用主控台、CLI或新增至執行中的叢集API。下列範例示範將 S3 DistCp 步驟新增至執行中的叢集。如需新增步驟至叢集的詳細資訊,請參閱 Amazon EMR 管理指南的將工作提交至叢集

若要使用將 S3 DistCp 步驟新增至執行中的叢集 AWS CLI

如需有關使用中 Amazon 命EMR令的詳細資訊 AWS CLI,請參閱《命AWS CLI 令參考》。

  • 若要將步驟新增至呼叫 S3 的叢集DistCp,請傳遞指定 S3 DistCp 應如何以引數形式執行複製操作的參數。

    下列範例會將常駐程式日誌從 Amazon S3 複製到 hdfs:///output。在下列命令中:

    • ‑‑cluster-id 指定了叢集

    • Jar是 S3 DistCp JAR 檔案的位置。如需如何使用 command-runner.jar 在叢集上執行命令的範例,請參閱提交自訂JAR步驟以執行指令碼或命令

    • Args是要傳入 S3 的選項名稱-值對的逗號分隔清單。DistCp如需可用選項的完整清單,請參閱 S3 DistCp 選項

    若要將 S3 DistCp 複製步驟新增至執行中的叢集,請將以下內容放入JSON儲存在 Amazon S3 或本機檔案系統中的檔案中,如本範例所示。myStep.jsonReplace (取代) j-3GYXXXXXX9IOK 使用您的群集 ID 並替換 mybucket 使用您的 Amazon S3 存儲桶名稱。

    [ { "Name":"S3DistCp step", "Args":["s3-dist-cp","‑‑s3Endpoint=s3.amazonaws.com","‑‑src=s3://mybucket/logs/j-3GYXXXXXX9IOJ/node/","‑‑dest=hdfs:///output","‑‑srcPattern=.*[a-zA-Z,]+"], "ActionOnFailure":"CONTINUE", "Type":"CUSTOM_JAR", "Jar":"command-runner.jar" } ]
    aws emr add-steps ‑‑cluster-id j-3GYXXXXXX9IOK ‑‑steps file://./myStep.json
範例 將日誌檔從 Amazon S3 複製到 HDFS

此範例也說明如何將存放在 Amazon S3 儲存貯體的日誌檔案複製到HDFS執行中的叢集中。在此範例中,‑‑srcPattern 選項適用於限制複製到精靈記錄檔的資料。

若要將日誌檔從 Amazon S3 複製到HDFS使用‑‑srcPattern選項,請將以下內容放入儲存在 Amazon S3 或本機JSON檔案系統中的檔案中,如本範例所示。myStep.jsonReplace (取代) j-3GYXXXXXX9IOK 使用您的群集 ID 並替換 mybucket 使用您的 Amazon S3 存儲桶名稱。

[ { "Name":"S3DistCp step", "Args":["s3-dist-cp","‑‑s3Endpoint=s3.amazonaws.com","‑‑src=s3://mybucket/logs/j-3GYXXXXXX9IOJ/node/","‑‑dest=hdfs:///output","‑‑srcPattern=.*daemons.*-hadoop-.*"], "ActionOnFailure":"CONTINUE", "Type":"CUSTOM_JAR", "Jar":"command-runner.jar" } ]