Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Hadoop - Taming the Elephant (With a Whale)

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →
Avatar for Teapot-418 Teapot-418
January 24, 2019

Hadoop - Taming the Elephant (With a Whale)

Big Data ist in der heutigen Zeit ein weit verbreitetes Thema. Im Umgang mit großen Datenmengen kommen verschiedene Tools zum Einsatz, wie zum Beispiel Hadoop.

Wer als Entwickler in das Thema Hadoop einsteigen möchte und gerade kein voll aufgesetztes Rechen-Cluster zur Hand hat, ist hier genau richtig.

Wir beginnen mit einer kurzen Einführung in Hadoop und einer Komponentenübersicht des Hadoop-Universums. Wir werden Hadoop ganz ohne Installationsexzesse lokal in Docker ausführen.

Im Anschluss daran werden wir Daten aus dem Darknet analysieren, um zu verstehen, welche Vorteile Hadoop mit sich bringt.

Am Ende des Talks kennen die Zuhörerinnen und Zuhörer die wichtigsten Begriffe und Tools aus dem Hadoop-Universum und freuen sich darauf, Hadoop zu Hause in Docker auszuprobieren (und vielleicht auch darauf, ein Hadoop-Cluster für ihr Unternehmen aufzusetzen).

Für die ersten Schritte zu Hause wird ein öffentliches Demo-Projekt auf GitHub zur Verfügung gestellt.

Avatar for Teapot-418

Teapot-418

January 24, 2019

More Decks by Teapot-418

Other Decks in Programming

