2016-06-13 7 views
2

私はカサンドラに3つのテーブルをいくつかのノードにクラスタ化し、それぞれの上に座って作業をします。これらのテーブルをA、B、Cと呼ぶことができます。カサンドラスパークDatastaxレプリカ

AとBは巨大ですが、パーティションキーが同じであるため、データの局所性が維持されます。

ここで、別のパーティションキーを持つ他のテーブルCに参加したいと思いますが、他の2つほど大きなパーティションキーはありません。私はすべてのノードにテーブルを複製する準備もできています。

どのようにすれば一緒に参加でき、データの局所性を最小限のシャッフルで維持できますか?

答えて

1

あなたが言及したように、3番目のテーブルは他のテーブルと同じパーティションキーを持っていないので、すべてのデータが同じノードにあることを確認することはできません。

これは、3つ目のRDDでsparkContext.broadcastを使用して他のRDDでmap side joinを実行する2つのオプションがあることを意味します。 ブロードキャストされたRDDがクラスタ内のすべてのマシンで「複製」されるため、このオプションはシャッフルを開始しません。巨大なRDDをブロードキャストしないことを確認する必要があります(巨大な数ギガバイト私は他のオプションがHashPartitioner on a parent RDDを使用している、このようなRDDを放送の悪されている任意の証明)

を発見したことはありません、このオプションを使用すると、スパークAPIからrightOuterJoinまたはleftOuterJoinを使用することができますので、マップ両面が参加するよりも、より柔軟にすることができます。しかし、すべてのRDDを親RDDにマッピングする必要があります。私の経験から、通常はパーティションあたり約128 Mbの容量を維持しながら、結合操作で最高のパフォーマンスを得るために使用するパーティションの数を知っておく必要があります。すべてがあなたのユースケースに依存するため、あなた自身でテストするよりも効率的です。

+0

データはあまり巨大ではないので、私は放送に行くことを選んだ。私はあなたの答えをupvoteする15人の担当者を持っていません、申し訳ありません。 – daviddecoding

関連する問題