Как эффективно распределять и использовать разделы в spark?

Это мой пример.

val arr = Array((1,2), (1,3), (1,4), (2,3), (4,5))
val data = sc.parallelize(arr, 5)

data.glom.map(_length).collect
Array[Int] = Array(1, 1, 1, 1, 1)

val agg = data.reduceByKey(_+_)
agg.glom.map(_.length).collect
Array[Int] = Array(0, 1, 1, 0, 1)

val fil = agg.filter(_._2 < 4)
fil.glom.map(_.length).collect
Array[Int] = Array(0, 0, 1, 0, 0)

val sub = data.map{case(x,y) => (x, (x,y))}.subtractByKey(fil).map(_._2)
Array[(Int, Int)] = Array((1,4), (1,3), (1,2), (4,5))

sub.glom.map(_.length).collect
Array[Int] = Array(0, 3, 0, 0, 1)

Меня интересует равномерное распределение разделов.

Переменная data состоит из пяти разделов, причем все данные равномерно разделены.

ex)par1: (1,2)
   par2: (1,3)
   par3: (1,4)
   par4: (2,3)
   par5: (4,5)

После нескольких transformation operation используются только два из пяти разделов, отведенных под переменную sub.

Переменная sub состоит из пяти разделов, но не все данные разделены равномерно.

ex)par1: empty
   par2: (1,2),(1,3),(1,4)
   par3: empty
   par4: empty
   par5: (4,5)

Если я добавлю еще один transformation operation к переменной sub, будет 5 доступных разделов, но для операции будут использоваться только 2 раздела.

ex)sub.map{case(x,y) => (x, x, (x,y))}

Поэтому я хочу использовать все доступные разделы при работе с данными.

Я использовал метод repartition, но он не дешевле.

ex) sub.repartition(5).glom.map(_.length).collect
Array[Int] = Array(0, 1, 1, 2, 0)

Поэтому я ищу разумный способ использовать как можно больше разделов.

Есть ли хороший способ?


person S.Kang    schedule 27.03.2017    source источник


Ответы (1)


Так что repartition определенно правильный путь :)

Ваш пример слишком прост, чтобы что-то продемонстрировать, поскольку Spark создан для обработки миллиардов строк, а не 5 строк. repartition не будет помещать точно одинаковое количество строк в каждую секцию, но будет распределять данные равномерно. Попробуйте повторить свой пример с 1 000 000 строк, и вы увидите, что данные действительно распределяются равномерно после repartition.

Перекос данных часто является серьезной проблемой при работе с преобразованиями больших объемов данных, а перераспределение данных требует дополнительных затрат времени, поскольку необходимо перетасовать данные. Однако иногда стоит принять штраф, потому что это ускорит следующие этапы трансформации.

person Glennie Helles Sindholt    schedule 27.03.2017