2016-12-29 11 views
1

私は複数のテキストファイルを持っています。 それらの合計サイズは私にとって利用可能な最大のディスクサイズを超えています(〜1.5TB)複数のテキストファイルをHDFSの1つの非常に大きなファイルに連結

スパークプログラムはHDFSから単一の入力テキストファイルを読み込みます。だから私はそれらのファイルを1つにまとめる必要があります。 (私はプログラムコードを書き換えることはできません。実行のために* .jarファイルのみが与えられています)

HDFSにはこのような機能がありますか?どうすればこれを達成できますか?

答えて

1

あなたの質問から理解したことは、複数のファイルを1つに連結したいということです。ここでは、それを実行する最も効率的な方法ではないかもしれない解決策ですが、それは動作します。 file1file2という2つのファイルがあり、結合ファイルを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内の多数の小さなファイルを分散してマージしました。

だから、2つのソリューションを持っている:

  1. は あなたの形式でテキストファイルを結合するために、独自のシンプルなのMapReduce /スパークジョブを作成します。
  2. のような種類の目的で既に実装されているソリューションを探します。

解決策2について:HDFSにテキストファイルまたはシーケンスファイルを結合するための簡単なプロジェクトFileCrushがあります。それはあなたに適しているかもしれません。使い方の

例:

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に戻っそれを入れて、このすべてのデータがクライアントノードで処理され、ネットワーク

を分解物ます
関連する問題