Top Banner
ETL со Spark Старикам здесь не место
19

ETL со Spark

Jul 15, 2015

Download

Technology

Vasil Remeniuk
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: ETL со Spark

ETL со SparkСтарикам здесь не место

Page 2: ETL со Spark

Вводный ликбез по BI

date user_id platform_id

01/01/15 1 1

01/01/15 1 2

platform_id platform_name

1 iOS

2 Desktop

date platform uniques

01/01/15 iOS 1

01/01/15 Desktop 2материализация

раз в час

ETL

Page 3: ETL со Spark

Пример: BI-платформа для игр

- система получает от мобильных клиентов различные ивенты

- определяет к какому сегменту относится игрок- дает игроку таргетированный контент

- строит отчеты

Page 4: ETL со Spark

Немного истории

2012Q4

2013Q2

2013Q4

2014Q3

MySQLPentaho KettleBIRT

Greenplum вместоMySQL

Hive HBaseMongoDB

ImpalaHive HBase

Page 5: ETL со Spark
Page 6: ETL со Spark

С чем мы столкнулись

- методология и подходы, устаревшие 10 лет назад

- нет понятных решений для deployment, monitoring, scheduling, logging,...

- рынок BI-инженеров тормозит прогресс

Page 7: ETL со Spark

Типичный ETL-job. Один из сотен

Page 8: ETL со Spark

Нерешенные проблемы

- код-ревью: боль- мержи и бранчинг: постоянные проблемы- тестирование: только интеграционное, с

помощью FitNesse- и многое другое...

Page 9: ETL со Spark

- deployment: ssh-скрипты и Jenkins - scheduling и запуск: опять Jenkins- аггрегация логов: снова Jenkins- мониторинг джобов: отчеты в BIRT

“Костыли” и “велосипеды”

Page 10: ETL со Spark

Со всем лучшим уходим на Spark

- SQL из старых ETL переиспользуется с помощью Spark SQL

- прежний паттерн дизайна Job’ов: иерархия- scheduling и запуск на Jenkins

Page 11: ETL со Spark

object SessionFactsJob extends SparkJob {

override def runJob(sc: SparkContext, jobConfig: Config) = {

...

sessionsRDD.registerTempTable("sessions")

sqlContext.sql(s"""

SELECT timestamp, count(distinct userId) uniqueUsersCount,

sum(duration)/count(*) avgSessionLength

FROM sessions WHERE timestamp > ${config.getLong(FromDate)}

ETL-job на Spark

Page 12: ETL со Spark

- есть job’ы, осуществляющие оркестрацию

- они выстроены в иерархию

- в любой момент, можно перезапустить с нужными параметрами определенную группу job’ов

Паттерн “Иерархия Job’ов”

Page 13: ETL со Spark

ooyala/spark-jobserver

- сервер spark job’ов:- spray для REST-интерфейса- Typesafe Config для конфигурации

- Job реализует trait, запаковывается в jar и загружается POST’ом на сервер

Page 14: ETL со Spark

Тестируемость

"Session facts job" should {

"overwrite aggregates, if they already exist" in {

...

SessionFactsJob.runJob(sc, config)

=== Array(DailySessionStats(parseDate("2014-10-30"), 1, 3, 12941))

}

}

Page 15: ETL со Spark

Трассировка job’ов с NewRelic

@Trace + NewRelic.setTransactionName(null, "/HourlyJob")

Page 16: ETL со Spark

Кроме этого- кастомный процессинг (никаких UDF)- наследование- cross-cutting concerns- типобезопасность- удобство при интеграции с внешними системами

Page 17: ETL со Spark

Перспективы

- Flume - это ночной кошмар Spark Streaming

- SQL-интерфейс поверх ElasticSearch - мечта

- Go-to для лямбда-архитектуры

Page 18: ETL со Spark