4

map-reduce 機能を実現するために yelps MRJob ライブラリを使用しています。map reduce には、キーに基づいて値をソートする内部ソートおよびシャッフル アルゴリズムがあることを知っています。したがって、マップフェーズの後に次の結果が得られた場合

(1, 24) (4, 25) (3, 26)

ソートとシャッフルのフェーズで次の出力が生成されることはわかっています

(1, 24) (3, 26) (4, 25)

どっちが予想通り

しかし、2 つの類似したキーと異なる値がある場合、並べ替えとシャッフル フェーズで最初に表示される値に基づいてデータが並べ替えられるのはなぜですか?

たとえば、マッパーから次の値のリストがある場合

(2, <25, 26>) (1, <24, 23>) (1, <23, 24>) 

期待される出力は

(1, <24, 23>) (1, <23, 24>) (2, <25, 26>)

しかし、私が得ている出力は

(1, <23, 24>) (1, <24, 23>) (2, <25, 26>)

この MRjob ライブラリ固有のものですか? 値に基づいてこのソートを停止する方法はありますか??

コード

from mrjob.job import MRJob
import math

class SortMR(MRJob):



def steps(self):
    return [
        self.mr(mapper=self.rangemr,
                reducer=self.rangesort)]


def rangemr(self, key, line):
    for a in line.split():
        yield 1,a


def rangesort(self,numid,line):
    for a in line:
        yield(1, a)


if __name__ == '__main__':
    SortMR.run()
4

4 に答える 4

4

値を「ソート」する唯一の方法は、値自体からの情報を含む複合キーを使用することです。キーの compareTo メソッドは、キーが最初に実際のキー コンポーネントでソートされ、次に値コンポーネントでソートされることを保証できます。最後に、reducer で同じ「キー」コンポーネント (実際のキー) を持つすべてのキーが等しいと見なされ、関連付けられた値が reduce メソッドへの 1 回の呼び出しで繰り返されるようにするために、グループ パーティショナーが必要になります。

これは「二次ソート」として知られており、これに似た質問で例へのリンクがいくつか提供されています。

于 2013-01-16T12:12:32.773 に答える
3

ローカル MRjob は、マッパー出力でオペレーティング システムの「並べ替え」を使用するだけです。

マッパーは次の形式で書き込みます:

key<-tab->value\n

したがって、キーは主にキーでソートされますが、次に値でソートされます。

前述のように、これは実際の Hadoop バージョンでは発生せず、'ローカル' シミュレーションだけです。

于 2013-01-22T06:38:14.013 に答える
0

Hadoop での並べ替えはキー ベースであるため、値の順序は保証されません。

于 2013-01-16T10:42:42.147 に答える
0

並べ替えとシャッフル フェーズでは、特定のキーに対してレデューサーが取得する値の順序は保証されません。

于 2013-01-16T08:33:08.840 に答える