Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

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

825 Aufrufe

Veröffentlicht am

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

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

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

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

Veröffentlicht in: Wissenschaft

Мастер-класс по 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

×