我有多個文本文件。 它們的總大小超過了我可用的最大磁盤大小(〜1.5TB)將多個文本文件連接成HDFS中的一個非常大的文件
一個spark程序從HDFS中讀取單個輸入文本文件。所以我需要將這些文件合併爲一個。 (我不能重寫程序代碼,我只給* .jar文件執行)
HDFS是否有這樣的能力?我怎樣才能做到這一點?
我有多個文本文件。 它們的總大小超過了我可用的最大磁盤大小(〜1.5TB)將多個文本文件連接成HDFS中的一個非常大的文件
一個spark程序從HDFS中讀取單個輸入文本文件。所以我需要將這些文件合併爲一個。 (我不能重寫程序代碼,我只給* .jar文件執行)
HDFS是否有這樣的能力?我怎樣才能做到這一點?
我從你的問題中瞭解到你想要將多個文件連接成一個。這是一個解決方案,它可能不是最有效的方法,但它的工作原理。假設你有兩個文件:file1
和file2
,你想得到一個組合文件ConcatenatedFile
。這裏是腳本。
hadoop fs -cat /hadoop/path/to/file/file1.txt /hadoop/path/to/file/file2.txt | hadoop fs -put - /hadoop/path/to/file/Concatenate_file_Folder/ConcatenateFile.txt
希望這會有所幫助。
HDFS本身不提供這樣的功能。所有開箱即用的功能(如管道hdfs dfs -text *
或FileUtil的複製方法)使用您的客戶端服務器傳輸所有數據。
根據我的經驗,我們總是使用自己編寫的MapReduce作業以分佈的方式合併HDFS中的許多小文件。
所以,你有兩種解決方案:
關於解決方案#2:有一個簡單的項目FileCrush用於組合HDFS中的文本或序列文件。它可能適合你,請檢查它。用法
例子:
hadoop jar filecrush-2.0-SNAPSHOT.jar crush.Crush -Ddfs.block.size=134217728 \
--input-format=text \
--output-format=text \
--compress=none \
/input/dir /output/dir 20161228161647
我只好不使用這些選項(尤其是-Ddfs.block.size和輸出文件的日期前綴20161228161647)運行所以一定要正確運行的問題。
你可以做豬的工作:
A = LOAD '/path/to/inputFiles' as (SCHEMA);
STORE A into '/path/to/outputFile';
做一個HDFS貓,然後把它回到HDFS的手段,所有這些數據在客戶端節點處理,並會發生降解網絡