SlideShare a Scribd company logo
Опыт использования spark
Основано на реальных событиях
Чтение бинарных логов
• задача - по логам найти тех, кто подбирает пароли
• одна запись лога раскидана на несколько бинарных файлов
• часть бинарных файлов = справочники
• остальные файлы читаются последовательно
• такую задачу можно решать на hadoop
• также можно решать переводом бинарных данных в текстовый формат, но это потери
времени и ресурсов кластера
Чтение в hadoop
InputFormat
split
split
split
RecordReader
RecordReader
RecordReader
Record
Record
Record
Использование в спарк
• этапы решения
• работа с бинарными файлами в одном потоке
• упаковка логики в inputformat, record reader
• написание mr джоба
• как это всё засунуть в спарк
val fileRDDs = filesToProcess.toArray.map{
file => sc.newAPIHadoopFile[IntWritable, Text, BWLogsInputFormat[IntWritable, Text]](file)}
val rdd = new UnionRDD(sc, fileRDDs)
Оптимизация ETL
конвертировать бинлоги в текстовое представление,
не всегда это можно сделать даже используя fuse
и это приведёт к потери времени и ресурсов кластера
бинарные
данные
текстовые данные
обработка
Запись с группировкой по
директориям
• проблема: rdd.saveAsTextFile(“/var/blob/result”) сохраняет всё в директорию path
/var/blob/result/part-00000
/var/blob/result/part-00001
• чего хотелось бы: разбить данные по директориям - партицировать по значениям
полей
/var/blob/result/type1/part-00000
/var/blob/result/type1/part-00001
/var/blob/result/type2/part-00000
/var/blob/result/type2/part-00001
/var/blob/result/type3/part-00000
/var/blob/result/type3/part-00001
/var/blob/result/type4/part-00000
/var/blob/result/type4/part-00001
N+1 чтение
resultRdd.map {
x =>
x._1 //partition value
}.distinct().collect()/* first read*/.foreach {
part =>
resultRdd.filter(part.equals(_._1))/* N reads*/.saveAsTextFile("path/" + part)
}
1 чтение и много кода
resultRdd.foreachPartition {
p =>
val hdfs = HdfsUtils.setupHdfs(hdfsConf)
val pathToOut = collection.mutable.Map[String, FSDataOutputStream]()
try {
//save to dirs by value
p.foreach(csv => {
val fileName = "%1$s/%2$s/%3$s".format(sortByDateDir, dateValue, exeDirName)
val output = getFileOutput(fileName, pathToOut, hdfs)
output.write(csv._2.toString.getBytes("utf8"))
output.writeBytes(CSV_DELIMITER)
})
} catch {
case t: Throwable => {
log.error("" + t, t)
}
}
pathToOut.foreach(out => {
tryToCloseNTimes(out._2, 5, 2000)
})
}
def getFileOutput(fileName: String, files: collection.mutable.Map[String, FSDataOutputStream], fs: FileSystem): FSDataOutputStream = {
//20 lines of code
}
1 чтение + мало кодировать
class KeyPartitionedMultipleTextOutputFormat extends MultipleTextOutputFormat
[NullWritable, String] {
override def generateFileNameForKeyValue(key: NullWritable, value: String, name:
String): String = {
val elements = value.toString.split(",")
"key%1$s/%2$s".format(elements(1), name)
}
}
val pairRdd = new PairRDDFunctions[NullWritable, String](pairBlob)
pairRdd.saveAsHadoopFile(fs.getUri + config.dstDir, classOf[NullWritable], classOf[String],
classOf[KeyPartitionedMultipleTextOutputFormat], conf = new JobConf(appConf))
Скорость и надёжность кафки
• чем хороша кафка
• легко масштабировать
• хорошая скорость чтения записи
• недостатки
• для предсказуемого поведения с оффсетами и равномерностью чтения партиций
лучше использовать низкоуровневый simpleconsumer
• документация - лучше сразу смотреть исходники
• важно не путать её с jms очередями
топик
партиция 1
партиция 2
партиция 3
реплика 1
реплика 2
Актуальный сценарий
интеграции
серверное приложение
(C++ python)
логика отправки
данных в кафку кафка
спарк batch & streaming
Сценарий с tungsten (POC)
mysql
master
tungsten
spark batch & streamkafka
mysql
master
tungsten
binlog
binlog
серверное приложение
(С++ python)
Типичный ETL сценарий
mysql
dump csv + tgz HDFS spark
тут напрягаем
периодически mysql
сервер дампами,
невозможно сделать
журнал
тут скорость
будет хуже чем
у кафка,
удобнее писать
читать кафку
чем hdfs
Чтение из Кафки
• создан inputformat для чтение топиков из кафки (по мотивам camus)
• алгоритм работы
• для каждого осчетания топик+партиция создать сплит
• в рамках обработки сплита посмотреть текущие оффсеты записи и поднять
последние оффсеты чтения с hdfs
• выполнить чтение и сохранить новые оффсеты чтения на hdfs
• недостатки
• хранение оффсетов чтения на hdfs
• неравномерная загрузка кластера в случае малого числа партиций или
неравномерной загрузки партиций
• проблема отсутствия лидера партиции на момент старта выгрузки
Спарк Стриминг
• приницип работы - создавать рдд на основе принятых данных и обрабатывать их
• позволяет партицировать поток (получать данные на нескольких нодах одновременно)
val allInputs = (0 to numberOfNodes - 1).map {x =>SparkUtils.createStreamPartition(ssc, ...)}
• позволяет работать с окнами = запоминает набор рдд для окна
• для отказоустойчивости есть механизм сохранения снимков рдд
• позволяет сделать ограничитель скорости приёма данных
Недостатки Стриминга
• трудно организовать обработку данных без потерь (но для стриминга это не всегда нужно)
• проблема в блок генераторе
• получили данные из потока
• закинули данные в блок генератор на создание рдд
• данные попадают в буффер (для асинхронности и скорости)
• с задержкой по времени данные попадают в рдд
• т.е. при падении есть вероятность потерять содержимое буфера
• есть возможности это обойти при условии возможности перечитать данные из потока
• надо играть настройками генератора рдд чтобы избежать OOM
spark.streaming.blockInterval=100 (в миллисекундах)
канал
сообщений
Генератор РДД
Окно РДД (память + диск)
РДД РДД РДД
Буфер
Работа с потоком из кафки
• в поставке спарка есть реализация кафка стрима, но она не устроила
• основана на высокоуровневом апи кафка ридера с его проблемами сохранения
офсетов и равномерностью нагрузки на чтение
• задача где используется
• вычислять качество соединения в 5ти минутных окнах и отображать на карте мира
Своя реализация стримера
• оффсеты сохраняются после каждого чтения в hbase
• чтение партиций равномерное в рамках пула потоков
• поддержка партицирования чтения потока
• поддержка механизма метрик в спарке (основан на codahale metrics)
• скорость приёма данных
• отставание
Недостатки реализации
• завязан на hbase - надо вынести на уровень апи возможность подсунуть свою реализацию
хранилища
• не реализовано восстановление после падения с учётом потери буфера генератора рдд -
нет необходимости это делать, но возможность есть
Проблемы внедрения
• как и во что собрать? как запускать?
• 3 опции
• uberjar + java -jar
• spark-submit --deploy-mode client
• spark-submit --deploy-mode cluster
• как передать конфиги?
• актуально для spark-submit --deploy-mode cluster
• решается через --files /path/to/config.xml
• что делать с ошибками сериализации?
• понять как работает спарк приложение + рефакторинг кода
val rdd = sc.textFile("")
val a = ...
val resultRdd = rdd.map {
x =>
(x, a)
}
Всё

