2016-06-13 3 views
2

У меня есть 3 стола в Кассандре, сгруппированные в несколько узлов, искровые рабочие сидят сверху каждого из них. Позволяет называть эти таблицы A, B и C.Cassandra Spark Datastax Replica

A и B огромны, но они имеют один и тот же ключ раздела, так что область данных сохраняется, когда я соединяю их вместе.

Теперь я хочу присоединиться к другой таблице C, у которой есть другой ключ раздела, но не такой большой, как два других. Я также готов реплицировать таблицу на все мои узлы, если нужно.

Как я могу объединить их вместе, сохраняя данные с минимальным тасованием?

ответ

1

Как вы упомянули, третья таблица не имеет того же ключа раздела, что и другие таблицы, поэтому вы не можете быть уверены, что все данные будут находиться на одном узле.

Это означает, что у вас есть два варианта, вы можете использовать sparkContext.broadcast на своем третьем RDD, чтобы выполнить map side join на других RDD. Этот параметр не вызывает перетасовку, потому что широковещательная RDD «реплицируется» на всех компьютерах вашего кластера, одна вещь, которую вы должны проверить, заключается в том, что вы не транслируете гигантский RDD (гигантским я имею в виду несколько гигабайт, даже если Я не нашел никаких доказательств того, что вещательные такие RDD являются злом)

другой вариант использует HashPartitioner on a parent RDD, эта опция позволяет вам быть более гибкими, чем карта односторонняя присоединиться, потому что вы можете использовать rightOuterJoin или leftOuterJoin из искрового API , Однако вам нужно сопоставить все ваши RDD с родительским RDD, и вам нужно знать, сколько разделов вы должны использовать, чтобы получить максимальную производительность в ваших транзакциях, из моего опыта я обычно занимаю около 128 МБ на раздел, но ничего больше эффективнее, чем тестировать его самостоятельно, потому что все зависит от вашего варианта использования.

+0

Спасибо, я решил пойти с трансляцией, так как данные не такие огромные. Мне жаль, что у меня нет ответа на 15 человек. – daviddecoding

Смежные вопросы