Демистифициране на разделянето в Spark



Този блог ви разказва всичко, което трябва да знаете за разделянето в Spark, типовете дялове и как подобрява скоростта на изпълнение за ключови трансформации.

Принос от Prithviraj Bose

Spark’s Устойчиви разпределени набори от данни (програмната абстракция) се оценяват мързеливо и трансформациите се съхраняват като насочени ациклични графики (DAG). Така че всяко действие върху RDD ще накара Spark да преизчисли DAG. По този начин се постига устойчивост в Spark, защото ако някой работен възел се провали, DAG просто трябва да се преизчисли.





То е също задължително за кеширане (продължават с подходящо ниво на съхранение) RDD, така че честите действия върху RDD не принуждават Spark да преизчисли DAG.Темите, разгледани в този блог, по същество се изискват за сертифициране на Apache Spark и Scala. Темите, обхванати в този блог, по същество са необходими за .

Защо да използвам дял?

При клъстерните изчисления основното предизвикателство е да се минимизира мрежовият трафик. Когато данните са ориентирани към ключ-стойност, разделянето става задължително, тъй като за последващите трансформации на RDD има достатъчно разместване на данни в мрежата. Ако подобни ключове или диапазон от ключове се съхраняват в същия дял, тогава разбъркването е сведено до минимум и обработката става значително бърза.



Трансформациите, които изискват разместване на данни между работни възли, имат голяма полза от разделянето. Такива трансформации са cogroup, groupWith, join, leftOuterJoin, rightOuterJoin, groupByKey, reduceByKey, combByKey и погледни нагоре .

Дяловете могат да се конфигурират, при условие че RDD е базиран на ключ-стойност.

Свойства на дяла

  1. Гарантирано е, че кортежи в един и същ дял са в една и съща машина.
  2. Всеки възел в клъстер може да съдържа повече от един дял.
  3. Общият брой на дяловете е конфигурируем, по подразбиране той е зададен на общия брой ядра на всички изпълнителни възли.

Видове разделяне в Spark

Spark поддържа два вида разделяне,

  • Разделяне на хеш : Използва Java Object.hashCode метод за определяне на дяла като дял = key.hashCode ()% numPartitions.

hash-partitioning-demystifying-partitioning-in-spark



  • Разделяне на обхвата : Използва диапазон за разпределяне на съответните дялове на ключовете, които попадат в диапазона. Този метод е подходящ, когато има естествено подреждане в ключовете и клавишите са неотрицателни. Долният кодов фрагмент показва използването на разделител на диапазон.

Пример за код

Нека да видим пример за това как да разделяте данни между работни възли. Наличен е пълният код на Scala тук .

Ето някои тестови данни от 12 координати (като кортежи),

Създайте org.apache.spark.HashPartitioner с размер 2, където ключовете ще бъдат разделени на тези два дяла въз основа на хеш кода на ключовете.

След това можем да инспектираме двойките и да правим различни ключови трансформации, като foldByKey и намаляванеByKey.

Обобщавайки, разделянето значително подобрява скоростта на изпълнение за ключови трансформации.

Имате въпрос към нас? Моля, споменете го в раздела за коментари и ние ще се свържем с вас.

Подобни публикации:

как да направя до силата на

Защо трябва да научите Spark след овладяване на Hadoop

Apache Spark срещу Hadoop MapReduce