SlideShare a Scribd company logo
BigData Tools
Зиновьев Алексей
Java/BigData тренер в EPAM
Мастер-класс по BigData Tools для HappyDev'15
Контакты
• https://twitter.com/zaleslaw
• https://twitter.com/BigDataRussia
• http://vk.com/big_data_russia Big Data Russia
• http://vk.com/java_jvm
JavaScript изо всех щелей
И вот, что я скажу тебе, JavaScript
И вот, что я скажу тебе, JavaScript
Мне нравится, когда все на JVM
крутится!
Типичный BigData кластер
• 450 машин
• Master Nodes (24 ядра, 158 Gb RAM).
• Data Nodes (24|32 ядра, 96|128 Gb RAM).
• Средняя YARN Queue utilization 85% (по
дням).
• 12Pb – емкость хранения данных
Когда мы говорим, что имеем дело с
BigData решением
• Когда перед глазами смесь архитектурных
подходов, таких как Kappa, Lambda, Data Lake
• Когда мы имеем дело со стеком технологий,
таких как Hadoop, Kafka, Spark, Storm, Samza,
HBase, Cassandra, Titan, GridGain
• Когда анализ логов этих систем – задача не
менее серьезного уровня
ScaleUp vs ScaleOut
16 CPUs 16 CPUs 16 CPUsScale - Out16 CPUs
48 CPUsScale - Up16 CPUs
Приходит время, данные в
датацентры улетают…
I
50GB
300GB
5TB
Приходит время, данные в
датацентры улетают…
Как вылечить невысокую
устойчивость к сбоям?
Мыть голову при помощи нового
шампуня «Репликация»!
Если вы слишком увлечётесь гонкой
инструментов, то получится..
Типичный многосервисный проект,
где основной болью будет конфликт
разных версий
Real-Time Data-Marts
Batch Data-Marts
Relations Graph
Ontology Metadata
Search Index
Events & Alarms
Real-time
Dashboarding
Events & Alarms
All Raw Data backup
is stored here
Real-time Data
Ingestion
Batch Data
Ingestion
Real-Time ETL & CEP
Batch ETL & Raw Area
Scheduler
Internal
External
Social
HDFS → CFS
as an option
Time-Series Data
Titan & KairosDB
store data in Cassandra
Push Events & Alarms (Email, SNMP etc.)
Hadoop
Пора дать определение!
• Hadoop != MapReduce
Пора дать определение!
• Hadoop != MapReduce
• Hadoop – это фреймворк
Пора дать определение!
• Hadoop != MapReduce
• Hadoop – это фреймворк
• Фреймворк для обработки больших
массивов данных
Пора дать определение!
• Hadoop != MapReduce
• Hadoop – это фреймворк
• Фреймворк для обработки больших
массивов данных
• Который использует простые модели и
парадигмы программирования
Пора дать определение!
• Hadoop != MapReduce
• Hadoop – это фреймворк
• Фреймворк для обработки больших
массивов данных
• Который использует простые модели и
парадигмы программирования
• Скрывая от нас всю самую сложную часть с
параллелизацией, перемещением данных и
Фреймворке в семействе Hadoop
• Универсальные (MapReduce, Tez, Kudu, RDD
in Spark)
Фреймворке в семействе Hadoop
• Универсальные (MapReduce, Tez, Kudu, RDD
in Spark)
• Абстрактные (Pig, Pipeline Spark)
Фреймворке в семействе Hadoop
• Универсальные (MapReduce, Tez, Kudu, RDD
in Spark)
• Абстрактные (Pig, Pipeline Spark)
• SQL – подобные (Hive, Impala, Spark SQL)
Фреймворке в семействе Hadoop
• Универсальные (MapReduce, Tez, Kudu, RDD
in Spark)
• Абстрактные (Pig, Pipeline Spark)
• SQL – подобные (Hive, Impala, Spark SQL)
• Для обработки графов (Giraph, GraphX)
Фреймворке в семействе Hadoop
• Универсальные (MapReduce, Tez, Kudu, RDD
in Spark)
• Абстрактные (Pig, Pipeline Spark)
• SQL – подобные (Hive, Impala, Spark SQL)
• Для обработки графов (Giraph, GraphX)
• Машинное обучение (MLlib, Mahout)
Фреймворке в семействе Hadoop
• Универсальные (MapReduce, Tez, Kudu, RDD
in Spark)
• Абстрактные (Pig, Pipeline Spark)
• SQL – подобные (Hive, Impala, Spark SQL)
• Для обработки графов (Giraph, GraphX)
• Машинное обучение (MLlib, Mahout)
• Stream (Spark Streaming, Storm)
Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15
Важнейшие части «слона»
• Hadoop Commons
• Hadoop Clients
• HDFS – Hadoop Distributed File System
• Yarn – Yet Another Resource Negotiator
• MapReduce
Как начать?
Как начать?
С выбора дистрибутива, конечно
Важнейшие части «слона»
• Apache Hadoop 2.7.1
• Hortonworks HDP 2.3 2.7.1
• Cloudera CDH 5.4.4 2.6.0
• MapR 5.0 2.7.0
• Pivotal HD 3.0 2.6.0
• other
HDP != Hadoop
HDP != Hadoop
Русские ставят вручную на первый
попавшийся сервер
Нравится много писать в консоли?
Big Data on your local machine : How to install Hadoop 2.6.0
Режим установки local
• Однопоточная Java
• Легко дебажить даже из IDE
• Репликации нет
• HDFS учить не нужно
• dfs.replication=“1”;
• fs.defaultFS=“file:///”;
fs.default.name=“file:///”;
• mapreduce.framework.name=“local”
Режим установки Pseudo-distributed
• Все на одной ноде
• Репликации нет
• Каждому демону из Hadoop соответсвует
thread из Java
• Yarn выполняет свою работу
Режим установки Fully-distributed
• Репликация какая надо
• Master/slave ноды
• Yarn выполняет свою работу
Топология Hadoop
Best Practices
• DataNodes, NodeManagers and RegionServers
обычно разворачиваются исходя из
стратегии DataLocality
Best Practices
• DataNodes, NodeManagers and RegionServers
обычно разворачиваются исходя из
стратегии DataLocality
• Обычно каждый блок данных реплицируется
минимум трижды в действительно разных
местах
Best Practices
• DataNodes, NodeManagers and RegionServers
обычно разворачиваются исходя из
стратегии DataLocality
• Обычно каждый блок данных реплицируется
минимум трижды в действительно разных
местах
• Если можно, ставим балансировщик
Best Practices
• DataNodes, NodeManagers and RegionServers
обычно разворачиваются исходя из
стратегии DataLocality
• Обычно каждый блок данных реплицируется
минимум трижды в действительно разных
местах
• Если можно, ставим балансировщик
• Изучаем особенности HDFS 
Рекомендации по мощностям
• 64GB RAM для NameNode позволяют
адресоваться ~100M files в HDFS
• 256 GB RAM для data nodes и интенсивными
in-memory operations (например Spark
executors, или in-memory DBs)
• Минимум 8-16 cores CPUs
• Минимум 4 дисков (для master nodes) и 6-12
дисков (для data nodes) для IO optimization; +
1 отдельный диск для OS
HDFS
Hadoop Distributed File System
Hortonworks утверждает, что
существуют кластера на 200 PB, 4500
машин, > 10^6 файлов и HDFS
нормально так работает
NameNode
• Вообще это отдельные процессы, которые
умеют жить как на одной, так и на разных
машинах
• В кластере только одна NameNode, но это не
SPOF!
• Есть StanbyNameNode, она страхует
• Если NameNode недоступна, то недоступен и
HDFS кластер
NameNode рулит и разруливает!
DataNode
• DataNode может быть сколько угодно, чем
больше, тем лучше
• Можно убирать и добавлять их без особого
ущерба
• DataNode сама отвечает на запросы
• И слушается NameNode, когда надо умереть,
реплицировать что-то или удалить реплику
Что нужно уметь и знать!
• Перемещать данные между HDFS и обычной
FS: hdfs fs -copyFromLocal ; -copyToLocal
• Удалять/создавать директории
• Управлять правами на файлы/папки
• Диагностировать
• Проверять наличие свободного пространства
Все это при помощи команд, похожих на Linux
Укротите демонов!
• /logs
• /logLevel
• /stacks
• /metrics
• /metrics?format=json
MapReduce
MapReduce на уровне языков
Language Code sample
Java 8 Integer totalAge = persons
.stream()
.map(Person::getAge)
.reduce( 0, (a, b) -> a + b);
Scala val totalAge = persons
.map( (p: Person) => p.getAge )
.reduce( _ + _ )
Python totalAge = reduce(
(lambda a, b: a + b),
list( map(lambda p: p.getAge, persons) )
)
MapReduce для WordCount
WordCount, отлитый в Java : Mapper
WordCount, отлитый в Java : Reducer
WordCount, отлитый в Java : Runner
WordCount, отлитый в Java : Runner
Как запустить это хозяйство?
• Сделать jar
Как запустить это хозяйство?
• Сделать jar
• Запустить его на удаленной машине, где есть Hadoop
Как запустить это хозяйство?
• Сделать jar
• Запустить его на удаленной машине, где есть Hadoop
• hadoop jar your-jar.jar <packagename>.YourDriver –
Ddir.input=/bla/bla/bla -Dmapred.reduce.tasks=4
Как запустить это хозяйство?
• Сделать jar
• Запустить его на удаленной машине, где есть Hadoop
• hadoop jar your-jar.jar <packagename>.YourDriver –
Ddir.input=/bla/bla/bla -Dmapred.reduce.tasks=4
• В коде драйвера работай с этими константами
Как запустить это хозяйство?
• Сделать jar
• Запустить его на удаленной машине, где есть Hadoop
• hadoop jar your-jar.jar <packagename>.YourDriver –
Ddir.input=/bla/bla/bla -Dmapred.reduce.tasks=4
• В коде драйвера работай с этими константами
• String hdfsInputFileOrDirectory =
configuration.get(“dir.input”);
Запустили? Упало! Нужны тесты 
Вот бы нам JUnit…
Запустили? Упало! Нужны тесты 
public class MRUnitHelloWorld {
MapDriver<LongWritable, Text, Text, IntWritable> mapDriver;
@Before
public void setUp() {
WordMapper mapper = new WordMapper();
mapDriver = new MapDriver<LongWritable, Text, Text, IntWritable>();
mapDriver.setMapper(mapper);
}
@Test
public void testMapper() {
mapDriver.withInput(new LongWritable(1), new Text("cat dog"));
mapDriver.withOutput(new Text("cat"), new IntWritable(1));
mapDriver.withOutput(new Text("dog"), new IntWritable(1));
mapDriver.runTest();
}
}
Hadoop Jobs
Не забывай о JVM!
Но всеми этим фронтами кто-то
должен управлять, говорить кому
когда что делать…
Скелет Hadoop, который пришелся
по вкусу всем!
YARN
MapReduce – это всего лишь одно
приложение, которое приходит к
всемогущему YARN за ресурсами для
своих авантюр
YARN общается с HDFS, чтобы
задействовать DataLocality и
оптимизировать свои ресурсы
YARN управляет жизненным циклом,
нудно, но все работает!
Как извлекать факты для анализа
данных из Hadoop?
Свин и шмелле летят на помощь!
Pig
Подсчет треугольников в графе
Pig Scripts -> MapReduce jobs
Сделаем отчет на Pig
dem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int,
gender:int, region:int);
Сделаем отчет на Pig
dem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int,
gender:int, region:int);
logins = LOAD '/ok/logins/*' AS (ts:chararray, userid:int, clientType:int,
success:boolean, geoIp:int, userAgent:int);
Сделаем отчет на Pig
dem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int,
gender:int, region:int);
logins = LOAD '/ok/logins/*' AS (ts:chararray, userid:int, clientType:int,
success:boolean, geoIp:int, userAgent:int);
by_user_success = GROUP logins BY (userid, success);
Сделаем отчет на Pig
dem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int,
gender:int, region:int);
logins = LOAD '/ok/logins/*' AS (ts:chararray, userid:int, clientType:int,
success:boolean, geoIp:int, userAgent:int);
by_user_success = GROUP logins BY (userid, success);
logins_data = FOREACH by_user_success
GENERATE FLATTEN (group) as (userid, success),
COUNT(logins.ts) as login_amount;
Сделаем отчет на Pig
dem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int,
gender:int, region:int);
logins = LOAD '/ok/logins/*' AS (ts:chararray, userid:int, clientType:int,
success:boolean, geoIp:int, userAgent:int);
by_user_success = GROUP logins BY (userid, success);
logins_data = FOREACH by_user_success
GENERATE FLATTEN (group) as (userid, success),
COUNT(logins.ts) as login_amount;
DESCRIBE logins_data;
Сделаем отчет на Pig
/* amount of logins by regions */
dem_logins= JOIN dem BY id, logins_data BY userid;
Сделаем отчет на Pig
/* amount of logins by regions */
dem_logins= JOIN dem BY id, logins_data BY userid;
by_region = GROUP dem_logins BY (region, gender, success);
Сделаем отчет на Pig
/* amount of logins by regions */
dem_logins= JOIN dem BY id, logins_data BY userid;
by_region = GROUP dem_logins BY (region, gender, success);
result = FOREACH by_region
GENERATE FLATTEN (group) as (region, gender, success),
SUM(dem_logins.login_amount) as login_amount;
Сделаем отчет на Pig
/* amount of logins by regions */
dem_logins= JOIN dem BY id, logins_data BY userid;
by_region = GROUP dem_logins BY (region, gender, success);
result = FOREACH by_region
GENERATE FLATTEN (group) as (region, gender, success),
SUM(dem_logins.login_amount) as login_amount;
DESCRIBE result;
Сделаем отчет на Pig
/* amount of logins by regions */
dem_logins= JOIN dem BY id, logins_data BY userid;
by_region = GROUP dem_logins BY (region, gender, success);
result = FOREACH by_region
GENERATE FLATTEN (group) as (region, gender, success),
SUM(dem_logins.login_amount) as login_amount;
DESCRIBE result;
STORE result INTO '/ok/dem_logins_by_region' using PigStorage(',');
Да по-любому надо тюнить!
set default_parallel 64;
set job.name Calculate_number_of_users;
set mapred.child.java.opts -Xmx1024m
dem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int,
gender:int, region:int);
….
Hive
Как так? Снова SQL?
Да, дружище, он никуда не уходил, стоял за дверью…
Причины триумфа Hive
• Иллюзия структуры
• Единый язык для различных хранилищ
• SQL всем знаком
• Вполне реален ответ за небольшое время
• MapReduce слишком сложен
• Иллюзия JOINs
Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15
JOINы превращаются.. в элегантные
шорты
Spark
Почему мамонты вымирают?
• Они слишком часто сохраняются на диск
Почему мамонты вымирают?
• Они слишком часто сохраняются на диск
• Слишком много людей сидят на абстракциях,
а не пишут MR jobs
Почему мамонты вымирают?
• Они слишком часто сохраняются на диск
• Слишком много людей сидят на абстракциях,
а не пишут MR jobs
• Слишком плох MR для итерационных
вычислений
Почему мамонты вымирают?
• Они слишком часто сохраняются на диск
• Слишком много людей сидят на абстракциях,
а не пишут MR jobs
• Слишком плох MR для итерационных
вычислений
• Слишком долго MR был на коне
Почему мамонты вымирают?
• Они слишком часто сохраняются на диск
• Слишком много людей сидят на абстракциях,
а не пишут MR jobs
• Слишком плох MR для итерационных
вычислений
• Слишком долго MR был на коне
• И да, Google его больше не использует
Мы можем комбинировать подходы
для всех источников данных
val points = spark.sql("select latitude, longitude
from tweets")
val model = KMeans.train(points, 10)
WordCount на Scala + Spark
val conf = new SparkConf()
.setAppName(appName)
.setMaster(master)
WordCount на Scala + Spark
val conf = new SparkConf()
.setAppName(appName)
.setMaster(master)
val spark = new SparkContext(conf)
WordCount на Scala + Spark
val conf = new SparkConf()
.setAppName(appName)
.setMaster(master)
val spark = new SparkContext(conf)
val file = spark.textFile("…")
res.saveAsTextFile("…");
WordCount на Scala + Spark
val conf = new SparkConf()
.setAppName(appName)
.setMaster(master)
val spark = new SparkContext(conf)
val file = spark.textFile("…")
Тут как напишем сейчас MR!
res.saveAsTextFile("…");
WordCount на Scala + Spark
val conf = new SparkConf()
.setAppName(appName)
.setMaster(master)
val spark = new SparkContext(conf)
val file = spark.textFile("…")
val res = file
.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey(_+_)
res.saveAsTextFile("…");
Основные компоненты
Типичный итерационный алгоритм
до и после..
10x – 100x
Spark – это не царская дорога к
большим данным
Статья о том, что меня раздражает в Spark
Контакты
• https://twitter.com/zaleslaw
• https://twitter.com/BigDataRussia
• http://vk.com/big_data_russia Big Data Russia
• http://vk.com/java_jvm

More Related Content

What's hot (20)

PDF
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
Ontico
 
PDF
Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (U...
Ontico
 
PDF
Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...
Ontico
 
PDF
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Ontico
 
PPTX
BigПочта: как мы строили DataLake в Почте России / Алексей Вовченко (Luxoft)
Ontico
 
PDF
Лекция 12. Spark
Technopark
 
PPTX
Lambda architecture для realtime-аналитики — риски и преимущества / Николай Г...
Ontico
 
PDF
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Alexey Zinoviev
 
PDF
Электронная коммерция: от Hadoop к Spark Scala
Roman Zykov
 
PDF
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Oleg Tsarev
 
PDF
Александр Соловьёв, Griddynamics.com
Ontico
 
PDF
NewSQL: SQL никуда не уходит / Константин Осипов (tarantool.org)
Ontico
 
PPTX
Кирилл Алешин - Big Data и Lambda архитектура на практике
IT Share
 
PDF
My talk on LeoFS, Highload++ 2014
Alex Chistyakov
 
PDF
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
MoscowDataFest
 
PDF
Лекция 14. Hadoop в Поиске Mail.Ru
Technopark
 
PDF
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Ontico
 
PDF
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Ontico
 
PDF
Pulsedb — система хранения временных рядов
Max Lapshin
 
PDF
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
Ontico
 
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
Ontico
 
Rspamd — высокопроизводительная система фильтрации спама / Стахов Всеволод (U...
Ontico
 
Брокер сообщений Kafka в условиях повышенной нагрузки / Артём Выборнов (Rambl...
Ontico
 
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Ontico
 
BigПочта: как мы строили DataLake в Почте России / Алексей Вовченко (Luxoft)
Ontico
 
Лекция 12. Spark
Technopark
 
Lambda architecture для realtime-аналитики — риски и преимущества / Николай Г...
Ontico
 
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Alexey Zinoviev
 
Электронная коммерция: от Hadoop к Spark Scala
Roman Zykov
 
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Oleg Tsarev
 
Александр Соловьёв, Griddynamics.com
Ontico
 
NewSQL: SQL никуда не уходит / Константин Осипов (tarantool.org)
Ontico
 
Кирилл Алешин - Big Data и Lambda архитектура на практике
IT Share
 
My talk on LeoFS, Highload++ 2014
Alex Chistyakov
 
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
MoscowDataFest
 
Лекция 14. Hadoop в Поиске Mail.Ru
Technopark
 
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Ontico
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Ontico
 
Pulsedb — система хранения временных рядов
Max Lapshin
 
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
Ontico
 

Viewers also liked (20)

PDF
JPoint'15 Mom, I so wish Hibernate for my NoSQL database...
Alexey Zinoviev
 
PDF
Java BigData Full Stack Development (version 2.0)
Alexey Zinoviev
 
PDF
Big Data Developers Moscow Meetup 1 - sql on hadoop
bddmoscow
 
PDF
Introductory Keynote at Hadoop Workshop by Ospcon (2014)
Andrei Nikolaenko
 
ODP
JBoss seam 2 part
Andrey Bratukhin
 
PPTX
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
Shamim bhuiyan
 
PDF
Building a Location Based Social Graph in Spark at InMobi-(Seinjuti Chatterje...
Spark Summit
 
PDF
Apache spark
Anton Anokhin
 
PDF
Практика миграции реляционных баз данных в экосистему Hadoop
Yury Petrov
 
PDF
A22 Introduction to DTrace by Kyle Hailey
Insight Technology, Inc.
 
PDF
Interactive Graph Analytics with Spark-(Daniel Darabos, Lynx Analytics)
Spark Summit
 
PDF
JavaDayKiev'15 Java in production for Data Mining Research projects
Alexey Zinoviev
 
PDF
Community detection (Поиск сообществ в графах)
Kirill Rybachuk
 
PDF
GraphFrames: Graph Queries In Spark SQL
Spark Summit
 
PDF
Joker'15 Java straitjackets for MongoDB
Alexey Zinoviev
 
PPTX
Using spark for timeseries graph analytics
Sigmoid
 
PDF
Building a Graph of all US Businesses Using Spark Technologies by Alexis Roos
Spark Summit
 
ODP
Graphs are everywhere! Distributed graph computing with Spark GraphX
Andrea Iacono
 
PPTX
Hadoop Eagle - Real Time Monitoring Framework for eBay Hadoop
DataWorks Summit
 
PDF
Hadoop Jungle
Alexey Zinoviev
 
JPoint'15 Mom, I so wish Hibernate for my NoSQL database...
Alexey Zinoviev
 
Java BigData Full Stack Development (version 2.0)
Alexey Zinoviev
 
Big Data Developers Moscow Meetup 1 - sql on hadoop
bddmoscow
 
Introductory Keynote at Hadoop Workshop by Ospcon (2014)
Andrei Nikolaenko
 
JBoss seam 2 part
Andrey Bratukhin
 
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
Shamim bhuiyan
 
Building a Location Based Social Graph in Spark at InMobi-(Seinjuti Chatterje...
Spark Summit
 
Apache spark
Anton Anokhin
 
Практика миграции реляционных баз данных в экосистему Hadoop
Yury Petrov
 
A22 Introduction to DTrace by Kyle Hailey
Insight Technology, Inc.
 
Interactive Graph Analytics with Spark-(Daniel Darabos, Lynx Analytics)
Spark Summit
 
JavaDayKiev'15 Java in production for Data Mining Research projects
Alexey Zinoviev
 
Community detection (Поиск сообществ в графах)
Kirill Rybachuk
 
GraphFrames: Graph Queries In Spark SQL
Spark Summit
 
Joker'15 Java straitjackets for MongoDB
Alexey Zinoviev
 
Using spark for timeseries graph analytics
Sigmoid
 
Building a Graph of all US Businesses Using Spark Technologies by Alexis Roos
Spark Summit
 
Graphs are everywhere! Distributed graph computing with Spark GraphX
Andrea Iacono
 
Hadoop Eagle - Real Time Monitoring Framework for eBay Hadoop
DataWorks Summit
 
Hadoop Jungle
Alexey Zinoviev
 
Ad

Similar to Мастер-класс по BigData Tools для HappyDev'15 (20)

PDF
Rapid Deployment of Hadoop Development Environments
Andrei Nikolaenko
 
PDF
Alex Krasheninnikov – Hadoop High Availability
Badoo Development
 
PDF
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
IT Event
 
PDF
Cостав дистрибутва Hortonworks data platform 2.3
Евгений Плакса
 
ODP
Apache Hadoop
Ivan Blinkov
 
PDF
Hadoop presentation
Vlad Orlov
 
PDF
HPC vs Big Data (Russian version)
Irina Fedulova
 
PDF
С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)
Ontico
 
PDF
С чего начать внедрение Hadoop в компании. Доклад Алексея Еремихина (Badoo).
Badoo Development
 
PDF
Лекция 2. Основы Hadoop
Technopark
 
PDF
Spark overview (18.06.2015)
bddmoscow
 
PPT
ADD2010: Обработка большого объема данных на платформеApache Hadoop
Vladimir Klimontovich
 
PPTX
2015-12-05 Алексей Зиновьев - Когда все данные станут большими...
HappyDev
 
PDF
Apache Spark — Егор Пахомов
Yandex
 
PDF
12 HappyDev-lite-2014. Иван Погудин, Анатолий Никулин. Решение задач, связан...
HappyDev-lite
 
PDF
10 HappyDev-lite'14 Иван Погудин, Анатолий Никулин. Решение задач, связанных...
HappyDev
 
PDF
13 - Hadoop. Парадигма Spark
Roman Brovko
 
PPT
DUMP-2013 Наука и жизнь - Использование Hadoop в машинном обучении - Созыкин ...
it-people
 
PDF
Курс "Хранение и Обработка больших данны". Лекция 5 YARN
Pavel Mezentsev
 
Rapid Deployment of Hadoop Development Environments
Andrei Nikolaenko
 
Alex Krasheninnikov – Hadoop High Availability
Badoo Development
 
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
IT Event
 
Cостав дистрибутва Hortonworks data platform 2.3
Евгений Плакса
 
Apache Hadoop
Ivan Blinkov
 
Hadoop presentation
Vlad Orlov
 
HPC vs Big Data (Russian version)
Irina Fedulova
 
С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)
Ontico
 
С чего начать внедрение Hadoop в компании. Доклад Алексея Еремихина (Badoo).
Badoo Development
 
Лекция 2. Основы Hadoop
Technopark
 
Spark overview (18.06.2015)
bddmoscow
 
ADD2010: Обработка большого объема данных на платформеApache Hadoop
Vladimir Klimontovich
 
2015-12-05 Алексей Зиновьев - Когда все данные станут большими...
HappyDev
 
Apache Spark — Егор Пахомов
Yandex
 
12 HappyDev-lite-2014. Иван Погудин, Анатолий Никулин. Решение задач, связан...
HappyDev-lite
 
10 HappyDev-lite'14 Иван Погудин, Анатолий Никулин. Решение задач, связанных...
HappyDev
 
13 - Hadoop. Парадигма Spark
Roman Brovko
 
DUMP-2013 Наука и жизнь - Использование Hadoop в машинном обучении - Созыкин ...
it-people
 
Курс "Хранение и Обработка больших данны". Лекция 5 YARN
Pavel Mezentsev
 
Ad

More from Alexey Zinoviev (20)

PDF
Kafka pours and Spark resolves
Alexey Zinoviev
 
PDF
Joker'16 Spark 2 (API changes; Structured Streaming; Encoders)
Alexey Zinoviev
 
PDF
Python's slippy path and Tao of thick Pandas: give my data, Rrrrr...
Alexey Zinoviev
 
PDF
Thorny path to the Large-Scale Graph Processing (Highload++, 2014)
Alexey Zinoviev
 
PDF
Joker'14 Java as a fundamental working tool of the Data Scientist
Alexey Zinoviev
 
PDF
First steps in Data Mining Kindergarten
Alexey Zinoviev
 
PDF
EST: Smart rate (Effective recommendation system for Taxi drivers based on th...
Alexey Zinoviev
 
PDF
Android Geo Apps in Soviet Russia: Latitude and longitude find you
Alexey Zinoviev
 
PDF
Keynote on JavaDay Omsk 2014 about new features in Java 8
Alexey Zinoviev
 
PDF
Big data algorithms and data structures for large scale graphs
Alexey Zinoviev
 
PDF
"Говнокод-шоу"
Alexey Zinoviev
 
PDF
Алгоритмы и структуры данных BigData для графов большой размерности
Alexey Zinoviev
 
PDF
ALMADA 2013 (computer science school by Yandex and Microsoft Research)
Alexey Zinoviev
 
PDF
GDG Devfest Omsk 2013. Year of events!
Alexey Zinoviev
 
PDF
How to port JavaScript library to Android and iOS
Alexey Zinoviev
 
PDF
Поездка на IT-DUMP 2012
Alexey Zinoviev
 
PDF
MyBatis и Hibernate на одном проекте. Как подружить?
Alexey Zinoviev
 
PDF
Google I/O туда и обратно.
Alexey Zinoviev
 
PDF
Google Maps. Zinoviev Alexey.
Alexey Zinoviev
 
PDF
Google Docs. Zinoviev Alexey
Alexey Zinoviev
 
Kafka pours and Spark resolves
Alexey Zinoviev
 
Joker'16 Spark 2 (API changes; Structured Streaming; Encoders)
Alexey Zinoviev
 
Python's slippy path and Tao of thick Pandas: give my data, Rrrrr...
Alexey Zinoviev
 
Thorny path to the Large-Scale Graph Processing (Highload++, 2014)
Alexey Zinoviev
 
Joker'14 Java as a fundamental working tool of the Data Scientist
Alexey Zinoviev
 
First steps in Data Mining Kindergarten
Alexey Zinoviev
 
EST: Smart rate (Effective recommendation system for Taxi drivers based on th...
Alexey Zinoviev
 
Android Geo Apps in Soviet Russia: Latitude and longitude find you
Alexey Zinoviev
 
Keynote on JavaDay Omsk 2014 about new features in Java 8
Alexey Zinoviev
 
Big data algorithms and data structures for large scale graphs
Alexey Zinoviev
 
"Говнокод-шоу"
Alexey Zinoviev
 
Алгоритмы и структуры данных BigData для графов большой размерности
Alexey Zinoviev
 
ALMADA 2013 (computer science school by Yandex and Microsoft Research)
Alexey Zinoviev
 
GDG Devfest Omsk 2013. Year of events!
Alexey Zinoviev
 
How to port JavaScript library to Android and iOS
Alexey Zinoviev
 
Поездка на IT-DUMP 2012
Alexey Zinoviev
 
MyBatis и Hibernate на одном проекте. Как подружить?
Alexey Zinoviev
 
Google I/O туда и обратно.
Alexey Zinoviev
 
Google Maps. Zinoviev Alexey.
Alexey Zinoviev
 
Google Docs. Zinoviev Alexey
Alexey Zinoviev
 

Мастер-класс по BigData Tools для HappyDev'15

  • 3. Контакты • https://twitter.com/zaleslaw • https://twitter.com/BigDataRussia • http://vk.com/big_data_russia Big Data Russia • http://vk.com/java_jvm
  • 5. И вот, что я скажу тебе, JavaScript
  • 6. И вот, что я скажу тебе, JavaScript
  • 7. Мне нравится, когда все на JVM крутится!
  • 8. Типичный BigData кластер • 450 машин • Master Nodes (24 ядра, 158 Gb RAM). • Data Nodes (24|32 ядра, 96|128 Gb RAM). • Средняя YARN Queue utilization 85% (по дням). • 12Pb – емкость хранения данных
  • 9. Когда мы говорим, что имеем дело с BigData решением • Когда перед глазами смесь архитектурных подходов, таких как Kappa, Lambda, Data Lake • Когда мы имеем дело со стеком технологий, таких как Hadoop, Kafka, Spark, Storm, Samza, HBase, Cassandra, Titan, GridGain • Когда анализ логов этих систем – задача не менее серьезного уровня
  • 10. ScaleUp vs ScaleOut 16 CPUs 16 CPUs 16 CPUsScale - Out16 CPUs 48 CPUsScale - Up16 CPUs
  • 11. Приходит время, данные в датацентры улетают… I 50GB 300GB 5TB
  • 12. Приходит время, данные в датацентры улетают…
  • 14. Мыть голову при помощи нового шампуня «Репликация»!
  • 15. Если вы слишком увлечётесь гонкой инструментов, то получится..
  • 16. Типичный многосервисный проект, где основной болью будет конфликт разных версий Real-Time Data-Marts Batch Data-Marts Relations Graph Ontology Metadata Search Index Events & Alarms Real-time Dashboarding Events & Alarms All Raw Data backup is stored here Real-time Data Ingestion Batch Data Ingestion Real-Time ETL & CEP Batch ETL & Raw Area Scheduler Internal External Social HDFS → CFS as an option Time-Series Data Titan & KairosDB store data in Cassandra Push Events & Alarms (Email, SNMP etc.)
  • 19. Пора дать определение! • Hadoop != MapReduce • Hadoop – это фреймворк
  • 20. Пора дать определение! • Hadoop != MapReduce • Hadoop – это фреймворк • Фреймворк для обработки больших массивов данных
  • 21. Пора дать определение! • Hadoop != MapReduce • Hadoop – это фреймворк • Фреймворк для обработки больших массивов данных • Который использует простые модели и парадигмы программирования
  • 22. Пора дать определение! • Hadoop != MapReduce • Hadoop – это фреймворк • Фреймворк для обработки больших массивов данных • Который использует простые модели и парадигмы программирования • Скрывая от нас всю самую сложную часть с параллелизацией, перемещением данных и
  • 23. Фреймворке в семействе Hadoop • Универсальные (MapReduce, Tez, Kudu, RDD in Spark)
  • 24. Фреймворке в семействе Hadoop • Универсальные (MapReduce, Tez, Kudu, RDD in Spark) • Абстрактные (Pig, Pipeline Spark)
  • 25. Фреймворке в семействе Hadoop • Универсальные (MapReduce, Tez, Kudu, RDD in Spark) • Абстрактные (Pig, Pipeline Spark) • SQL – подобные (Hive, Impala, Spark SQL)
  • 26. Фреймворке в семействе Hadoop • Универсальные (MapReduce, Tez, Kudu, RDD in Spark) • Абстрактные (Pig, Pipeline Spark) • SQL – подобные (Hive, Impala, Spark SQL) • Для обработки графов (Giraph, GraphX)
  • 27. Фреймворке в семействе Hadoop • Универсальные (MapReduce, Tez, Kudu, RDD in Spark) • Абстрактные (Pig, Pipeline Spark) • SQL – подобные (Hive, Impala, Spark SQL) • Для обработки графов (Giraph, GraphX) • Машинное обучение (MLlib, Mahout)
  • 28. Фреймворке в семействе Hadoop • Универсальные (MapReduce, Tez, Kudu, RDD in Spark) • Абстрактные (Pig, Pipeline Spark) • SQL – подобные (Hive, Impala, Spark SQL) • Для обработки графов (Giraph, GraphX) • Машинное обучение (MLlib, Mahout) • Stream (Spark Streaming, Storm)
  • 31. Важнейшие части «слона» • Hadoop Commons • Hadoop Clients • HDFS – Hadoop Distributed File System • Yarn – Yet Another Resource Negotiator • MapReduce
  • 33. Как начать? С выбора дистрибутива, конечно
  • 34. Важнейшие части «слона» • Apache Hadoop 2.7.1 • Hortonworks HDP 2.3 2.7.1 • Cloudera CDH 5.4.4 2.6.0 • MapR 5.0 2.7.0 • Pivotal HD 3.0 2.6.0 • other
  • 37. Русские ставят вручную на первый попавшийся сервер
  • 38. Нравится много писать в консоли? Big Data on your local machine : How to install Hadoop 2.6.0
  • 39. Режим установки local • Однопоточная Java • Легко дебажить даже из IDE • Репликации нет • HDFS учить не нужно • dfs.replication=“1”; • fs.defaultFS=“file:///”; fs.default.name=“file:///”; • mapreduce.framework.name=“local”
  • 40. Режим установки Pseudo-distributed • Все на одной ноде • Репликации нет • Каждому демону из Hadoop соответсвует thread из Java • Yarn выполняет свою работу
  • 41. Режим установки Fully-distributed • Репликация какая надо • Master/slave ноды • Yarn выполняет свою работу
  • 43. Best Practices • DataNodes, NodeManagers and RegionServers обычно разворачиваются исходя из стратегии DataLocality
  • 44. Best Practices • DataNodes, NodeManagers and RegionServers обычно разворачиваются исходя из стратегии DataLocality • Обычно каждый блок данных реплицируется минимум трижды в действительно разных местах
  • 45. Best Practices • DataNodes, NodeManagers and RegionServers обычно разворачиваются исходя из стратегии DataLocality • Обычно каждый блок данных реплицируется минимум трижды в действительно разных местах • Если можно, ставим балансировщик
  • 46. Best Practices • DataNodes, NodeManagers and RegionServers обычно разворачиваются исходя из стратегии DataLocality • Обычно каждый блок данных реплицируется минимум трижды в действительно разных местах • Если можно, ставим балансировщик • Изучаем особенности HDFS 
  • 47. Рекомендации по мощностям • 64GB RAM для NameNode позволяют адресоваться ~100M files в HDFS • 256 GB RAM для data nodes и интенсивными in-memory operations (например Spark executors, или in-memory DBs) • Минимум 8-16 cores CPUs • Минимум 4 дисков (для master nodes) и 6-12 дисков (для data nodes) для IO optimization; + 1 отдельный диск для OS
  • 48. HDFS
  • 49. Hadoop Distributed File System Hortonworks утверждает, что существуют кластера на 200 PB, 4500 машин, > 10^6 файлов и HDFS нормально так работает
  • 50. NameNode • Вообще это отдельные процессы, которые умеют жить как на одной, так и на разных машинах • В кластере только одна NameNode, но это не SPOF! • Есть StanbyNameNode, она страхует • Если NameNode недоступна, то недоступен и HDFS кластер
  • 51. NameNode рулит и разруливает!
  • 52. DataNode • DataNode может быть сколько угодно, чем больше, тем лучше • Можно убирать и добавлять их без особого ущерба • DataNode сама отвечает на запросы • И слушается NameNode, когда надо умереть, реплицировать что-то или удалить реплику
  • 53. Что нужно уметь и знать! • Перемещать данные между HDFS и обычной FS: hdfs fs -copyFromLocal ; -copyToLocal • Удалять/создавать директории • Управлять правами на файлы/папки • Диагностировать • Проверять наличие свободного пространства Все это при помощи команд, похожих на Linux
  • 54. Укротите демонов! • /logs • /logLevel • /stacks • /metrics • /metrics?format=json
  • 56. MapReduce на уровне языков Language Code sample Java 8 Integer totalAge = persons .stream() .map(Person::getAge) .reduce( 0, (a, b) -> a + b); Scala val totalAge = persons .map( (p: Person) => p.getAge ) .reduce( _ + _ ) Python totalAge = reduce( (lambda a, b: a + b), list( map(lambda p: p.getAge, persons) ) )
  • 62. Как запустить это хозяйство? • Сделать jar
  • 63. Как запустить это хозяйство? • Сделать jar • Запустить его на удаленной машине, где есть Hadoop
  • 64. Как запустить это хозяйство? • Сделать jar • Запустить его на удаленной машине, где есть Hadoop • hadoop jar your-jar.jar <packagename>.YourDriver – Ddir.input=/bla/bla/bla -Dmapred.reduce.tasks=4
  • 65. Как запустить это хозяйство? • Сделать jar • Запустить его на удаленной машине, где есть Hadoop • hadoop jar your-jar.jar <packagename>.YourDriver – Ddir.input=/bla/bla/bla -Dmapred.reduce.tasks=4 • В коде драйвера работай с этими константами
  • 66. Как запустить это хозяйство? • Сделать jar • Запустить его на удаленной машине, где есть Hadoop • hadoop jar your-jar.jar <packagename>.YourDriver – Ddir.input=/bla/bla/bla -Dmapred.reduce.tasks=4 • В коде драйвера работай с этими константами • String hdfsInputFileOrDirectory = configuration.get(“dir.input”);
  • 67. Запустили? Упало! Нужны тесты  Вот бы нам JUnit…
  • 68. Запустили? Упало! Нужны тесты  public class MRUnitHelloWorld { MapDriver<LongWritable, Text, Text, IntWritable> mapDriver; @Before public void setUp() { WordMapper mapper = new WordMapper(); mapDriver = new MapDriver<LongWritable, Text, Text, IntWritable>(); mapDriver.setMapper(mapper); } @Test public void testMapper() { mapDriver.withInput(new LongWritable(1), new Text("cat dog")); mapDriver.withOutput(new Text("cat"), new IntWritable(1)); mapDriver.withOutput(new Text("dog"), new IntWritable(1)); mapDriver.runTest(); } }
  • 71. Но всеми этим фронтами кто-то должен управлять, говорить кому когда что делать…
  • 72. Скелет Hadoop, который пришелся по вкусу всем!
  • 73. YARN
  • 74. MapReduce – это всего лишь одно приложение, которое приходит к всемогущему YARN за ресурсами для своих авантюр
  • 75. YARN общается с HDFS, чтобы задействовать DataLocality и оптимизировать свои ресурсы
  • 76. YARN управляет жизненным циклом, нудно, но все работает!
  • 77. Как извлекать факты для анализа данных из Hadoop?
  • 78. Свин и шмелле летят на помощь!
  • 79. Pig
  • 81. Pig Scripts -> MapReduce jobs
  • 82. Сделаем отчет на Pig dem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int, gender:int, region:int);
  • 83. Сделаем отчет на Pig dem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int, gender:int, region:int); logins = LOAD '/ok/logins/*' AS (ts:chararray, userid:int, clientType:int, success:boolean, geoIp:int, userAgent:int);
  • 84. Сделаем отчет на Pig dem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int, gender:int, region:int); logins = LOAD '/ok/logins/*' AS (ts:chararray, userid:int, clientType:int, success:boolean, geoIp:int, userAgent:int); by_user_success = GROUP logins BY (userid, success);
  • 85. Сделаем отчет на Pig dem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int, gender:int, region:int); logins = LOAD '/ok/logins/*' AS (ts:chararray, userid:int, clientType:int, success:boolean, geoIp:int, userAgent:int); by_user_success = GROUP logins BY (userid, success); logins_data = FOREACH by_user_success GENERATE FLATTEN (group) as (userid, success), COUNT(logins.ts) as login_amount;
  • 86. Сделаем отчет на Pig dem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int, gender:int, region:int); logins = LOAD '/ok/logins/*' AS (ts:chararray, userid:int, clientType:int, success:boolean, geoIp:int, userAgent:int); by_user_success = GROUP logins BY (userid, success); logins_data = FOREACH by_user_success GENERATE FLATTEN (group) as (userid, success), COUNT(logins.ts) as login_amount; DESCRIBE logins_data;
  • 87. Сделаем отчет на Pig /* amount of logins by regions */ dem_logins= JOIN dem BY id, logins_data BY userid;
  • 88. Сделаем отчет на Pig /* amount of logins by regions */ dem_logins= JOIN dem BY id, logins_data BY userid; by_region = GROUP dem_logins BY (region, gender, success);
  • 89. Сделаем отчет на Pig /* amount of logins by regions */ dem_logins= JOIN dem BY id, logins_data BY userid; by_region = GROUP dem_logins BY (region, gender, success); result = FOREACH by_region GENERATE FLATTEN (group) as (region, gender, success), SUM(dem_logins.login_amount) as login_amount;
  • 90. Сделаем отчет на Pig /* amount of logins by regions */ dem_logins= JOIN dem BY id, logins_data BY userid; by_region = GROUP dem_logins BY (region, gender, success); result = FOREACH by_region GENERATE FLATTEN (group) as (region, gender, success), SUM(dem_logins.login_amount) as login_amount; DESCRIBE result;
  • 91. Сделаем отчет на Pig /* amount of logins by regions */ dem_logins= JOIN dem BY id, logins_data BY userid; by_region = GROUP dem_logins BY (region, gender, success); result = FOREACH by_region GENERATE FLATTEN (group) as (region, gender, success), SUM(dem_logins.login_amount) as login_amount; DESCRIBE result; STORE result INTO '/ok/dem_logins_by_region' using PigStorage(',');
  • 92. Да по-любому надо тюнить! set default_parallel 64; set job.name Calculate_number_of_users; set mapred.child.java.opts -Xmx1024m dem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int, gender:int, region:int); ….
  • 93. Hive
  • 94. Как так? Снова SQL? Да, дружище, он никуда не уходил, стоял за дверью…
  • 95. Причины триумфа Hive • Иллюзия структуры • Единый язык для различных хранилищ • SQL всем знаком • Вполне реален ответ за небольшое время • MapReduce слишком сложен • Иллюзия JOINs
  • 98. JOINы превращаются.. в элегантные шорты
  • 99. Spark
  • 100. Почему мамонты вымирают? • Они слишком часто сохраняются на диск
  • 101. Почему мамонты вымирают? • Они слишком часто сохраняются на диск • Слишком много людей сидят на абстракциях, а не пишут MR jobs
  • 102. Почему мамонты вымирают? • Они слишком часто сохраняются на диск • Слишком много людей сидят на абстракциях, а не пишут MR jobs • Слишком плох MR для итерационных вычислений
  • 103. Почему мамонты вымирают? • Они слишком часто сохраняются на диск • Слишком много людей сидят на абстракциях, а не пишут MR jobs • Слишком плох MR для итерационных вычислений • Слишком долго MR был на коне
  • 104. Почему мамонты вымирают? • Они слишком часто сохраняются на диск • Слишком много людей сидят на абстракциях, а не пишут MR jobs • Слишком плох MR для итерационных вычислений • Слишком долго MR был на коне • И да, Google его больше не использует
  • 105. Мы можем комбинировать подходы для всех источников данных val points = spark.sql("select latitude, longitude from tweets") val model = KMeans.train(points, 10)
  • 106. WordCount на Scala + Spark val conf = new SparkConf() .setAppName(appName) .setMaster(master)
  • 107. WordCount на Scala + Spark val conf = new SparkConf() .setAppName(appName) .setMaster(master) val spark = new SparkContext(conf)
  • 108. WordCount на Scala + Spark val conf = new SparkConf() .setAppName(appName) .setMaster(master) val spark = new SparkContext(conf) val file = spark.textFile("…") res.saveAsTextFile("…");
  • 109. WordCount на Scala + Spark val conf = new SparkConf() .setAppName(appName) .setMaster(master) val spark = new SparkContext(conf) val file = spark.textFile("…") Тут как напишем сейчас MR! res.saveAsTextFile("…");
  • 110. WordCount на Scala + Spark val conf = new SparkConf() .setAppName(appName) .setMaster(master) val spark = new SparkContext(conf) val file = spark.textFile("…") val res = file .flatMap(line => line.split(" ")) .map(word => (word, 1)) .reduceByKey(_+_) res.saveAsTextFile("…");
  • 113. Spark – это не царская дорога к большим данным Статья о том, что меня раздражает в Spark
  • 114. Контакты • https://twitter.com/zaleslaw • https://twitter.com/BigDataRussia • http://vk.com/big_data_russia Big Data Russia • http://vk.com/java_jvm