簡體   English   中英

具有混合輸出端點的 Mapreduce 作業:S3 和 HDFS

[英]Mapreduce job with mixed output endpoints: S3 and HDFS

我有一個在 EMR 中運行的 MR 作業,它當前在 S3 中存儲輸出。 reducer 的輸出將是同一映射器的輸入(想想身份映射器),我希望盡可能快地執行連續運行,而不是等待 EMR 寫入 S3,然后在“x”分鍾后調度映射器讀取數據。 寫入和讀取 S3 需要很長時間(~3--5 分鍾),所以我想知道是否有辦法避免在連續運行時從 S3 讀取?

此外,我需要將 mapreduce 作業的輸出寫入 S3,因為該數據對我很重要並且需要保留。 但是,對於每個連續的 MR 運行,我不想從 S3 讀取,而是可以將其寫入 HDFS(或緩存),然后將其用作下一次運行的輸入?

MultipleOutputs - 幫助將數據輸出到文件夾中的多個文件或寫入多個文件夾。 請參閱 - 將輸出寫入不同的文件夾 hadoop

我如何擴展這個概念以寫入兩個不同的端點 - S3 和 HDFS?

根據您的問題,假設您想在第一個作業中從 S3 讀取輸入數據,使用一個或幾個系列的中間 MapReduce 作業執行計算,這些作業將數據讀/寫到 HDFS,最后一個作業寫入 S3。

您可以根據您的實現從不同的端點(S3 或 HDFS)讀取數據並將數據寫入。

如果您沒有為 MapReduce 作業中的輸入/輸出路徑指定方案,則默認為 HDFS。 但是,您也可以使用前綴 hdfs:// 為 Hadoop 分布式文件系統和 s3:// 為 Amazon S3 存儲桶指定路徑的 URI 方案。 您可以根據需要使用 s3n://、s3a:// 和 s3://。 有關 s3 存儲桶的更多信息,請參閱此鏈接: 從技術上講,s3n、s3a 和 s3 之間有什么區別?

無論 MapReduce 作業的輸入/輸出端點如何,我們都可以使用 FileSystem 類通過將 java.net.URI 和 org.apache.hadoop.conf.Configuration 類作為參數傳遞來創建對象。 請參考下面的偽代碼:

FileSystem fileSystem = FileSystem.get(new URI(""), configuration);

現在,在您的驅動程序代碼中,如果您的作業僅使用一個端點,則只需創建一個 fileSystem 對象,如果您有兩個不同的端點,則可以為輸入和輸出創建兩個 fileSystem 對象。 您可以根據需要使用 fileSystem 對象執行任何類型的操作。

如果您有多個按上述設計的 MapReduce 作業,您可以使用這些命令按照您想要的順序調用這些作業"hadoop jar jar_name main_class input_path output_path" ,或者只是一個 Oozie 工作流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM