expert fridays spark job

20
www.provectus.com A presentation of expertise we boast and services we render for partners across the board, around the globe. © Provectus, Inc.

Upload: provectus

Post on 14-Apr-2017

132 views

Category:

Technology


0 download

TRANSCRIPT

www.provectus.com

A presentation of expertise we boast and services we render for partners across the board, around the globe.

© Provectus, Inc.

О спикере

www.provectus.com

Леонид Блохин

• Big Data Engineer

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

Как работает кластер

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

val rdd3 = rdd1.join(rdd2).map(...)

join 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]

Партицирование результатов

Благодарю за внимание!

www.provectus.com

Задавайте ваши вопросы

Контакты

Леонид Блохин

Skype:

Email: [email protected]

www.provectus.com