簡體   English   中英

使用hadoop在迭代作業中的每個分割的mapreduce輸入文件上附加相同的字符串(先前的結果)

[英]Append the same string (previous result) on each splitted mapreduce input file in iterative job with hadoop

我是Hadoop的新手,正在編寫迭代的MapReduce作業。

我知道,使用Hadoop時,將從大數據集開始將其拆分為小文件,然后將它們作為輸入發送到不同計算機上的mapfunction。

我只是成功地將MapReduce的結果附加在輸出文件的末尾,但是通過這種方式,通過迭代的工作,該結果將僅發送到一台機器上。

因此,我想將結果附加到發送到每台計算機的EACH分割文件中,以便任何計算機都可以看到以前的結果。

我該怎么做?

在您的Map方法中,您可以將輸出追加到一個公共HDFS文件中,而不是寫入上下文對象。 但是,如果有多個地圖任務試圖追加文件,則會出現錯誤。

解決方法:

  1. 在每次MR作業迭代之后,將輸出附加到tmp目錄中的temp文件。
  2. 將此臨時文件移動到hdfs(使用Java Hadoop filestatus API)
  3. 在下一次迭代中,將此加載到hdfs中的臨時文件添加到分布式緩存中。
  4. 從地圖任務中讀取分布式緩存文件。

如果您需要進一步的幫助,請告訴我。

更新臨時文件邏輯

 public void appendtempdate(String tempfile,String data)
 {
  try
  {
  File temp = new File(tempfile);
  if(!temp.exists())
  {
    temp.createNewFile();
  }
            FileWriter fw= new FileWriter(temp.getName(),true);
            BufferedWriter bw= new BufferedWriter(fw);
            bw.write(data);
            bw.close();
   }
    catch(Execption e)
    {
      }
    }

調用此方法並將臨時文件移至HDFS以進行分布式緩存。

暫無
暫無

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

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