2016-12-29 31 views
1

我有多個文本文件。 它們的總大小超過了我可用的最大磁盤大小(〜1.5TB)將多個文本文件連接成HDFS中的一個非常大的文件

一個spark程序從HDFS中讀取單個輸入文本文件。所以我需要將這些文件合併爲一個。 (我不能重寫程序代碼,我只給* .jar文件執行)

HDFS是否有這樣的能力?我怎樣才能做到這一點?

回答

1

我從你的問題中瞭解到你想要將多個文件連接成一個。這是一個解決方案,它可能不是最有效的方法,但它的工作原理。假設你有兩個文件:file1file2,你想得到一個組合文件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 

希望這會有所幫助。

1

HDFS本身不提供這樣的功能。所有開箱即用的功能(如管道hdfs dfs -text *FileUtil的複製方法)使用您的客戶端服務器傳輸所有數據。

根據我的經驗,我們總是使用自己編寫的MapReduce作業以分佈的方式合併HDFS中的許多小文件。

所以,你有兩種解決方案:

  1. 寫自己的簡單的MapReduce /星火作業文本文件 您的格式結合。
  2. 查找已實施的此類 用途的解決方案。

關於解決方案#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)運行所以一定要正確運行的問題。

1

你可以做豬的工作:

A = LOAD '/path/to/inputFiles' as (SCHEMA); 
STORE A into '/path/to/outputFile'; 

做一個HDFS貓,然後把它回到HDFS的手段,所有這些數據在客戶端節點處理,並會發生降解網絡

相關問題