7

Hadoop 0.20.2 を使用していますが、可能であれば -cat シェル コマンドを使用して 2 つのファイルを 1 つに連結したいと考えています (ソース: http://hadoop.apache.org/common/docs/r0.19.2/hdfs_shell.html ) 。

これが私が提出しているコマンドです(名前は変更されています):

**/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 が返されます: /user/username/folder/outputdirectory/: No such file or directory

また、そのディレクトリを作成してから再度実行しようとしましたが、「そのようなファイルまたはディレクトリはありません」というエラーが引き続き表示されます。

また、-cpコマンドを使用して両方を新しいフォルダーにコピーし、-getmergeを使用してそれらを結合しようとしましたが、getmergeでもうまくいきません。

これを Hadoop で行う理由は、ファイルが巨大であり、Hadoop の外部でダウンロード、マージ、および再アップロードするのに長い時間がかかるためです。

4

2 に答える 2

10

このエラーは、コマンドの標準出力を 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

-getmergeHDFS ではなく、ローカル ファイル システムにも出力します。

残念ながら、ファイルを 1 つのマシンにコピーすることなく、複数のファイルを 1 つにマージする効率的な方法はありません (Hadoop の「追加」を調べたい場合を除きますが、Hadoop のバージョンでは、デフォルトで無効になっており、バグが発生する可能性があります)。それから HDFS に戻ります。

  • 単一のレデューサーと、ファイルの順序を保持するカスタム マッパー レデューサーを使用したカスタム マップ リデュース ジョブ (各行はキーによってソートされるため、キーは入力ファイル名と行番号の組み合わせである必要があります。値は行自体になります)
  • ネットワーク トポロジに応じて、FsShell コマンドを使用します。つまり、クライアント コンソールからデータノードへの接続速度は良好ですか? これは確かにあなたの労力を最小限に抑え、同じことを行う MR ジョブよりもおそらく速く完了します (とにかくすべてを 1 台のマシンに送信する必要があるため、なぜローカル コンソールにしないのでしょうか?)
于 2012-05-15T21:06:42.603 に答える
6

フォルダ内のすべてのファイルを出力ファイルに連結するには:

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

hdfs に複数のフォルダーがあり、それらのフォルダーごとにファイルを連結する場合は、シェル スクリプトを使用してこれを行うことができます。(注:これはあまり効果的ではなく、遅くなる可能性があります)

構文 :

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 の出力ファイルに分類します。

于 2014-11-03T19:17:14.477 に答える