expert fridays spark job
TRANSCRIPT
www.provectus.com
A presentation of expertise we boast and services we render for partners across the board, around the globe.
© Provectus, Inc.
Provectus
PHP Java .NET Java Script Cloud Services
iOS Android Ruby J2EE QA
Provectus – международная R&D компания, предоставляющая полный комплекс услуг по разработке
программного обеспечения для корпоративного сегмента, мобильных платформ и WEB по всему
миру.
Apache Spark Job
www.provectus.com
“Магия вуду” над Spark Job
• Что такое Apache Spark
• Как устроены Spark Job
• Почему падают Spark Job
• Кто виноват, и что делать
Apache Spark Job
www.provectus.com
Что такое Apache Spark
• Open Source Framework для работы с данными
• Альтернатива Map Reduce, работает с HDFS
• Позволяет производить вычисления распределенно
• Есть API на Scala, Python и Java
• Поддерживает несколько режимов управления кластера Mesos, Yarn,
Standalone (есть в Amazon EC2)
• Поддерживает Streaming
Apache Spark Job
www.provectus.com
Основные понятия
• RDD (Resilent Distributed Dataset)
• Driver Program , Spark Context
• Worker Node, Executor, Task
• Job, Stage
Apache Spark Job
www.provectus.com
RDD
• Распределенная, неизменяемая коллекция элементов, доступная для
параллельной обработки. Она знает, как вычислить саму себя в случае сбоя, а
также хранит ссылки на своих предков.
RDD1 RDD2 RDD3Преобразование Преобразование
Apache Spark Job
www.provectus.com
Spark Job
• Job - Параллельные вычисления состоящие из
нескольких task созданных на Spark action.
Разбивается на зависимые друг от друга
последовательные подзадачи (Stage)
Apache Spark Job
www.provectus.com
Запускаем Job
val SparkConf = new SpakConf().SetMaser(“mesos://HOST:PORT”).SetAppName(“myApp”)
val sc = new SparkContext(SparkConf)
val rdd1 = sc.textFile(“hdfs://...”).flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a +
b)
textFile flatMap map reduceByKey
Apache Spark Job
www.provectus.com
Запускаем Job
val rdd2 = sc.hadoopFile(“hdfs://...”).groupByKey().map(...)
hadoopFile groupByKey map
Apache Spark Job
www.provectus.com
Запускаем Job
rdd3.collect()
textFile flatMap map reduceByKey
hadoopFile groupByKey map
join map
Worker Node
Apache Spark Job
www.provectus.com
Что то пошло не такspark.task.maxFailures default 4
Task Task
Worker node
Executer
Task Task
Worker node
Executer
Task Task
Worker node
Executer
Driver Programm
Spark Context
Cluster Manager
Apache Spark Job
www.provectus.com
Как избежать падения Executor
• Основные причины падения – не хватило буфера для сериализации, воркеру не хватило памяти.
• --conf executor-memory память executor`ов на нодах
• --conf spark.kryoserializer.buffer.mb KryoSerializer позволяет экономить память, он сжимает объекты, по дефолту
используется Java serialization
• --conf spark.storage.memoryFraction кэширование
• --conf spark.default.parallelism Default количество партиций в RDD хах
Apache Spark Job
www.provectus.com
Падение Master Driver
• Операции в Spark: Transformations, Actions, Persistense
• .collect() весь результат собирается в память в драйвере!
Apache Spark Job
www.provectus.com
Как избежать падения мастера
• toLocalIterator() собирает в одном узле данные
• --conf spark.driver.maxResultSize Макимальный размер результата в мастере
• --conf spark.driver.memory Память мастер драйвера
• --conf spark.default.parallelism Default количество партиций в RDD хах
Apache Spark Job
www.provectus.com
rdd = sc.parallelize(range(100), 10)
def make_part_filter(index):
def part_filter(split_index, iterator):
if split_index == index:
for el in iterator:
yield el
return part_filter
for part_id in range(rdd.getNumPartitions()):
part_rdd = rdd.mapPartitionsWithIndex(make_part_filter(part_id), True)
data_from_part_rdd = part_rdd.collect()
print "partition id: %s elements: %s" % (part_id, data_from_part_rdd)
out:partition id: 0 elements: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]partition id: 1 elements: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]partition id: 2 elements: [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]partition id: 3 elements: [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]partition id: 4 elements: [40, 41, 42, 43, 44, 45, 46, 47, 48, 49]partition id: 5 elements: [50, 51, 52, 53, 54, 55, 56, 57, 58, 59]partition id: 6 elements: [60, 61, 62, 63, 64, 65, 66, 67, 68, 69]partition id: 7 elements: [70, 71, 72, 73, 74, 75, 76, 77, 78, 79]partition id: 8 elements: [80, 81, 82, 83, 84, 85, 86, 87, 88, 89]partition id: 9 elements: [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
Партицирование результатов