More Related Content

What's hot

Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15
Alexey Zinoviev
 
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Ontico
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015
Alex Chistyakov
 
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Alexey Zinoviev
 
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ontico
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooДмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в Badoo
Mail.ru Group
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
Technopark
 
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Ontico
 
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupDennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Mail.ru Group
 
Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...
Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...
Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...
Ontico
 
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Ontico
 
С чего начать внедрение Hadoop в компании. Доклад Алексея Еремихина (Badoo).
С чего начать внедрение Hadoop в компании. Доклад Алексея Еремихина (Badoo). С чего начать внедрение Hadoop в компании. Доклад Алексея Еремихина (Badoo).
С чего начать внедрение Hadoop в компании. Доклад Алексея Еремихина (Badoo).
Badoo Development
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
Ontico
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
Ontico
 
SphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricksSphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricks
Roman Pavlushko
 
06 - Hadoop. Java API и Hadoop Streaming
06 - Hadoop. Java API и Hadoop Streaming06 - Hadoop. Java API и Hadoop Streaming
06 - Hadoop. Java API и Hadoop Streaming
Roman Brovko
 
Apache spark
Apache sparkApache spark
Apache spark
Anton Anokhin
 
Применение в Enterprise-приложении графовой базы данных Neo4j - Антон Максимо...
Применение в Enterprise-приложении графовой базы данных Neo4j - Антон Максимо...Применение в Enterprise-приложении графовой базы данных Neo4j - Антон Максимо...
Применение в Enterprise-приложении графовой базы данных Neo4j - Антон Максимо...
Dev2Dev
 
