2012-05-15 36 views
4

我使用Hadoop 0.20.2合作,並希望使用-cat shell命令,如果可能的兩個文件連接成一個(來源:http://hadoop.apache.org/common/docs/r0.19.2/hdfs_shell.html如何將hadoop中的兩個文件連接成一個使用Hadoop FS shell的文件?

這裏是我提交(名稱已經更改)的命令:

**/path/path/path/hadoop-0.20.2> bin/hadoop fs -cat /user/username/folder/csv1.csv /user/username/folder/csv2.csv > /user/username/folder/outputdirectory/** 

它返回的bash:/用戶/用戶名/文件夾/輸出目錄/:沒有這樣的文件或目錄

我也嘗試創建目錄,然後重新運行它 - 我仍然有「無這樣的文件或目錄'錯誤。

我也嘗試使用-cp命令將它們複製到一個新文件夾中,並使用-getmerge將它們組合起來,但getmerge也沒有運氣。

在hadoop中這樣做的原因是這些文件非常龐大,需要很長時間才能在hadoop之外進行下載,合併和重新上傳。

回答

7

錯誤與您嘗試將命令的標準輸出重定向回HDFS相關。有很多方法可以做到這一點,利用與源參數是一個連字符的hadoop fs -put命令:

bin/hadoop fs -cat /user/username/folder/csv1.csv /user/username/folder/csv2.csv | hadoop fs -put - /user/username/folder/output.csv 

-getmerge還輸出到本地文件系統,而不是HDFS

Unforntunatley有合併沒有有效的方法多個文件合併成一個文件(除非你想查看Hadoop的'追加',但是在你的hadoop版本中,默認情況下它是被禁用的並且可能有錯誤),而不必將這些文件複製到一臺機器,然後返回到HDFS中,無論你這樣做在

  • 自定義映射減少了單個reducer和保留文件排序的自定義映射縮減器的作業(記住每行將按鍵排序,因此您的鍵需要是輸入文件名和行號的某種組合,並且價值將是線本身)
  • 通過FsShell命令,具體取決於您的網絡拓撲 - 即您的客戶端控制檯有一個很好的速度連接到datanodes?這肯定是你的一部分最小的努力,並可能完成比MR工作更快地做同樣的(因爲一切都已經去到一臺機器,無論如何,那麼爲什麼不是你的本地控制檯?)
+0

按照您的建議使用hadoop fs -put完全符合我的需要 - 它將兩個CSV連接成HDFS上的第三個文件。非常感謝你的幫助Chris! – user1397044

+0

追加支持在20.2中不可用,因爲它不包含在內。它後來被合併爲後續版本。 –

4

要連接在文件夾中的輸出文件中的所有文件:

hadoop fs -cat myfolder/* | hadoop fs -put - myfolder/output.txt 

如果您對HDFS多個文件夾,你想在每一個這些文件夾來連接文件,你可以使用一個shell腳本來做到這一點。(注意:這是不是很有效,可以很慢)

語法:

for i in `hadoop fs -ls <folder>| cut -d' ' -f19` ;do `hadoop fs -cat $i/* | suy hadoop fs -put - $i/<outputfilename>`; done 

如:

for i in `hadoop fs -ls my-job-folder | cut -d' ' -f19` ;do `hadoop fs -cat $i/* |hadoop fs -put - $i/output.csv`; done 

說明: 所以你基本上遍歷所有將文件和每個文件夾的內容轉換爲hdfs上的輸出文件。

相關問題