入力データが次のようになる状況があります。
AA1
AA2
AA3
AA4
BB1
BB2
BB3
CC1
CC2
CC3
CC4
CC5
CC6
私がやりたいのは、データをInputSplitsに分割することです。各分割は、特定の先頭文字で始まる文字列のセクションをカバーします。たとえば、最初の入力分割は「AA」で始まるすべての文字列であり、2番目の分割は「BB」で始まる文字列などです。
リデュースフェーズが正しく動作するためには、データをそのようにまとめる必要があるため、この方法で実行したいと思います。
これまで私が遊んでいたのは、これを行うための独自のクラスInputFormat
とRecordReader
クラスを作成することですが、いくつかの例(http://developer.yahoo.com/hadoop/tutorial/module5.html#fileformat)で分割されていることがわかります。読者がそれらに到達するまでにすでに作成されています。スプリットがストリング間の境界に正しく整列しないという危険に遭遇すると思います。
これを完全に機能させるには、独自のバージョンのInputFormat
getSplits
関数を実装する必要がありますか?これを行うと、マシンの局所性を利用しない方法でスプリットをマシン間で分散するリスクがありますか?最後に、これに対する一般的なより良い方法はありますか?
どんな助けでも大歓迎です。ありがとう、
mj
編集0
何人かのコメンテーターのリクエストに応じて、より多くの情報を含めています。
私のプログラムの目的は、グループに属する文字列を比較して、それらの文字列間の重複を見つけ、どの文字列がその重複を共有するかを記録することです。次の例を考えてみましょう。
AAAA
AAAB
AAAC
AAB
BAAA
最初に「A」を共有するすべての文字列には、それらの間で共通するいくつかの重複があります。「B」で始まるものは明らかにそうではありません。特定の重複が何であるかを実際に発見し、それらのグループを構築することになると、「AAAA」を見ている場合、「BAAA」までずっと比較する必要があります。私の懸念は、InputSplitsがデータを切り刻んで、特定の文字列が比較されないようにし、グループが欠落しているか不完全になることです。Mapステップ(またはデータの読み取り)を使用して問題をこれらのグループに分割し、Reduceステップでグループを計算して結果を返すことを望んでいました。
私はこのような何百万ものストリングを持っています、そしてそれは単一のマシンで時間がかかります。プロセスを合理化し、高速に実行するために、論理的に大量の「トリック」を実装しました。私は、Hadoopが介入して支援し、さらに高速化できることを望んでいました。
ジョーK-あなたの質問に答えるために、私はすべての文字列間の重複の程度を知りません。オーバーラップは異なる場合があります。たとえば、AA1はAA4全体で2文字をオーバーラップできますが、AB5が存在する場合は、1文字のみがオーバーラップします。文字列の長さは大きく異なる可能性があるため、他のインスタンスでは大きなオーバーラップが発生する可能性があります。また、オーバーラップが正確に何であるかを検出することは、私がリデュースフェーズでやりたかったことです。それが私の全体の目的でした。
シャッフル/ソートフェーズで隣接するストリングが同じレデューサーに正しく分配されるかどうか、またはブレークがあるかどうかはわかりません。残念ながら、このプロセスについての私の無知は、私をここにつまずかせています。
編集0終了