08 - Hadoop. Алгоритмы на графах в MapReduce
08 - Hadoop. Алгоритмы на графах в MapReduce08 - Hadoop. Алгоритмы на графах в MapReduce
08 - Hadoop. Алгоритмы на графах в MapReduce
Roman Brovko
 

What's hot (20)

Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15
 
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015
 
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
 
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooДмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в Badoo
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
Разработка real-time приложений с RethinkDB / Илья Вербицкий (Независимый кон...
 
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupDennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
 
Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...
Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...
Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...
 
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
 
С чего начать внедрение Hadoop в компании. Доклад Алексея Еремихина (Badoo).
С чего начать внедрение Hadoop в компании. Доклад Алексея Еремихина (Badoo). С чего начать внедрение Hadoop в компании. Доклад Алексея Еремихина (Badoo).
С чего начать внедрение Hadoop в компании. Доклад Алексея Еремихина (Badoo).
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
 
SphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricksSphinxSearch Meetup - Tips&tricks
SphinxSearch Meetup - Tips&tricks
 
06 - Hadoop. Java API и Hadoop Streaming
06 - Hadoop. Java API и Hadoop Streaming06 - Hadoop. Java API и Hadoop Streaming
06 - Hadoop. Java API и Hadoop Streaming
 
Apache spark
Apache sparkApache spark
Apache spark
 
Avito Stachka 2012
Avito Stachka 2012Avito Stachka 2012
Avito Stachka 2012
 
Применение в Enterprise-приложении графовой базы данных Neo4j - Антон Максимо...
Применение в Enterprise-приложении графовой базы данных Neo4j - Антон Максимо...Применение в Enterprise-приложении графовой базы данных Neo4j - Антон Максимо...
Применение в Enterprise-приложении графовой базы данных Neo4j - Антон Максимо...
 
08 - Hadoop. Алгоритмы на графах в MapReduce
08 - Hadoop. Алгоритмы на графах в MapReduce08 - Hadoop. Алгоритмы на графах в MapReduce
08 - Hadoop. Алгоритмы на графах в MapReduce
 

Similar to Опыт использования Spark, Основано на реальных событиях

Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
GetDev.NET
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_drupalconf
 
AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012Roman Pavlushko
 
Enter: legacy code
Enter: legacy codeEnter: legacy code
Enter: legacy code
Kamil Samigullin
 
Обратная разработка бинарных форматов с помощью Kaitai Struct
Обратная разработка бинарных форматов с помощью Kaitai StructОбратная разработка бинарных форматов с помощью Kaitai Struct
Обратная разработка бинарных форматов с помощью Kaitai Struct
Positive Hack Days
 
Scripting languages
Scripting languagesScripting languages
Scripting languagesLev Panov
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest
 
Клиент-серверные приложения на iPhone
Клиент-серверные приложения на iPhoneКлиент-серверные приложения на iPhone
Клиент-серверные приложения на iPhone
Pavel Bashmakov
 
Cocoa Networking
Cocoa NetworkingCocoa Networking
Cocoa Networkingguest57eb8a
 
20111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture320111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture3Computer Science Club
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDBIurii Ogiienko
 
ekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилищеekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилищеit-people
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий Насретдинов
Ontico
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Ontico
 
Hadoop presentation
Hadoop presentationHadoop presentation
Hadoop presentation
Vlad Orlov
 
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bashkuchinskaya
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...
a15464321646213
 

Similar to Опыт использования Spark, Основано на реальных событиях (20)

Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
 
AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012
 
Enter: legacy code
Enter: legacy codeEnter: legacy code
Enter: legacy code
 
Обратная разработка бинарных форматов с помощью Kaitai Struct
Обратная разработка бинарных форматов с помощью Kaitai StructОбратная разработка бинарных форматов с помощью Kaitai Struct
Обратная разработка бинарных форматов с помощью Kaitai Struct
 
Sivko
SivkoSivko
Sivko
 
Scripting languages
Scripting languagesScripting languages
Scripting languages
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
 
Клиент-серверные приложения на iPhone
Клиент-серверные приложения на iPhoneКлиент-серверные приложения на iPhone
Клиент-серверные приложения на iPhone
 
Cocoa Networking
Cocoa NetworkingCocoa Networking
Cocoa Networking
 
20111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture320111002 information retrieval raskovalov_lecture3
20111002 information retrieval raskovalov_lecture3
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
ekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилищеekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилище
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий Насретдинов
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
 
Hadoop presentation
Hadoop presentationHadoop presentation
Hadoop presentation
 
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bash
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Nosql and Mongodb
Nosql and MongodbNosql and Mongodb
Nosql and Mongodb
 

More from Vasil Remeniuk

Product Minsk - РТБ и Программатик
Product Minsk - РТБ и ПрограмматикProduct Minsk - РТБ и Программатик
Product Minsk - РТБ и Программатик
Vasil Remeniuk
 
Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14
Vasil Remeniuk
 
Cake pattern. Presentation by Alex Famin at scalaby#14
Cake pattern. Presentation by Alex Famin at scalaby#14Cake pattern. Presentation by Alex Famin at scalaby#14
Cake pattern. Presentation by Alex Famin at scalaby#14
Vasil Remeniuk
 
Scala laboratory: Globus. iteration #3
Scala laboratory: Globus. iteration #3Scala laboratory: Globus. iteration #3
Scala laboratory: Globus. iteration #3
Vasil Remeniuk
 
Testing in Scala by Adform research
Testing in Scala by Adform researchTesting in Scala by Adform research
Testing in Scala by Adform research
Vasil Remeniuk
 
Spark Intro by Adform Research
Spark Intro by Adform ResearchSpark Intro by Adform Research
Spark Intro by Adform ResearchVasil Remeniuk
 
Types by Adform Research, Saulius Valatka
Types by Adform Research, Saulius ValatkaTypes by Adform Research, Saulius Valatka
Types by Adform Research, Saulius ValatkaVasil Remeniuk
 
Types by Adform Research
Types by Adform ResearchTypes by Adform Research
Types by Adform ResearchVasil Remeniuk
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovVasil Remeniuk
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovVasil Remeniuk
 
Spark by Adform Research, Paulius
Spark by Adform Research, PauliusSpark by Adform Research, Paulius
Spark by Adform Research, PauliusVasil Remeniuk
 
Scala Style by Adform Research (Saulius Valatka)
Scala Style by Adform Research (Saulius Valatka)Scala Style by Adform Research (Saulius Valatka)
Scala Style by Adform Research (Saulius Valatka)Vasil Remeniuk
 
Spark intro by Adform Research
Spark intro by Adform ResearchSpark intro by Adform Research
Spark intro by Adform ResearchVasil Remeniuk
 
SBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius ValatkaSBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius ValatkaVasil Remeniuk
 
Scala laboratory: Globus. iteration #2
Scala laboratory: Globus. iteration #2Scala laboratory: Globus. iteration #2
Scala laboratory: Globus. iteration #2
Vasil Remeniuk
 
Testing in Scala. Adform Research
Testing in Scala. Adform ResearchTesting in Scala. Adform Research
Testing in Scala. Adform Research
Vasil Remeniuk
 
Scala laboratory. Globus. iteration #1
Scala laboratory. Globus. iteration #1Scala laboratory. Globus. iteration #1
Scala laboratory. Globus. iteration #1
Vasil Remeniuk
 
Cassandra + Spark + Elk
Cassandra + Spark + ElkCassandra + Spark + Elk
Cassandra + Spark + Elk
Vasil Remeniuk
 
ETL со Spark
ETL со SparkETL со Spark
ETL со Spark
Vasil Remeniuk
 
Funtional Reactive Programming with Examples in Scala + GWT
Funtional Reactive Programming with Examples in Scala + GWTFuntional Reactive Programming with Examples in Scala + GWT
Funtional Reactive Programming with Examples in Scala + GWT
Vasil Remeniuk
 

More from Vasil Remeniuk (20)

Product Minsk - РТБ и Программатик
Product Minsk - РТБ и ПрограмматикProduct Minsk - РТБ и Программатик
Product Minsk - РТБ и Программатик
 
Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14
 
Cake pattern. Presentation by Alex Famin at scalaby#14
Cake pattern. Presentation by Alex Famin at scalaby#14Cake pattern. Presentation by Alex Famin at scalaby#14
Cake pattern. Presentation by Alex Famin at scalaby#14
 
Scala laboratory: Globus. iteration #3
Scala laboratory: Globus. iteration #3Scala laboratory: Globus. iteration #3
Scala laboratory: Globus. iteration #3
 
Testing in Scala by Adform research
Testing in Scala by Adform researchTesting in Scala by Adform research
Testing in Scala by Adform research
 
Spark Intro by Adform Research
Spark Intro by Adform ResearchSpark Intro by Adform Research
Spark Intro by Adform Research
 
Types by Adform Research, Saulius Valatka
Types by Adform Research, Saulius ValatkaTypes by Adform Research, Saulius Valatka
Types by Adform Research, Saulius Valatka
 
Types by Adform Research
Types by Adform ResearchTypes by Adform Research
Types by Adform Research
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex Gryzlov
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex Gryzlov
 
Spark by Adform Research, Paulius
Spark by Adform Research, PauliusSpark by Adform Research, Paulius
Spark by Adform Research, Paulius
 
Scala Style by Adform Research (Saulius Valatka)
Scala Style by Adform Research (Saulius Valatka)Scala Style by Adform Research (Saulius Valatka)
Scala Style by Adform Research (Saulius Valatka)
 
Spark intro by Adform Research
Spark intro by Adform ResearchSpark intro by Adform Research
Spark intro by Adform Research
 
SBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius ValatkaSBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius Valatka
 
Scala laboratory: Globus. iteration #2
Scala laboratory: Globus. iteration #2Scala laboratory: Globus. iteration #2
Scala laboratory: Globus. iteration #2
 
Testing in Scala. Adform Research
Testing in Scala. Adform ResearchTesting in Scala. Adform Research
Testing in Scala. Adform Research
 
Scala laboratory. Globus. iteration #1
Scala laboratory. Globus. iteration #1Scala laboratory. Globus. iteration #1
Scala laboratory. Globus. iteration #1
 
Cassandra + Spark + Elk
Cassandra + Spark + ElkCassandra + Spark + Elk
Cassandra + Spark + Elk
 
ETL со Spark
ETL со SparkETL со Spark
ETL со Spark
 
Funtional Reactive Programming with Examples in Scala + GWT
Funtional Reactive Programming with Examples in Scala + GWTFuntional Reactive Programming with Examples in Scala + GWT
Funtional Reactive Programming with Examples in Scala + GWT
 

Опыт использования Spark, Основано на реальных событиях

  • 1. Опыт использования spark Основано на реальных событиях
  • 2. Чтение бинарных логов • задача - по логам найти тех, кто подбирает пароли • одна запись лога раскидана на несколько бинарных файлов • часть бинарных файлов = справочники • остальные файлы читаются последовательно • такую задачу можно решать на hadoop • также можно решать переводом бинарных данных в текстовый формат, но это потери времени и ресурсов кластера
  • 4. Использование в спарк • этапы решения • работа с бинарными файлами в одном потоке • упаковка логики в inputformat, record reader • написание mr джоба • как это всё засунуть в спарк val fileRDDs = filesToProcess.toArray.map{ file => sc.newAPIHadoopFile[IntWritable, Text, BWLogsInputFormat[IntWritable, Text]](file)} val rdd = new UnionRDD(sc, fileRDDs)
  • 5. Оптимизация ETL конвертировать бинлоги в текстовое представление, не всегда это можно сделать даже используя fuse и это приведёт к потери времени и ресурсов кластера бинарные данные текстовые данные обработка
  • 6. Запись с группировкой по директориям • проблема: rdd.saveAsTextFile(“/var/blob/result”) сохраняет всё в директорию path /var/blob/result/part-00000 /var/blob/result/part-00001 • чего хотелось бы: разбить данные по директориям - партицировать по значениям полей /var/blob/result/type1/part-00000 /var/blob/result/type1/part-00001 /var/blob/result/type2/part-00000 /var/blob/result/type2/part-00001 /var/blob/result/type3/part-00000 /var/blob/result/type3/part-00001 /var/blob/result/type4/part-00000 /var/blob/result/type4/part-00001
  • 7. N+1 чтение resultRdd.map { x => x._1 //partition value }.distinct().collect()/* first read*/.foreach { part => resultRdd.filter(part.equals(_._1))/* N reads*/.saveAsTextFile("path/" + part) }
  • 8. 1 чтение и много кода resultRdd.foreachPartition { p => val hdfs = HdfsUtils.setupHdfs(hdfsConf) val pathToOut = collection.mutable.Map[String, FSDataOutputStream]() try { //save to dirs by value p.foreach(csv => { val fileName = "%1$s/%2$s/%3$s".format(sortByDateDir, dateValue, exeDirName) val output = getFileOutput(fileName, pathToOut, hdfs) output.write(csv._2.toString.getBytes("utf8")) output.writeBytes(CSV_DELIMITER) }) } catch { case t: Throwable => { log.error("" + t, t) } } pathToOut.foreach(out => { tryToCloseNTimes(out._2, 5, 2000) }) } def getFileOutput(fileName: String, files: collection.mutable.Map[String, FSDataOutputStream], fs: FileSystem): FSDataOutputStream = { //20 lines of code }
  • 9. 1 чтение + мало кодировать class KeyPartitionedMultipleTextOutputFormat extends MultipleTextOutputFormat [NullWritable, String] { override def generateFileNameForKeyValue(key: NullWritable, value: String, name: String): String = { val elements = value.toString.split(",") "key%1$s/%2$s".format(elements(1), name) } } val pairRdd = new PairRDDFunctions[NullWritable, String](pairBlob) pairRdd.saveAsHadoopFile(fs.getUri + config.dstDir, classOf[NullWritable], classOf[String], classOf[KeyPartitionedMultipleTextOutputFormat], conf = new JobConf(appConf))
  • 10. Скорость и надёжность кафки • чем хороша кафка • легко масштабировать • хорошая скорость чтения записи • недостатки • для предсказуемого поведения с оффсетами и равномерностью чтения партиций лучше использовать низкоуровневый simpleconsumer • документация - лучше сразу смотреть исходники • важно не путать её с jms очередями топик партиция 1 партиция 2 партиция 3 реплика 1 реплика 2
  • 11. Актуальный сценарий интеграции серверное приложение (C++ python) логика отправки данных в кафку кафка спарк batch & streaming
  • 12. Сценарий с tungsten (POC) mysql master tungsten spark batch & streamkafka mysql master tungsten binlog binlog серверное приложение (С++ python)
  • 13. Типичный ETL сценарий mysql dump csv + tgz HDFS spark тут напрягаем периодически mysql сервер дампами, невозможно сделать журнал тут скорость будет хуже чем у кафка, удобнее писать читать кафку чем hdfs
  • 14. Чтение из Кафки • создан inputformat для чтение топиков из кафки (по мотивам camus) • алгоритм работы • для каждого осчетания топик+партиция создать сплит • в рамках обработки сплита посмотреть текущие оффсеты записи и поднять последние оффсеты чтения с hdfs • выполнить чтение и сохранить новые оффсеты чтения на hdfs • недостатки • хранение оффсетов чтения на hdfs • неравномерная загрузка кластера в случае малого числа партиций или неравномерной загрузки партиций • проблема отсутствия лидера партиции на момент старта выгрузки
  • 15. Спарк Стриминг • приницип работы - создавать рдд на основе принятых данных и обрабатывать их • позволяет партицировать поток (получать данные на нескольких нодах одновременно) val allInputs = (0 to numberOfNodes - 1).map {x =>SparkUtils.createStreamPartition(ssc, ...)} • позволяет работать с окнами = запоминает набор рдд для окна • для отказоустойчивости есть механизм сохранения снимков рдд • позволяет сделать ограничитель скорости приёма данных
  • 16. Недостатки Стриминга • трудно организовать обработку данных без потерь (но для стриминга это не всегда нужно) • проблема в блок генераторе • получили данные из потока • закинули данные в блок генератор на создание рдд • данные попадают в буффер (для асинхронности и скорости) • с задержкой по времени данные попадают в рдд • т.е. при падении есть вероятность потерять содержимое буфера • есть возможности это обойти при условии возможности перечитать данные из потока • надо играть настройками генератора рдд чтобы избежать OOM spark.streaming.blockInterval=100 (в миллисекундах) канал сообщений Генератор РДД Окно РДД (память + диск) РДД РДД РДД Буфер
  • 17. Работа с потоком из кафки • в поставке спарка есть реализация кафка стрима, но она не устроила • основана на высокоуровневом апи кафка ридера с его проблемами сохранения офсетов и равномерностью нагрузки на чтение • задача где используется • вычислять качество соединения в 5ти минутных окнах и отображать на карте мира
  • 18. Своя реализация стримера • оффсеты сохраняются после каждого чтения в hbase • чтение партиций равномерное в рамках пула потоков • поддержка партицирования чтения потока • поддержка механизма метрик в спарке (основан на codahale metrics) • скорость приёма данных • отставание
  • 19. Недостатки реализации • завязан на hbase - надо вынести на уровень апи возможность подсунуть свою реализацию хранилища • не реализовано восстановление после падения с учётом потери буфера генератора рдд - нет необходимости это делать, но возможность есть
  • 20. Проблемы внедрения • как и во что собрать? как запускать? • 3 опции • uberjar + java -jar • spark-submit --deploy-mode client • spark-submit --deploy-mode cluster • как передать конфиги? • актуально для spark-submit --deploy-mode cluster • решается через --files /path/to/config.xml • что делать с ошибками сериализации? • понять как работает спарк приложение + рефакторинг кода val rdd = sc.textFile("") val a = ... val resultRdd = rdd.map { x => (x, a) }