Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

827 views

Published on

Данила, BigData Tool Master,
собрал Hadoop - кластер,
Запустил Dataset
Он скрипты на Scala
Run'ил на Spark постоянно
И писал в HDFSssss

Если во время доклада "Когда все данные станут большими..." мы будем говорить о вопросах и ответах, то на этом мастер-классе мы уже потопчемся в вотчине BigData-разработчиков.

Начнем с классики на Hadoop, познаем боль MapReduce job, потыкаем Pig + Hive, затем плавно свальсируем в сторону Spark и попишем код в легком и удобном pipeline - стиле.

Для кого хорошо подходит данный мастер-класс: вы умеете читать и понимать код на Java на уровне хотя бы Junior, умеете писать SQL-запросы, в универе вы ходили хоть на одну пару по матану или терверу, вас либо недавно поставили, либо вскоре поставят на проект, где надо уметь ручками работать с вышеперечисленным зверинцем. Ну или вам просто интересно посмотреть на мощь даннодробилок, написанных на Java, и у вас в анамнезе неудачный опыт с NoSQL/SQL, как хранилищем, которое было ответственно за все, включая аналитику.

Published in: Science

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

  1. 1. BigData Tools Зиновьев Алексей Java/BigData тренер в EPAM
  2. 2. Контакты • https://twitter.com/zaleslaw • https://twitter.com/BigDataRussia • http://vk.com/big_data_russia Big Data Russia • http://vk.com/java_jvm
  3. 3. JavaScript изо всех щелей
  4. 4. И вот, что я скажу тебе, JavaScript
  5. 5. И вот, что я скажу тебе, JavaScript
  6. 6. Мне нравится, когда все на JVM крутится!
  7. 7. Типичный BigData кластер • 450 машин • Master Nodes (24 ядра, 158 Gb RAM). • Data Nodes (24|32 ядра, 96|128 Gb RAM). • Средняя YARN Queue utilization 85% (по дням). • 12Pb – емкость хранения данных
  8. 8. Когда мы говорим, что имеем дело с BigData решением • Когда перед глазами смесь архитектурных подходов, таких как Kappa, Lambda, Data Lake • Когда мы имеем дело со стеком технологий, таких как Hadoop, Kafka, Spark, Storm, Samza, HBase, Cassandra, Titan, GridGain • Когда анализ логов этих систем – задача не менее серьезного уровня
  9. 9. ScaleUp vs ScaleOut 16 CPUs 16 CPUs 16 CPUsScale - Out16 CPUs 48 CPUsScale - Up16 CPUs
  10. 10. Приходит время, данные в датацентры улетают… I 50GB 300GB 5TB
  11. 11. Приходит время, данные в датацентры улетают…
  12. 12. Как вылечить невысокую устойчивость к сбоям?
  13. 13. Мыть голову при помощи нового шампуня «Репликация»!
  14. 14. Если вы слишком увлечётесь гонкой инструментов, то получится..
  15. 15. Типичный многосервисный проект, где основной болью будет конфликт разных версий 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.)
  16. 16. Hadoop
  17. 17. Пора дать определение! • Hadoop != MapReduce
  18. 18. Пора дать определение! • Hadoop != MapReduce • Hadoop – это фреймворк
  19. 19. Пора дать определение! • Hadoop != MapReduce • Hadoop – это фреймворк • Фреймворк для обработки больших массивов данных
  20. 20. Пора дать определение! • Hadoop != MapReduce • Hadoop – это фреймворк • Фреймворк для обработки больших массивов данных • Который использует простые модели и парадигмы программирования
  21. 21. Пора дать определение! • Hadoop != MapReduce • Hadoop – это фреймворк • Фреймворк для обработки больших массивов данных • Который использует простые модели и парадигмы программирования • Скрывая от нас всю самую сложную часть с параллелизацией, перемещением данных и
  22. 22. Фреймворке в семействе Hadoop • Универсальные (MapReduce, Tez, Kudu, RDD in Spark)
  23. 23. Фреймворке в семействе Hadoop • Универсальные (MapReduce, Tez, Kudu, RDD in Spark) • Абстрактные (Pig, Pipeline Spark)
  24. 24. Фреймворке в семействе Hadoop • Универсальные (MapReduce, Tez, Kudu, RDD in Spark) • Абстрактные (Pig, Pipeline Spark) • SQL – подобные (Hive, Impala, Spark SQL)
  25. 25. Фреймворке в семействе Hadoop • Универсальные (MapReduce, Tez, Kudu, RDD in Spark) • Абстрактные (Pig, Pipeline Spark) • SQL – подобные (Hive, Impala, Spark SQL) • Для обработки графов (Giraph, GraphX)
  26. 26. Фреймворке в семействе Hadoop • Универсальные (MapReduce, Tez, Kudu, RDD in Spark) • Абстрактные (Pig, Pipeline Spark) • SQL – подобные (Hive, Impala, Spark SQL) • Для обработки графов (Giraph, GraphX) • Машинное обучение (MLlib, Mahout)
  27. 27. Фреймворке в семействе Hadoop • Универсальные (MapReduce, Tez, Kudu, RDD in Spark) • Абстрактные (Pig, Pipeline Spark) • SQL – подобные (Hive, Impala, Spark SQL) • Для обработки графов (Giraph, GraphX) • Машинное обучение (MLlib, Mahout) • Stream (Spark Streaming, Storm)
  28. 28. Важнейшие части «слона» • Hadoop Commons • Hadoop Clients • HDFS – Hadoop Distributed File System • Yarn – Yet Another Resource Negotiator • MapReduce
  29. 29. Как начать?
  30. 30. Как начать? С выбора дистрибутива, конечно
  31. 31. Важнейшие части «слона» • 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
  32. 32. HDP != Hadoop
  33. 33. HDP != Hadoop
  34. 34. Русские ставят вручную на первый попавшийся сервер
  35. 35. Нравится много писать в консоли? Big Data on your local machine : How to install Hadoop 2.6.0
  36. 36. Режим установки local • Однопоточная Java • Легко дебажить даже из IDE • Репликации нет • HDFS учить не нужно • dfs.replication=“1”; • fs.defaultFS=“file:///”; fs.default.name=“file:///”; • mapreduce.framework.name=“local”
  37. 37. Режим установки Pseudo-distributed • Все на одной ноде • Репликации нет • Каждому демону из Hadoop соответсвует thread из Java • Yarn выполняет свою работу
  38. 38. Режим установки Fully-distributed • Репликация какая надо • Master/slave ноды • Yarn выполняет свою работу
  39. 39. Топология Hadoop
  40. 40. Best Practices • DataNodes, NodeManagers and RegionServers обычно разворачиваются исходя из стратегии DataLocality
  41. 41. Best Practices • DataNodes, NodeManagers and RegionServers обычно разворачиваются исходя из стратегии DataLocality • Обычно каждый блок данных реплицируется минимум трижды в действительно разных местах
  42. 42. Best Practices • DataNodes, NodeManagers and RegionServers обычно разворачиваются исходя из стратегии DataLocality • Обычно каждый блок данных реплицируется минимум трижды в действительно разных местах • Если можно, ставим балансировщик
  43. 43. Best Practices • DataNodes, NodeManagers and RegionServers обычно разворачиваются исходя из стратегии DataLocality • Обычно каждый блок данных реплицируется минимум трижды в действительно разных местах • Если можно, ставим балансировщик • Изучаем особенности HDFS 
  44. 44. Рекомендации по мощностям • 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
  45. 45. HDFS
  46. 46. Hadoop Distributed File System Hortonworks утверждает, что существуют кластера на 200 PB, 4500 машин, > 10^6 файлов и HDFS нормально так работает
  47. 47. NameNode • Вообще это отдельные процессы, которые умеют жить как на одной, так и на разных машинах • В кластере только одна NameNode, но это не SPOF! • Есть StanbyNameNode, она страхует • Если NameNode недоступна, то недоступен и HDFS кластер
  48. 48. NameNode рулит и разруливает!
  49. 49. DataNode • DataNode может быть сколько угодно, чем больше, тем лучше • Можно убирать и добавлять их без особого ущерба • DataNode сама отвечает на запросы • И слушается NameNode, когда надо умереть, реплицировать что-то или удалить реплику
  50. 50. Что нужно уметь и знать! • Перемещать данные между HDFS и обычной FS: hdfs fs -copyFromLocal ; -copyToLocal • Удалять/создавать директории • Управлять правами на файлы/папки • Диагностировать • Проверять наличие свободного пространства Все это при помощи команд, похожих на Linux
  51. 51. Укротите демонов! • /logs • /logLevel • /stacks • /metrics • /metrics?format=json
  52. 52. MapReduce
  53. 53. 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) ) )
  54. 54. MapReduce для WordCount
  55. 55. WordCount, отлитый в Java : Mapper
  56. 56. WordCount, отлитый в Java : Reducer
  57. 57. WordCount, отлитый в Java : Runner
  58. 58. WordCount, отлитый в Java : Runner
  59. 59. Как запустить это хозяйство? • Сделать jar
  60. 60. Как запустить это хозяйство? • Сделать jar • Запустить его на удаленной машине, где есть Hadoop
  61. 61. Как запустить это хозяйство? • Сделать jar • Запустить его на удаленной машине, где есть Hadoop • hadoop jar your-jar.jar <packagename>.YourDriver – Ddir.input=/bla/bla/bla -Dmapred.reduce.tasks=4
  62. 62. Как запустить это хозяйство? • Сделать jar • Запустить его на удаленной машине, где есть Hadoop • hadoop jar your-jar.jar <packagename>.YourDriver – Ddir.input=/bla/bla/bla -Dmapred.reduce.tasks=4 • В коде драйвера работай с этими константами
  63. 63. Как запустить это хозяйство? • Сделать jar • Запустить его на удаленной машине, где есть Hadoop • hadoop jar your-jar.jar <packagename>.YourDriver – Ddir.input=/bla/bla/bla -Dmapred.reduce.tasks=4 • В коде драйвера работай с этими константами • String hdfsInputFileOrDirectory = configuration.get(“dir.input”);
  64. 64. Запустили? Упало! Нужны тесты  Вот бы нам JUnit…
  65. 65. Запустили? Упало! Нужны тесты  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(); } }
  66. 66. Hadoop Jobs
  67. 67. Не забывай о JVM!
  68. 68. Но всеми этим фронтами кто-то должен управлять, говорить кому когда что делать…
  69. 69. Скелет Hadoop, который пришелся по вкусу всем!
  70. 70. YARN
  71. 71. MapReduce – это всего лишь одно приложение, которое приходит к всемогущему YARN за ресурсами для своих авантюр
  72. 72. YARN общается с HDFS, чтобы задействовать DataLocality и оптимизировать свои ресурсы
  73. 73. YARN управляет жизненным циклом, нудно, но все работает!
  74. 74. Как извлекать факты для анализа данных из Hadoop?
  75. 75. Свин и шмелле летят на помощь!
  76. 76. Pig
  77. 77. Подсчет треугольников в графе
  78. 78. Pig Scripts -> MapReduce jobs
  79. 79. Сделаем отчет на Pig dem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int, gender:int, region:int);
  80. 80. Сделаем отчет на 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);
  81. 81. Сделаем отчет на 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);
  82. 82. Сделаем отчет на 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;
  83. 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); 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;
  84. 84. Сделаем отчет на Pig /* amount of logins by regions */ dem_logins= JOIN dem BY id, logins_data BY userid;
  85. 85. Сделаем отчет на 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);
  86. 86. Сделаем отчет на 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;
  87. 87. Сделаем отчет на 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;
  88. 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); 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(',');
  89. 89. Да по-любому надо тюнить! 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); ….
  90. 90. Hive
  91. 91. Как так? Снова SQL? Да, дружище, он никуда не уходил, стоял за дверью…
  92. 92. Причины триумфа Hive • Иллюзия структуры • Единый язык для различных хранилищ • SQL всем знаком • Вполне реален ответ за небольшое время • MapReduce слишком сложен • Иллюзия JOINs
  93. 93. JOINы превращаются.. в элегантные шорты
  94. 94. Spark
  95. 95. Почему мамонты вымирают? • Они слишком часто сохраняются на диск
  96. 96. Почему мамонты вымирают? • Они слишком часто сохраняются на диск • Слишком много людей сидят на абстракциях, а не пишут MR jobs
  97. 97. Почему мамонты вымирают? • Они слишком часто сохраняются на диск • Слишком много людей сидят на абстракциях, а не пишут MR jobs • Слишком плох MR для итерационных вычислений
  98. 98. Почему мамонты вымирают? • Они слишком часто сохраняются на диск • Слишком много людей сидят на абстракциях, а не пишут MR jobs • Слишком плох MR для итерационных вычислений • Слишком долго MR был на коне
  99. 99. Почему мамонты вымирают? • Они слишком часто сохраняются на диск • Слишком много людей сидят на абстракциях, а не пишут MR jobs • Слишком плох MR для итерационных вычислений • Слишком долго MR был на коне • И да, Google его больше не использует
  100. 100. Мы можем комбинировать подходы для всех источников данных val points = spark.sql("select latitude, longitude from tweets") val model = KMeans.train(points, 10)
  101. 101. WordCount на Scala + Spark val conf = new SparkConf() .setAppName(appName) .setMaster(master)
  102. 102. WordCount на Scala + Spark val conf = new SparkConf() .setAppName(appName) .setMaster(master) val spark = new SparkContext(conf)
  103. 103. WordCount на Scala + Spark val conf = new SparkConf() .setAppName(appName) .setMaster(master) val spark = new SparkContext(conf) val file = spark.textFile("…") res.saveAsTextFile("…");
  104. 104. WordCount на Scala + Spark val conf = new SparkConf() .setAppName(appName) .setMaster(master) val spark = new SparkContext(conf) val file = spark.textFile("…") Тут как напишем сейчас MR! res.saveAsTextFile("…");
  105. 105. 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("…");
  106. 106. Основные компоненты
  107. 107. Типичный итерационный алгоритм до и после.. 10x – 100x
  108. 108. Spark – это не царская дорога к большим данным Статья о том, что меня раздражает в Spark
  109. 109. Контакты • https://twitter.com/zaleslaw • https://twitter.com/BigDataRussia • http://vk.com/big_data_russia Big Data Russia • http://vk.com/java_jvm

×