Transcript

  1. Unsere Reise 8 7 5 4 3 2 Laufen lassen

    1 0 Wer bin ich? So beginnt es Mit Daten arbeiten HTTP Java-Hasser? Try It @ Home Das Ende 6 Hadoop Universe
  2. 8 7 5 4 3 2 Laufen lassen 1 0

    Wer bin ich? So beginnt es Mit Daten arbeiten HTTP Java-Hasser? Try It @ Home Das Ende 6 Hadoop Universe
  3. Mehr als nur ein Elefant! Hadoop HDFS YARN Pig Hive

    Mahout HBase Cluster MapReduce Ozone Common DataNode NameNode Mapper Reducer Combiner 1 6
  4. 8 7 5 4 3 2 Laufen lassen 1 0

    Wer bin ich? So beginnt es Mit Daten arbeiten HTTP Java-Hasser? Try It @ Home Das Ende 6 Hadoop Universe
  5. Ein paar Docker-Befehle 2 10 docker exec -it <container-id> /bin/bash

    docker container stop <container-id> docker container start <container-id> Bash in laufenden Container Container stoppen Container starten docker ps Zeige alle laufenden Container
  6. Image starten 2 11 BITTE BEACHTEN Es ist nicht üblich,

    Hadoop in Docker zu starten! docker run -it \ -p 50070:50070 \ -p 8088:8088 \ -p 50075:50075 \ sequenceiq/hadoop-docker:2.7.0 \ /etc/bootstrap.sh -bash Image in interaktivem Modus starten Web-UI port weiterleiten Name & Version des Docker-Images Kommando ausführen Port zum Ergebnis-Download weiterleiten Port zum Job-Tracking weiterleiten
  7. /etc/bootstrap.sh? 2 12 • In sequenceiq Docker-Image enthaltenes Skript •

    Relevant zu wissen: • Startet Services • Hat zwei Argument-Optionen: • -d : Detached, im Background • -bash: Bash nach Start öffnen
  8. Hat alles geklappt? 1 / 3 2 13 $HADOOP_PREFIX/share/hadoop/mapreduce hadoop-mapreduce-examples-2.7.0.jar

    bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce- examples-2.7.0.jar grep input output 'dfs[a-z.]+' Ordner mit u.a. Beispielen MapReduce-Beispiel (Java) Ausführen eines MapReduce-Jobs
  9. 8 7 5 4 3 2 Laufen lassen 1 0

    Wer bin ich? So beginnt es Mit Daten arbeiten HTTP Java-Hasser? Try It @ Home Das Ende 6 Hadoop Universe
  10. MapReduce: Beispiel 3 20 ID Tierart Name 1 Hund Berta

    2 Katze Miezi 3 Katze Nyan 4 Hund Napoleon …
  11. Combiner 3 25 BITTE BEACHTEN Ein Combiner kann den Reducer

    nicht ersetzen • Optional • Netzwerklast reduzieren • Den Output des Mappers kombinieren und kombinierte Daten zum Reducer schicken • Oftmals kann der Reducer als Combiner eingesetzt werden
  12. Wir brauchen Daten! 3 26 • Kaggle:
 Dark Net Marketplace

    Data (Agora 2014-2015) • 30.98 MB • CSV-Datei Original Daten: https:/ /www.kaggle.com/philipjames11/dark-net-marketplace-drug-data-agora-20142015 Leicht adaptiert: https:/ /github.com/Teapot-418/hadoop-taming-the-elephant/blob/master/darknet-data.csv
  13. Daten ins HDFS 3 28 docker cp darknet-data.csv \ ab0978def5ae:/tmp/

    Daten in Container kopieren $HADOOP_PREFIX/bin/hdfs dfs \ -put /tmp/darknet-data.csv \ /user/root/input/darknet Daten ins HDFS
  14. Mapper erstellen 3 33 Mapper< [input-key], [input-value], [output-key], [output-value] >

    Extend Hadoop’s Mapper public void map( [input-key] key, [input-value] value, Context context ) “map” überschreiben
  15. public class MainCategoryMapper extends Mapper<LongWritable, Text, Text, LongWritable> { @Override

    public void map(LongWritable key, Text value, Context context) throws […] { String line = value.toString(); String[] lineData = line.split(","); String[] categories = lineData[1].split("/"); if(categories.length > 0) { context.write(new Text(categories[0]), key); } } } Mapper erstellen 3 34 BITTE BEACHTEN Hadoop verwendet spezielle Variablentypen. Output erzeugen
  16. Reducer erstellen 3 35 Reducer< [input-key], [input-value], [output-key], [output-value] >

    Extend Hadoop’s Reducer public void reduce( [input-key] key, Iterable<[input-value]> values, Context context ) “reduce” überschreiben
  17. public class CategoryCountReducer extends Reducer<Text, LongWritable, Text, IntWritable> { @Override

    public void reduce(Text key, Iterable<LongWritable> values, Context context) throws […] { int count = 0; for (LongWritable value : values) { count++; } context.write(key, new IntWritable(count)); } } Reducer erstellen 3 36 Output erzeugen
  18. F E D C B A Einstiegspunkt 3 37 A

    Job erzeugen B Ort von Input und Output spezifizieren C Mapper und Reducer definieren D Mapper-Output definieren (Key und Value) E Reducer-Output definieren
 (Key und Value) F Job starten und auf Fertigstellung warten
  19. Job starten 3 38 mvn clean package docker cp darknet-mapreduce.jar\

    ab0978def5ae:/tmp/darknet-mapreduce.jar Executable Jar bauen In Container kopieren jar liegt in /target $HADOOP_PREFIX/bin/hadoop \ jar /tmp/darknet-mapreduce.jar Ausführen
  20. Job starten 3 39 […] INFO mapreduce.Job: The url to

    track the job: http://ab0978def5ae:8088/ proxy/application_1547046677403_0012/ […] INFO mapreduce.Job: Running job: job_1547046677403_0012 […] INFO mapreduce.Job: Job job_1547046677403_0012 running in uber mode : false […] INFO mapreduce.Job: map 0% reduce 0% […] INFO mapreduce.Job: map 100% reduce 0% […] INFO mapreduce.Job: map 100% reduce 100% […] INFO mapreduce.Job: Job job_1547046677403_0012 completed successfully
  21. CLI - Check 3 40 $HADOOP_PREFIX/bin/hdfs dfs -cat output/darknet/main- category-count/*

    Hauptkategorie Anzahl Chemicals 1 Counterfeits 202 Drug paraphernalia 2 Drugs 11834 …
  22. Werdet kreativ • Versucht doch mal: • Die Länder in

    die versendet wird zu zählen • Den maximalen Preis jeder Hauptkategorie aufzulisten • … 3 43
  23. 8 7 5 4 3 2 Laufen lassen 1 0

    Wer bin ich? So beginnt es Mit Daten arbeiten HTTP Java-Hasser? Try It @ Home Das Ende 6 Hadoop Universe
  24. Docker-Container linken 4 48 docker run \ -it \ --link

    7680676ced68:hadoop \ —name curl_container \ ubuntu:latest Container linken Im interaktiven Modus starten
  25. Durch’s HDFS navigieren 4 49 http://hadoop:50070/webhdfs/v1/user Basis URL curl -i

    -L \ “http://hadoop:50070/webhdfs/v1/user/ root/output/?op=LISTSTATUS" Ordner browsen curl -i -L \ “http://hadoop:50070/webhdfs/v1/user/ root/output/darknet/category-count/ part-00000?op=OPEN” Dateien öffnen
  26. 8 7 5 4 3 2 Laufen lassen 1 0

    Wer bin ich? So beginnt es Mit Daten arbeiten HTTP Java-Hasser? Try It @ Home Das Ende 6 Hadoop Universe
  27. Beispiel - Einleitung 5 56 Kategorie Drugs/Cannabis/Weed Drugs/Ecstasy/Pills Services/Other …

    Kategorie Anzahl Drugs/Cannabis/Weed 418 Drugs/Ecstasy/Pills 42 …
  28. Mapper 5 57 #!/usr/bin/env python import sys id = 0

    for line in sys.stdin: val = line.strip() data = val.split(',') category = data[1] print(category + '\t' + str(id)) id = id + 1 Output an Reducer aushändigen stdin Zeile für Zeile verarbeiten
  29. Reducer 5 58 previous_key = None count = 0 for

    line in sys.stdin: (key, val) = line.strip().split('\t') if previous_key is None: previous_key = key if key == previous_key: count = count + 1 else: print(key + '\t' + str(count)) count = 1 previous_key = key Key und Value der Zeile Letzter? Ergebnis ausgeben Key merken
  30. Ab in den Container 5 59 docker cp mapper.py ab0978def5ae:/tmp/

    Mapper in den Container docker cp reducer.py ab0978def5ae:/tmp/ Reducer in den Container chmod +x mapper.py chmod +x reducer.py Ausführbar machen
  31. Ausführen - Argumente 5 61 -files /tmp/mapper.py,/tmp/reducer.py \ -input input/darknet

    \ -output output/darknet/category-count \ -mapper /tmp/mapper.py \ -reducer /tmp/reducer.py Dateien auf Cluster verteilen Input Reducer setzen Mapper setzen Output
  32. 8 7 5 4 3 2 Laufen lassen 1 0

    Wer bin ich? So beginnt es Mit Daten arbeiten HTTP Java-Hasser? Try It @ Home Das Ende 6 Hadoop Universe
  33. Benamsung 6 66 “The name my kid gave a stuffed

    yellow elephant. Short, relatively easy to spell and pronounce, meaningless, and not used elsewhere: those are my naming criteria. Kids are good at generating such. Googol is a kid’s term.” (Doug Cutting) Excerpt From: Tom White. “Hadoop: The Definitive Guide”.
  34. YARN 6 69 HDFS and HBase YARN MapReduce Processing Frameworks

    Spark Tez Pig Hive Crunch APPLICATION COMPUTE STORE
  35. 8 7 5 4 3 2 Laufen lassen 1 0

    Wer bin ich? So beginnt es Mit Daten arbeiten HTTP Java-Hasser? Try It @ Home Das Ende 6 Hadoop Universe
  36. @ Home • Mehr Informationen über Hadoop • http://hadoop.apache.org •

    Tom White - “Hadoop - The Definitive Guide” (4th) • Alex Holmes - “Hadoop In Practice” (2nd)
 • Mehr Informationen über diesen Vortrag • www.teapot418.de • https://github.com/Teapot-418/hadoop-taming-the-elephant 7 73
  37. 8 7 5 4 3 2 Laufen lassen 1 0

    Wer bin ich? So beginnt es Mit Daten arbeiten HTTP Java-Hasser? Try It @ Home Das Ende 6 Hadoop Universe
  38. www.innoq.com innoQ Deutschland GmbH Krischerstr. 100 40789 Monheim am Rhein

    Germany +49 2173 3366-0 Ohlauer Str. 43 10999 Berlin Germany +49 2173 3366-0 Ludwigstr. 180E 63067 Offenbach Germany +49 2173 3366-0 Kreuzstr. 16 80331 München Germany +49 2173 3366-0 innoQ Schweiz GmbH Gewerbestr. 11 CH-6330 Cham Switzerland +41 41 743 0116 Vielen Dank! Lisa Maria Moritz [email protected] Teapot4181