Apache Spark обрабатывает искаженные данные

У меня есть две таблицы, которые я хотел бы объединить. У одного из них очень сильный перекос данных. Это приводит к тому, что моя искровая работа не выполняется параллельно, поскольку большая часть работы выполняется в одном разделе.

Я слышал, читал и пытался реализовать свои ключи для увеличения распространения. https://www.youtube.com/watch?v=WyfHUNnMutg в 12:45 секунд - это именно то, что я хотел бы сделать.

Любая помощь или советы будут оценены. Спасибо!


person John Engelhart    schedule 15.08.2016    source источник


Ответы (1)


Да, вы должны использовать соленые ключи в большей таблице (через рандомизацию), а затем реплицировать меньший / декартово присоединить его к новому соленому:

Вот пара предложений:

Tresata skew присоединиться к RDD https://github.com/tresata/spark-skewjoin

python skew join: https://datarus.wordpress.com/2015/05/04/fighting-the-skew-in-spark/

Библиотека tresata выглядит так:

import com.tresata.spark.skewjoin.Dsl._  // for the implicits   

// skewjoin() method pulled in by the implicits
rdd1.skewJoin(rdd2, defaultPartitioner(rdd1, rdd2),   
DefaultSkewReplication(1)).sortByKey(true).collect.toLis
person WestCoastProjects    schedule 15.08.2016
comment
Есть ли какая-нибудь библиотека Scala, которая соединяет перекос? Также во второй ссылке, которую вы предоставили. Они берут первый ключ фрейма данных и добавляют к нему случайное число. Во втором кадре данных они реплицируют ключ n раз, где n - это диапазон случайности, который вы добавили к первому кадру данных. Это кажется управляемым, когда второй фрейм данных невелик. Это точный и единственный способ ответить на мой вышеупомянутый вопрос? - person John Engelhart; 15.08.2016
comment
Я успешно импортировал import com.tresata.spark.skewjoin.Dsl._ Но я не могу найти метод .skewJoin в моем rdd RDD [(String, row)] - person John Engelhart; 16.08.2016
comment
Я выполнил следующее: rdd1.skewJoin (rdd2, defaultPartitioner (rdd1, rdd2), DefaultSkewReplication (1)). SortByKey (true) .collect.toList Но нужно три импорта import com.twitter.algebird.CMSHasherImplicits._ import org. apache.spark.Partitioner.defaultPartitioner import com.tresata.spark.skewjoin.Dsl._ - person John Engelhart; 16.08.2016