2012-01-26 4 views
1

構造化されたデータを含むhdtfに大きなファイルが格納されているとします。ここでの目的は、ファイル内のすべての行のように、2番目の列の値がそうであるように、ファイル内のデータの一部だけを処理することです。 hdfsがファイルの関連する部分だけをストリームし、すべてをマッパーにストリーミングするようなMRジョブを起動することは可能ですか?HDFSファイルの一部でMRジョブを実行

私が必要とする部分だけで仕事のスピードを速めたいのです。おそらく1つのアプローチは、MRジョブを実行して新しいファイルを作成することですが、それを回避できるかどうか疑問に思っていますか?

目的はHDFSにデータを保存することであり、データベースから読み書きすることは望ましくありません。

答えて

2

HDFSは、ファイルをブロック単位でまとめて格納しているため、インデックスが作成されないため、ファイルの一部だけを読み込む方法はありません(少なくともこの書き込み時)。さらに、指定されたマッパーは、ファイルの最初のブロックまたは400番目のブロックを取得する可能性があり、それを制御することはできません。

つまり、MapReduceの主なポイントは、多くのマシンに負荷を分散することです。私たちのクラスタでは、一度に最大28個のマッパを実行します(ノード4つのノードにつき7個)。したがって、入力ファイルが1 TBの場合、各マップスロットは合計ファイルの3%、つまり約30 GBまでしか読み込まれません。マッパーで必要なフィルタを実行し、関心のある行のみを処理するだけです。

実際にフィルタリングされたアクセスが必要な場合は、HBaseにデータを保存することを検討してください。 MapReduceジョブのネイティブソースとして機能し、フィルタリングされた読み込みを提供し、そのデータをHDFSに保存するので、あなたはまだ分散した世界にいます。

+1

0.92で導入されたコプロセッサは、フィルタと同様のデータをフィルタ処理するためにも使用できます。コプロセッサとフィルタの違いは何ですか。私が考えることの1つは、フィルターがクライアントで定義され、コプロセッサーがサーバー上で定義されているということです。したがって、コプロセッサはクライアント間で再利用可能です。注目すべきは、フィルタとコプロセッサの両方がサーバ上で実行され、クライアントに送信されるデータを削減することです。 –

+0

良い点Praveen。しかし、私の理解では、コプロセッサはベースHDFS M/Rではなく、ベース専用です –

+0

Chris - HBaseでベースではないのですか? MRで使用されているコプロセッサを停止させているのは何ですか?コプロセッサとフィルタの違いについて、HBaseグループにクエリを投稿しましたが、応答がありませんでした。 –

1

1つの答えは、ハイブがこの問題を解決する方法を検討しています。データはディスク上のファイルに関する実際のメタデータだけである「テーブル」にあります。 Hiveでは、テーブルが分割されている列を設定できます。あなたが持っているでしょう日付でファイルを分割しているかのように、これは、パーティションごとに別々のフォルダを作成します。日付ディレクトリの内部

/mytable/2011-12-01 
/mytable/2011-12-02 

はあなたの実際のファイルになります。したがって、次のようなクエリを実行した場合:

SELECT * FROM mytable WHERE dt ='2011-12-01' 

/mytable/2011-12-01のファイルのみがジョブに供給されます。

このような機能が必要な場合は、上位レベルの言語(ハイブ/ブタ)に移動するか、独自のソリューションを展開する必要があります。

+0

このテクニックは「パーティション化」と呼ばれています。リレーショナルデータベースでかなりの時間使用されていました。 – Olaf

0

処理コストの大部分 - MapperにKey-Valueを生成するためのデータ解析です。私たちは値(通常は)1つのjavaオブジェクトを値+各コンテナに作成します。 CPUとガベージコレクタの両方の圧力の面でコストがかかります
私は解決策を "中間に"提案します。入力ストリームを読み込んで、関連のないデータを早い段階でスキップする入力フォーマットを書くことができます(たとえば、文字列の最初のバイト数を調べるなど)。
結果として、すべてのデータを読み込みますが、実際に解析してマッパーのみの部分に渡します。
RCFile形式(または他の円柱形式)を使用し、関連するデータと関連性のないデータが異なる列に置かれることに注意してください。

0

処理するファイルのファイル名(拡張子または部分的なファイル名の一致など)に固有の属性がある場合は、FileInputFormatのsetInputPathFilterメソッドを使用して、MRジョブに必要なものすべてを無視することもできます。 Hadoopはデフォルトですべてを無視します。 "xxx "と_xxx" files/dirですが、setInputPathFilterを使用して拡張できます。

上記のように他の人が述べたように、「マッパーごとに1ブロック」のパラダイムを破るこのようなことをして、クラスメイトから次善のパフォーマンスが得られる可能性があります。少量のデータを取り扱っている場合には、時には "それを正しく行う"ためにもっと時間がかかることがあります。& HBaseを再構築したり再ダンプする時間があれば、最適に。

関連する問題