Hadoopの 'チャンク' データ設定されたサイズのブロックに分割します。デフォルトは64MBブロックです。あなたのアプローチにこの問題の原因がどこにあるのかが分かります。各マッパーは、ファイルの一部のみを取得することがあります。ファイルが64MB(または設定されている値)未満の場合、各マッパーは1つのファイルしか取得しません。
私は非常に似た制約があります。私は単一のマッパーによって完全に処理されるために一連のファイル(チェーン内の以前の減速機からの出力)が必要でした。私は私の解決策の主な推進力は、処理に必要なファイル名をマッパーに提供するように設定し、マッパーに内部でファイルを読み込んだり読み込んだりすることです。これにより、単一のマッパーがファイル全体を処理することができます。ファイルの分散処理ではなく、「個々のファイルを分散させたくありません」という制約があります。 :)
は、私は私のMRは、個々のファイルに処理するファイルのファイル名を書き出す起動したプロセスを持っていました。それらのファイルが書き込まれた場所は、入力ディレクトリでした。各ファイルが< 64MBの場合、各ファイルに対して1つのマッパーが生成されます。 map
プロセスは、(ファイルに1つのエントリしかないので)正確に1回呼び出されます。
それから、マッパーに渡された値をとり、ファイルを開き、必要なマッピングを行います。 hadoopはプロセスのマップ/削減方法を賢明にしようとするので、各マッパーが単一のレデューサーに行くように、使用するレデューサーの数を指定する必要があります。これはmapred.reduce.tasks
の設定で設定できます。私は私のプロセスは魅力的なこの特定のソリューションを作ったかもしれないいくつかの追加要件/制約があったjob.setNumReduceTasks("mapred.reduce.tasks",[NUMBER OF FILES HERE]);
を経由してこれを行います。 1:1から1:1の例では、私はそれをやりました、上に基本が置かれています。
HTH
ありがとう、私はそれが最高のアイデアだと思う。おそらく私は古いAPIを扱う方が簡単かもしれないので使いますが、まずは0.20 – spooky