簡體   English   中英

Hadoop-使用Java將reducer輸出合並到單個文件

[英]Hadoop - Merge reducer outputs to a single file using Java

我有一個豬腳本,可以將一些輸出生成到HDFS目錄。 pig腳本還會在同一HDFS目錄中生成SUCCESS文件。 Pig腳本的輸出分為多個部分,因為通過'SET default_parallel n;'定義了該腳本中使用的reduce數量。

我現在想使用Java將所有文件部分串聯/合並到一個文件中。 我顯然想在連接時忽略SUCCESS文件。 如何用Java做到這一點?

提前致謝。

您可以通過shell命令使用getmerge將多個文件合並為單個文件。

Usage: hdfs dfs -getmerge <srcdir> <destinationdir/file.txt>

Example: hdfs dfs -getmerge /output/dir/on/hdfs/ /desired/local/output/file.txt

如果您不想使用shell命令來執行此操作。 您可以編寫一個Java程序,並可以使用FileUtil.copyMerge方法將輸出文件合並為單個文件。 實施細節可在此鏈接中找到

如果您希望通過Pig在hdfs本身上提供單個輸出,則需要將其通過單個reducer傳遞。 您需要設置減速器1的數量。 您需要在腳本的開頭放置以下行。

--Assigning only one reducer in order to generate only one output file.
SET default_parallel 1;

我希望這能幫到您。

這樣做似乎不容易的原因通常是沒有什么目的。 如果我有一個非常大的集群,而我確實在處理大數據問題,那么我的輸出文件作為單個文件可能無法放在任何一台計算機上。

話雖如此,我可以看到使用指標集合,也許您只想輸出一些有關數據的指標,例如計數。

在那種情況下,我將先運行您的MapReduce程序,然后創建一個讀取數據的第二個map / reduce作業,並通過在您的reduce函數中使用靜態鍵將所有元素簡化為單個相同的reducer。

或者您也可以通過Job.setNumberOfReducer(1);在原始程序中使用單個映射器Job.setNumberOfReducer(1);

暫無
暫無

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

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