Upload
alexey-zinoviev
View
634
Download
1
Embed Size (px)
Citation preview
BigData Tools
Зиновьев Алексей
Java/BigData тренер в EPAM
Контакты
• 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 - Out 16 CPUs
48 CPUsScale - Up 16 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 backupis stored here
Real-time DataIngestion
Batch DataIngestion
Real-Time ETL & CEP
Batch ETL & Raw Area
Scheduler
Internal
External
Social
HDFS → CFSas an option
Time-Series Data
Titan & KairosDBstore 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)
Важнейшие части «слона»
• 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;
@Beforepublic void setUp() {
WordMapper mapper = new WordMapper();mapDriver = new MapDriver<LongWritable, Text, Text, IntWritable>();mapDriver.setMapper(mapper);
}
@Testpublic 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
Сделаем отчет на Pigdem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int,
gender:int, region:int);
Сделаем отчет на Pigdem = 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);
Сделаем отчет на Pigdem = 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);
Сделаем отчет на Pigdem = 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;
Сделаем отчет на Pigdem = 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
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 + Sparkval conf = new SparkConf()
.setAppName(appName)
.setMaster(master)
WordCount на Scala + Sparkval conf = new SparkConf()
.setAppName(appName)
.setMaster(master)
val spark = new SparkContext(conf)
WordCount на Scala + Sparkval conf = new SparkConf()
.setAppName(appName)
.setMaster(master)
val spark = new SparkContext(conf)
val file = spark.textFile("…")
res.saveAsTextFile("…");
WordCount на Scala + Sparkval conf = new SparkConf()
.setAppName(appName)
.setMaster(master)
val spark = new SparkContext(conf)
val file = spark.textFile("…")
Тут как напишем сейчас MR!
res.saveAsTextFile("…");
WordCount на Scala + Sparkval 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