3

興味深いのですが、MapReduce や Hadoop などでは、データのチャンクを独立して操作されるタスクにどのように分割するのでしょうか? タスク間の状態条件などと非常に相互に関連しているデータを持つことが一般的であることを考えると、それがどのようになるか想像するのに苦労しています.

4

1 に答える 1

0

データが関連している場合、情報が確実に伝わるようにするのはあなたの仕事です。MapReduce は、(実装されていない) リレーションに関係なく、データを分割して処理します。

Map は、入力ファイルからブロック単位でデータを読み取り、一度に 1 つの「レコード」ずつマップ関数に渡します。デフォルト レコードは行です (ただし、変更できます)。

Map 内のデータに元の注釈を付けることができますが、基本的に Map でできることは、データを分類することです。新しいキーと新しい値、および新しいキーによる MapReduce グループを発行します。したがって、異なるレコード間に関係がある場合: それらを発行するために同じ (または類似の *1) キーを選択して、それらがグループ化されるようにします。

Reduce の場合、データは分割/ソートされ (ここでグループ化が行われます)、その後、reduce 関数は 1 つのグループ (1 つのキーとそれに関連付けられたすべての値) からすべてのデータを受け取ります。これで、値を集計できます。それでおしまい。

したがって、MapReduce によって実装された全体的な group-by があります。それ以外はすべてあなたの責任です。2 つのソースからの外積が必要ですか? たとえば、人工キーとマルチ発行 (フラグメントとレプリケート結合) を導入して実装します。あなたの想像力は限界です。そして、いつでもデータを別のジョブに渡すことができます。

*1: 後でグループ化の選択に影響を与えることができるため、同様です。通常は group be identity-function ですが、これは変更できます。

于 2010-03-02T14:13:42.557 に答える