以前に Pig と Hive を使用したことがありますが、Hadoop MapReduce は初めてです。入力として複数の小さなサイズのファイル (たとえば 10) を持つアプリケーションを作成する必要があります。これらはファイル構造が異なるため、高速に処理できるように別のノードで並列に処理したいと考えています。Hadoop の長所は大きなデータの処理であることは知っていますが、これらの入力ファイルは小さいながらも多くの処理を必要とするため、Hadoop の並列処理能力を活用したいと考えていました。これは可能ですか?
2 に答える
簡単に言うと、 を試してみてくださいNLineInputFormat
。
すべての入力ファイルをすべてのノードにコピーしても問題ありません (必要に応じて分散キャッシュに配置できます)。本当に配布したいのはチェック処理です。
Hadoop を使用すると、(filename,check2run) または (filename,format,check2run) の形式で (単一の!) 入力制御ファイルを作成し、NLineInputFormat
指定した数のチェックをノードに供給するために使用できます (mapreduce.input.lineinputformat.linespermap コントロールの数行は各マッパーに送られます)。
注: Hadoop の入力形式によって、分割の計算方法が決まります。NLineInputFormat
(とは異なりTextInputFormat
) ブロックを気にしません。
チェックの性質によっては、linespermap 値を計算して、マッパーの 1 つのウェーブですべてのファイル/チェックをカバーできる場合があります (または、このアプローチをまったく使用できない場合があります:))
可能ですが、おそらくあまり価値がありません。あなたはあなたに対してこれらの力を持っています:
混乱した入力
さまざまな入力形式をすべて処理できるマッパーを作成する必要があります (入力形式を検出するか、入力のファイル名を使用してどの形式を期待するかを決定します)。
複数の出力
Hadoop のややトリッキーな複数出力ファイル処理機能を使用するか、出力をレデューサー (または、各ファイルが異なるノードに移動することが確実な場合はマッパー) の副作用として書き込む必要があります。
初期化の高コスト
すべての Hadoop マップ削減ジョブには、かなりの初期費用がかかります。小さなクラスターでは約 30 秒、大規模なクラスターではさらに多くの費用がかかります。この点だけでも、おそらく、並列処理によって得られると期待できるよりも多くの時間を失うことになります。