Paweł Kucharski
Oswajamy Słonia
czyli
po co nam Hadoop
• Sotrender
• Hadoop
• Czym jest Hadoop?
• Podstawowe elementy
• Ekosystem Hadoop
• Hive, Pig
• Spark
• HBase
• Nasze doświaczenia
• MySQL vs Hadoop
• R
CO ROBIMY?
Sotrender
SOTRENDER
SOTRENDER
• Sotrender: narzędzie do analiz social media
• Badania i raporty na życzenie
Więcej: 2015.sotrender.pl
SOTRENDER
SOTRENDER
SOTRENDER
Zbieramy dane:
• Facebook, Twitter, YouTube, Instagram
• 30k profili
• 250k API calls na godzinę
SOTRENDER
Facebook API
Twitter API
Google API
Storage
Web
R
OSWAJAMY SŁONIA
Hadoop
CZYM JEST HADOOP
• Święty gral Big Data
• Rozproszony system przechowywania
przetwarzania danych
CZYM JEST HADOOP
CZYM JEST HADOOP
Otwarta implementacja paradygmatów
Google: GoogleFileSystem i MapReduce
Hadoop umożliwia:
• przetwarzanie dużych ilościach danych
• równolegle
• niezawodnie
• skalowalnie
• zbudowanych z tanich komponentów
CZYM JEST HADOOP
Zalety
• Elastyczny format danych
• Nie wymaga agregacji (surowe dane)
• Nie wymaga próbkowania (wszystkie dane)
• Nie ma potrzeby usuwania danych
• Skalowalny (od kilku do tysięcy węzłów)
Paweł Kucharski: Oswajamy Słonia czyli po co nam Hadoop
CZYM JEST HADOOP
Zamiast przesyłać dane do programu,
przesyłamy program do danych
Data Data Data DataData Data
Map Map Map Map Map Map
reducer
CZYM JEST HADOOP
CZYM JEST HADOOP
HISTORIA HADOOP
• Stworzony w 2005 w Yahoo przez Doug
Cutting
• Wersja 0.14.1 w 2007
• Wersja 1.0 – grudzień 2011
• Wersja 2.2 - październik 2013
HADOOP
Główne dystrybucje
• Hortonworks
• HDP
• Cloudera
• CDH
• MapR
• M3
HISTORIA HADOOP
https://wiki.apache.org/hadoop/PoweredBy
HISTORIA HADOOP
Yahoo
• 600PB, 43k nodes
Twitter:
• 300PB 1000
nodes
Facebook
• 300PB, 600TB
dziennie
Google (maj 2014)
• 2 EB, 600M QPS
HADOOP
26% dużych firm używa Hadoopa, kolejne
18% zamierza to zrobić w ciągu dwóch lat.
HADOOP
HADOOP
Dwa główne komponenty
HDFS i MapReduce
HADOOP DISTRIBUTED FILE SYSTEM
HDFS
HDFS
Rozproszony system plików
• Skalowalny
• Odporny na awarię
• Tani sprzęt
• Duże ilości danych
• Dla dużych klastrów
HDFS
Dwa podstawowe elementy:
• Namenode
• Datanode
Dodatkowo:
• JournalNode
• Zookeeper
HDFS
• Block replication
• Rack awareness
• Self healing
HDFS
www.ibm.com
Konfiguracja węzłów:
- niskiej/średniej klasy sprzęt
- trochę RAMu
- dużo dysków
- szybkie karty sieciowe
MapReduce
MAPREDUCE
Pochodzenie: MPI, Google
Składa się z trzech kroków
• „Map” – operacje lokalne
• „Shuffle” – redystrybucji wyników
• „Reduce” – grupowanie wyników
MapReduce nie ma być szybki, ale
umożliwiać zrównoleglenie obliczeń na dużą
skalę.
Paweł Kucharski: Oswajamy Słonia czyli po co nam Hadoop
MAPREDUCE
http://www.r-bloggers.com/an-example-of-mapreduce-with-rmr2/
Komisja
wyborcza #1
MAPREDUCE PRZYKŁAD
Komisja
wyborcza #N
Okręgowa komisja
wyborcza
Komisja
wyborcza #M
Komisja
wyborcza #S
Okręgowa komisja
wyborcza
Państwowa Komisja
Wyborcza
MAPREDUCE KIEDYŚ
ibm.com
MAPREDUCE ON YARN
YARN
• Otwarty
• Skalowalny
• Zarządza tylko zasobami
• Logika przenisiona do App Mstr
http://hortonworks.com/blog/apache-hadoop-yarn-concepts-and-applications/
PRZYKŁAD - WORDCOUNT
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context ) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException,
InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
PRZYKŁAD - WORDCOUNT
import sys
for line in sys.stdin:
line = line.strip()
words = line.split()
for word in words:
print '%st%s' % (word, 1)
from operator import itemgetter
import sys
current_word = None
current_count = 0
word = None
for line in sys.stdin:
line = line.strip()
word, count = line.split('t', 1)
try:
count = int(count)
except ValueError:
continue
# this IF-switch only works because Hadoop sorts map output
if current_word == word:
current_count += count
else:
if current_word:
print '%st%s' % (current_word, current_count)
current_count = count
current_word = word
if current_word == word:
print '%st%s' % (current_word, current_count)
http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/
PRZYKŁAD - WORDCOUNT
test@debian:~$ hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar 
-file /home/test/mapper.py -mapper /home/test/mapper.py 
-file /home/test/reducer.py -reducer /home/test/reducer.py 
-input /user/test/gutenberg/* -output /user/test/gutenberg-output
Ekosystem Hadoop
EKOSYSTEM HADOOP
Na tych dwóch głównych elementach
zbudowano wiele gotowych rozwiązań
https://hadoopecosystemtable.github.io/
134 różne projekty
Hive
HIVE
• Prosty interfejs do przetwarzania danych w
Hadoopie, wygodniejszy niż pisanie
własnych funkcji
• Wykorzystuje język HiveQL, podobny do
SQL
HIVE
SQL -> MapReduce
SELECT COUNT(*) FROM test_table
WHERE id IN( SELECT id FROM
test_table2) GROUP BY grp_id
zostaje przeszktałocne w serię zadań
MapReduce
HIVE
• Możliwość czytania z wielu źródeł
• External Tables
• Pliki, Hbase, Hypertable, Cassandra, JDBC
• Indeksy
• Własne UDF i funkcje Map/Reduce
HIVE
CREATE TABLE input (line STRING);
LOAD DATA LOCAL INPATH 'input.tsv'
OVERWRITE INTO TABLE input;
SELECT word, COUNT(*) FROM input
LATERAL VIEW explode(split(text, ' '))
ITable as word GROUP BY word;
Przykład: word count
HIVE
Dostęp
• CLI
• JDBC, ODBC
• Thrift
• Zapytania ad-hoc
• Nie wymaga programowania
• Zna informacje o strukturze danych
Pig
PIG
Ten sam cel co HIVE inna droga
Pig Latin
Język skryptowy kompilowanych do zadań
MapReduce
PIG
a = load '/user/test/word_count_text.txt';
b = foreach a generate flatten(TOKENIZE((chararray)$0)) as word;
c = group b by word;
d = foreach c generate COUNT(b), group;
store d into '/user/test/pig_wordcount';
Wordcount example
Spark
SPARK
Apache Spark™ is a fast and general
engine for large-scale data processing.
• Łatwy w użyciu
• Możliwość pisania w:
• Java, Scala, Python, R
• Ponad 80 operacji wysokiego poziomu
SPARK
Transformation Meaning
map(func)
Return a new distributed dataset formed by passing
each element of the source through a function func.
filter(func)
Return a new dataset formed by selecting those
elements of the source on which func returns true.
flatMap(func)
Similar to map, but each input item can be mapped to
0 or more output items (so func should return a Seq
rather than a single item).
mapPartitions(func)
Similar to map, but runs separately on each partition
(block) of the RDD, so func must be of type Iterator<T>
=> Iterator<U> when running on an RDD of type T.
mapPartitionsWithIndex(func)
Similar to mapPartitions, but also provides func with an
integer value representing the index of the partition, so
func must be of type (Int, Iterator<T>) => Iterator<U>
when running on an RDD of type T.
sample(withReplacement, fraction, seed)
Sample a fraction fraction of the data, with or without
replacement, using a given random number generator
seed.
union(otherDataset)
Return a new dataset that contains the union of the
elements in the source dataset and the argument.
intersection(otherDataset)
Return a new RDD that contains the intersection of
elements in the source dataset and the argument.
distinct([numTasks]))
Return a new dataset that contains the distinct
elements of the source dataset.
SPARK
Action Meaning
reduce(func)
Aggregate the elements of the dataset using a
function func (which takes two arguments and returns
one). The function should be commutative and
associative so that it can be computed correctly in
parallel.
collect()
Return all the elements of the dataset as an array at
the driver program. This is usually useful after a filter
or other operation that returns a sufficiently small
subset of the data.
count() Return the number of elements in the dataset.
first()
Return the first element of the dataset (similar to
take(1)).
take(n)
Return an array with the first n elements of the
dataset.
takeSample(withReplacement, num, [seed])
Return an array with a random sample of num
elements of the dataset, with or without replacement,
optionally pre-specifying a random number generator
seed.
saveAsTextFile(path)
Write the elements of the dataset as a text file (or set
of text files) in a given directory in the local filesystem,
HDFS or any other Hadoop-supported file system.
Spark will call toString on each element to convert it
to a line of text in the file.
SPARK
text_file = spark.textFile("hdfs://...")
counts = text_file.flatMap(lambda line:
line.split(" ")) 
.map(lambda word: (word, 1)) 
.reduceByKey(lambda a, b: a + b)
counts.saveAsTextFile("hdfs://...")
Przykład: word count
SPARK
Spark sorts 100 TB in 23 minutes on 206
machines (6592 virtual cores), which
translates into 4.27 TB/min or 20.7
GB/min/node.
Paweł Kucharski: Oswajamy Słonia czyli po co nam Hadoop
HBase
HBASE
Hbase
• Opraty na Google BigTable
• Baza danych
• Obsługuje szybkie (w czasie rzeczywistym)
operacje CRUD
• Zapewnia spójność oczytu i zapisu
• NoSQL – klucz-wartość
• Jedynie proste operacje
• Zbudowany na bazie HDFS
HBASE
• Rozproszona
• Działa na wielu maszynach
• Skalowalna
• Automatyczny sharding
• Dla dużych danych
• Miliardy wierszy
• Współpracuje z innymi elementami
Hadoop
HBASE
Wady:
• Tylko podstawowy zestaw operacji
• Brak transakcji
• Brak operacji na wielu tabelach
• Wymaga dużych ilości danych
• Inaczej nie ma sensu
• Wymaga dużo IO, CPU i RAM
HBASE
• Dane są zapisywane w tabeli
• Tabela składa się z wierszy
• Każdy wiersz ma przypisany klucz
• Tabela może mieć wiele rodzin kolumn
• W każdej rodzinie kolumn może być wiele
kolumn
Row Stats Text
20151111 Total = 1 Count = 10 Msg = blabla
20151112 Total = 2 Posts = 10 Msg = hehe Tags = funny
HBASE
• Tabele dzielone są na regiony – zakresy
kluczy
• Regiony z jednej tabeli mogą być
obsługiwane przez różne węzły
(RegionServer)
Dostęp:
• Natywne API (Java)
• REST
• Thrift
• Binarny protokół
• Szybki
• Obsługuje wiele języków
Hadoop w Sotrender
POCZĄTKI
MySQL
• Zaczynaliśmy od 1 serwera
• Dodawaliśmy kolejne serwery co kilka
miesięcy
• Zmienialiśmy serwery na co raz
mocniejsze
• Doszliśmy do 6 maszyn
MySQL
• Problem z migracją danych między
serwerami
• Brak skalowalności
• Problem z modyfikacją struktury
• Długi czas odzyskiwania po awarii
• Trudna konfiguracja
MYSQL
TokuDB
• Drzewa fraktalne
• Kompresja (do 25x)
• Tworzenie indeksów bez blokowania
• Modyfikacja struktury bez blokowania
• Działa efektywnie „out of box”
• Replikacja „read free”
HADOOP SOTRENDER
Hadoop
• Hbase
• Zbieranie danych
• Serwowanie danych w narzędziu
• Hive
• Niestandardowe analizy
• Pig
• Wyznaczanie trendów, dzienne obliczenia
HADOOP SOTRENDER
MySQL
• 3 TB danych (skompresowanych)
• 56 mld wierszy
Hadoop:
• 6 wezłów
• 28 TB danych
• HBase, Hive, Spark
HADOOP SOTRENDER
Testujemy:
• Spark
• Solr
HADOOP SOTRENDER
Plusy
• Skalowalność
• Faktycznie działa
• Wydajność
• Jednolity interfejs dostępu do danych
• Integracja z R
• Szybki rozwój
HADOOP SOTRENDER
Minusy
• Braki w dokumentacji
• Problemy ze stabilnością
• Java
• Błędy
• Konfiguracja
• Braki w kontroli dostępu
• Szybki rozwój
pawel@sotrender.com
Pytania?
pawel@sotrender.com
Dziękuję bardzo
Hadoop w R
R I HADOOP
• Do czego wykorzystujemy?
• Delegowanie szczególnie „kosztownych”
operacji na danych (np. tabele frekwencyjne,
agregowanie rekordów
dziennych/godzinnych),
• Łatwy i relatywnie szybki dostęp do
ogromnych tabel,
R I HADOOP - DOSTĘP
• Szereg pakietów w R do operacji na
klastrze hadoopowym:
• rmr – umożliwiający pisanie programów
MapReduce w R,
• rhdfs – dostęp do plików w HDFS,
• rhbase – funkcje umożliwiające dostęp do
tabel w Hbase
• Możliwość nawiązania połączenia z Hive
przez JDBC (pakiet RJDBC w R)
R I HADOOP – DOSTĘP DO HIVE
R I HADOOP - PRZYKŁAD
R
Operacje na już zagregowanych danych
Tworzenie końcowego produktu (wykresy,
raporty)
Hive
Agregowanie danych (np. podsumowanie
aktywności pod tweetami)
Bezpośrednie zapytania
HBase
Mapowanie tabel z Hbase do Hive
R I HADOOP - PRODUKT
http://www.sotrender.pl/trends/twitt
er/reports/201510

More Related Content

PDF
Wprowadzenie do Big Data i Apache Spark
PDF
Szybkie wprowadzenie do eksploracji danych z pakietem Weka
PDF
Wprowadzenie do technologii Big Data
PPTX
Rozproszona analiza danych w Hadoop - wprowadzenie
PDF
Confitura 2018 - Sekretne życie jobów Sparkowych
PPTX
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
PDF
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
PDF
Budowa elementów GUI za pomocą biblioteki React - szybki start
Wprowadzenie do Big Data i Apache Spark
Szybkie wprowadzenie do eksploracji danych z pakietem Weka
Wprowadzenie do technologii Big Data
Rozproszona analiza danych w Hadoop - wprowadzenie
Confitura 2018 - Sekretne życie jobów Sparkowych
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
Budowa elementów GUI za pomocą biblioteki React - szybki start

What's hot (7)

PDF
Podstawy AngularJS
PDF
Technologia Xamarin i wprowadzenie do Windows IoT core
PPTX
SCAP – standaryzacja formatów wymiany danych w zakresie bezpieczeństwa IT
PDF
100 M pakietów na sekundę dla każdego.
PDF
[#2] architektura - IBM Integrated Analytics System
PPTX
Jak działa rekurencyjne CTE?
PDF
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Podstawy AngularJS
Technologia Xamarin i wprowadzenie do Windows IoT core
SCAP – standaryzacja formatów wymiany danych w zakresie bezpieczeństwa IT
100 M pakietów na sekundę dla każdego.
[#2] architektura - IBM Integrated Analytics System
Jak działa rekurencyjne CTE?
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Ad

Similar to Paweł Kucharski: Oswajamy Słonia czyli po co nam Hadoop (20)

PDF
Mongodb with Rails
PDF
Hadoop w NK.pl
ODP
PHP@Docker - w produkcji
PDF
Michał Dec - Quality in Clouds
PDF
[#4] spark - IBM Integrated Analytics System
PDF
infraxstructure: Robert Mroczkowski "Maszyny się uczą - admińskie rozmówki p...
PDF
PLNOG16: Integracja Ceph w OpenStack - status i przyszłość, Paweł Stefański
PDF
Migrate API w Drupalu [PL]
PDF
Ruby, Ruby on Rails 2010
PDF
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...
PDF
Skalowanie PostgreSQL @ DBConf.PL 2014
PDF
Automatyzacja utrzymania jakości w środowisku PHP
PDF
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
PDF
Michał Żyliński: Cortana dla niewtajemniczonych
PDF
Laravel Poznań Meetup #7 - "Praktyczne użycie Repository Pattern w Laravel cz...
PDF
Praktyczne użycie Repository Pattern w Laravel cz. I
PPT
Skalowalność Magento - MMPL13
PDF
Agregacja i analiza logów
PDF
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
PPTX
Tomasz Kopacz MTS 2012 Azure - Co i kiedy użyć (IaaS vs paas vshybrid cloud v...
Mongodb with Rails
Hadoop w NK.pl
PHP@Docker - w produkcji
Michał Dec - Quality in Clouds
[#4] spark - IBM Integrated Analytics System
infraxstructure: Robert Mroczkowski "Maszyny się uczą - admińskie rozmówki p...
PLNOG16: Integracja Ceph w OpenStack - status i przyszłość, Paweł Stefański
Migrate API w Drupalu [PL]
Ruby, Ruby on Rails 2010
“Dziesięć serwerów poproszę!“, czyli co może Ci zaoferować definiowanie infra...
Skalowanie PostgreSQL @ DBConf.PL 2014
Automatyzacja utrzymania jakości w środowisku PHP
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
Michał Żyliński: Cortana dla niewtajemniczonych
Laravel Poznań Meetup #7 - "Praktyczne użycie Repository Pattern w Laravel cz...
Praktyczne użycie Repository Pattern w Laravel cz. I
Skalowalność Magento - MMPL13
Agregacja i analiza logów
Ganymede - nowoczesne technologie w grach przeglądarkowych i mobilnych
Tomasz Kopacz MTS 2012 Azure - Co i kiedy użyć (IaaS vs paas vshybrid cloud v...
Ad

More from AnalyticsConf (12)

PDF
Dawid Gonzo Kałędowski: R jako osobisty GPS
PPTX
Tor Hovland: Taking a swim in the big data lake
PPTX
Rafał Korszuń: Security in Design of Cloud Applications
PDF
Tomasz Kopacz: Architektura i service fabric - jak budować aplikacje w paas v2
PPTX
Wiesław Kałkus: C# functional programming
PDF
Grzegorz Rycaj: Zdebuguj swoja prezentacje
PPTX
Przemysław Dzierżak: Hurtownie dla DBA
PPTX
Paweł Ciepły: PowerBI part1
PPTX
Shannon Holgate: Bending non-splittable data to harness distributed performance
PPT
Tomasz Nadolny: Open Data in Gdańsk
PDF
Włodek Bielski: Efektywne wdrożenie BI - z notatnika praktyka
PDF
Alex Kornilov: Building Big Data Company in Sports-Betting Industry - BETEGY ...
Dawid Gonzo Kałędowski: R jako osobisty GPS
Tor Hovland: Taking a swim in the big data lake
Rafał Korszuń: Security in Design of Cloud Applications
Tomasz Kopacz: Architektura i service fabric - jak budować aplikacje w paas v2
Wiesław Kałkus: C# functional programming
Grzegorz Rycaj: Zdebuguj swoja prezentacje
Przemysław Dzierżak: Hurtownie dla DBA
Paweł Ciepły: PowerBI part1
Shannon Holgate: Bending non-splittable data to harness distributed performance
Tomasz Nadolny: Open Data in Gdańsk
Włodek Bielski: Efektywne wdrożenie BI - z notatnika praktyka
Alex Kornilov: Building Big Data Company in Sports-Betting Industry - BETEGY ...

Paweł Kucharski: Oswajamy Słonia czyli po co nam Hadoop

  • 2. • Sotrender • Hadoop • Czym jest Hadoop? • Podstawowe elementy • Ekosystem Hadoop • Hive, Pig • Spark • HBase • Nasze doświaczenia • MySQL vs Hadoop • R
  • 5. SOTRENDER • Sotrender: narzędzie do analiz social media • Badania i raporty na życzenie Więcej: 2015.sotrender.pl
  • 8. SOTRENDER Zbieramy dane: • Facebook, Twitter, YouTube, Instagram • 30k profili • 250k API calls na godzinę
  • 11. CZYM JEST HADOOP • Święty gral Big Data • Rozproszony system przechowywania przetwarzania danych
  • 13. CZYM JEST HADOOP Otwarta implementacja paradygmatów Google: GoogleFileSystem i MapReduce Hadoop umożliwia: • przetwarzanie dużych ilościach danych • równolegle • niezawodnie • skalowalnie • zbudowanych z tanich komponentów
  • 14. CZYM JEST HADOOP Zalety • Elastyczny format danych • Nie wymaga agregacji (surowe dane) • Nie wymaga próbkowania (wszystkie dane) • Nie ma potrzeby usuwania danych • Skalowalny (od kilku do tysięcy węzłów)
  • 16. CZYM JEST HADOOP Zamiast przesyłać dane do programu, przesyłamy program do danych Data Data Data DataData Data Map Map Map Map Map Map reducer
  • 19. HISTORIA HADOOP • Stworzony w 2005 w Yahoo przez Doug Cutting • Wersja 0.14.1 w 2007 • Wersja 1.0 – grudzień 2011 • Wersja 2.2 - październik 2013
  • 20. HADOOP Główne dystrybucje • Hortonworks • HDP • Cloudera • CDH • MapR • M3
  • 22. HISTORIA HADOOP Yahoo • 600PB, 43k nodes Twitter: • 300PB 1000 nodes Facebook • 300PB, 600TB dziennie Google (maj 2014) • 2 EB, 600M QPS
  • 23. HADOOP 26% dużych firm używa Hadoopa, kolejne 18% zamierza to zrobić w ciągu dwóch lat.
  • 26. HADOOP DISTRIBUTED FILE SYSTEM HDFS
  • 27. HDFS Rozproszony system plików • Skalowalny • Odporny na awarię • Tani sprzęt • Duże ilości danych • Dla dużych klastrów
  • 28. HDFS Dwa podstawowe elementy: • Namenode • Datanode Dodatkowo: • JournalNode • Zookeeper
  • 29. HDFS • Block replication • Rack awareness • Self healing
  • 31. Konfiguracja węzłów: - niskiej/średniej klasy sprzęt - trochę RAMu - dużo dysków - szybkie karty sieciowe
  • 33. MAPREDUCE Pochodzenie: MPI, Google Składa się z trzech kroków • „Map” – operacje lokalne • „Shuffle” – redystrybucji wyników • „Reduce” – grupowanie wyników MapReduce nie ma być szybki, ale umożliwiać zrównoleglenie obliczeń na dużą skalę.
  • 36. Komisja wyborcza #1 MAPREDUCE PRZYKŁAD Komisja wyborcza #N Okręgowa komisja wyborcza Komisja wyborcza #M Komisja wyborcza #S Okręgowa komisja wyborcza Państwowa Komisja Wyborcza
  • 38. MAPREDUCE ON YARN YARN • Otwarty • Skalowalny • Zarządza tylko zasobami • Logika przenisiona do App Mstr http://hortonworks.com/blog/apache-hadoop-yarn-concepts-and-applications/
  • 39. PRZYKŁAD - WORDCOUNT public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } } public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } }
  • 40. PRZYKŁAD - WORDCOUNT import sys for line in sys.stdin: line = line.strip() words = line.split() for word in words: print '%st%s' % (word, 1) from operator import itemgetter import sys current_word = None current_count = 0 word = None for line in sys.stdin: line = line.strip() word, count = line.split('t', 1) try: count = int(count) except ValueError: continue # this IF-switch only works because Hadoop sorts map output if current_word == word: current_count += count else: if current_word: print '%st%s' % (current_word, current_count) current_count = count current_word = word if current_word == word: print '%st%s' % (current_word, current_count) http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/
  • 41. PRZYKŁAD - WORDCOUNT test@debian:~$ hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar -file /home/test/mapper.py -mapper /home/test/mapper.py -file /home/test/reducer.py -reducer /home/test/reducer.py -input /user/test/gutenberg/* -output /user/test/gutenberg-output
  • 43. EKOSYSTEM HADOOP Na tych dwóch głównych elementach zbudowano wiele gotowych rozwiązań https://hadoopecosystemtable.github.io/ 134 różne projekty
  • 44. Hive
  • 45. HIVE • Prosty interfejs do przetwarzania danych w Hadoopie, wygodniejszy niż pisanie własnych funkcji • Wykorzystuje język HiveQL, podobny do SQL
  • 46. HIVE SQL -> MapReduce SELECT COUNT(*) FROM test_table WHERE id IN( SELECT id FROM test_table2) GROUP BY grp_id zostaje przeszktałocne w serię zadań MapReduce
  • 47. HIVE • Możliwość czytania z wielu źródeł • External Tables • Pliki, Hbase, Hypertable, Cassandra, JDBC • Indeksy • Własne UDF i funkcje Map/Reduce
  • 48. HIVE CREATE TABLE input (line STRING); LOAD DATA LOCAL INPATH 'input.tsv' OVERWRITE INTO TABLE input; SELECT word, COUNT(*) FROM input LATERAL VIEW explode(split(text, ' ')) ITable as word GROUP BY word; Przykład: word count
  • 50. • Zapytania ad-hoc • Nie wymaga programowania • Zna informacje o strukturze danych
  • 51. Pig
  • 52. PIG Ten sam cel co HIVE inna droga Pig Latin Język skryptowy kompilowanych do zadań MapReduce
  • 53. PIG a = load '/user/test/word_count_text.txt'; b = foreach a generate flatten(TOKENIZE((chararray)$0)) as word; c = group b by word; d = foreach c generate COUNT(b), group; store d into '/user/test/pig_wordcount'; Wordcount example
  • 54. Spark
  • 55. SPARK Apache Spark™ is a fast and general engine for large-scale data processing. • Łatwy w użyciu • Możliwość pisania w: • Java, Scala, Python, R • Ponad 80 operacji wysokiego poziomu
  • 56. SPARK Transformation Meaning map(func) Return a new distributed dataset formed by passing each element of the source through a function func. filter(func) Return a new dataset formed by selecting those elements of the source on which func returns true. flatMap(func) Similar to map, but each input item can be mapped to 0 or more output items (so func should return a Seq rather than a single item). mapPartitions(func) Similar to map, but runs separately on each partition (block) of the RDD, so func must be of type Iterator<T> => Iterator<U> when running on an RDD of type T. mapPartitionsWithIndex(func) Similar to mapPartitions, but also provides func with an integer value representing the index of the partition, so func must be of type (Int, Iterator<T>) => Iterator<U> when running on an RDD of type T. sample(withReplacement, fraction, seed) Sample a fraction fraction of the data, with or without replacement, using a given random number generator seed. union(otherDataset) Return a new dataset that contains the union of the elements in the source dataset and the argument. intersection(otherDataset) Return a new RDD that contains the intersection of elements in the source dataset and the argument. distinct([numTasks])) Return a new dataset that contains the distinct elements of the source dataset.
  • 57. SPARK Action Meaning reduce(func) Aggregate the elements of the dataset using a function func (which takes two arguments and returns one). The function should be commutative and associative so that it can be computed correctly in parallel. collect() Return all the elements of the dataset as an array at the driver program. This is usually useful after a filter or other operation that returns a sufficiently small subset of the data. count() Return the number of elements in the dataset. first() Return the first element of the dataset (similar to take(1)). take(n) Return an array with the first n elements of the dataset. takeSample(withReplacement, num, [seed]) Return an array with a random sample of num elements of the dataset, with or without replacement, optionally pre-specifying a random number generator seed. saveAsTextFile(path) Write the elements of the dataset as a text file (or set of text files) in a given directory in the local filesystem, HDFS or any other Hadoop-supported file system. Spark will call toString on each element to convert it to a line of text in the file.
  • 58. SPARK text_file = spark.textFile("hdfs://...") counts = text_file.flatMap(lambda line: line.split(" ")) .map(lambda word: (word, 1)) .reduceByKey(lambda a, b: a + b) counts.saveAsTextFile("hdfs://...") Przykład: word count
  • 59. SPARK
  • 60. Spark sorts 100 TB in 23 minutes on 206 machines (6592 virtual cores), which translates into 4.27 TB/min or 20.7 GB/min/node.
  • 62. HBase
  • 63. HBASE Hbase • Opraty na Google BigTable • Baza danych • Obsługuje szybkie (w czasie rzeczywistym) operacje CRUD • Zapewnia spójność oczytu i zapisu • NoSQL – klucz-wartość • Jedynie proste operacje • Zbudowany na bazie HDFS
  • 64. HBASE • Rozproszona • Działa na wielu maszynach • Skalowalna • Automatyczny sharding • Dla dużych danych • Miliardy wierszy • Współpracuje z innymi elementami Hadoop
  • 65. HBASE Wady: • Tylko podstawowy zestaw operacji • Brak transakcji • Brak operacji na wielu tabelach • Wymaga dużych ilości danych • Inaczej nie ma sensu • Wymaga dużo IO, CPU i RAM
  • 66. HBASE • Dane są zapisywane w tabeli • Tabela składa się z wierszy • Każdy wiersz ma przypisany klucz • Tabela może mieć wiele rodzin kolumn • W każdej rodzinie kolumn może być wiele kolumn Row Stats Text 20151111 Total = 1 Count = 10 Msg = blabla 20151112 Total = 2 Posts = 10 Msg = hehe Tags = funny
  • 67. HBASE • Tabele dzielone są na regiony – zakresy kluczy • Regiony z jednej tabeli mogą być obsługiwane przez różne węzły (RegionServer)
  • 68. Dostęp: • Natywne API (Java) • REST • Thrift • Binarny protokół • Szybki • Obsługuje wiele języków
  • 70. POCZĄTKI MySQL • Zaczynaliśmy od 1 serwera • Dodawaliśmy kolejne serwery co kilka miesięcy • Zmienialiśmy serwery na co raz mocniejsze • Doszliśmy do 6 maszyn
  • 71. MySQL • Problem z migracją danych między serwerami • Brak skalowalności • Problem z modyfikacją struktury • Długi czas odzyskiwania po awarii • Trudna konfiguracja
  • 72. MYSQL TokuDB • Drzewa fraktalne • Kompresja (do 25x) • Tworzenie indeksów bez blokowania • Modyfikacja struktury bez blokowania • Działa efektywnie „out of box” • Replikacja „read free”
  • 73. HADOOP SOTRENDER Hadoop • Hbase • Zbieranie danych • Serwowanie danych w narzędziu • Hive • Niestandardowe analizy • Pig • Wyznaczanie trendów, dzienne obliczenia
  • 74. HADOOP SOTRENDER MySQL • 3 TB danych (skompresowanych) • 56 mld wierszy Hadoop: • 6 wezłów • 28 TB danych • HBase, Hive, Spark
  • 76. HADOOP SOTRENDER Plusy • Skalowalność • Faktycznie działa • Wydajność • Jednolity interfejs dostępu do danych • Integracja z R • Szybki rozwój
  • 77. HADOOP SOTRENDER Minusy • Braki w dokumentacji • Problemy ze stabilnością • Java • Błędy • Konfiguracja • Braki w kontroli dostępu • Szybki rozwój
  • 81. R I HADOOP • Do czego wykorzystujemy? • Delegowanie szczególnie „kosztownych” operacji na danych (np. tabele frekwencyjne, agregowanie rekordów dziennych/godzinnych), • Łatwy i relatywnie szybki dostęp do ogromnych tabel,
  • 82. R I HADOOP - DOSTĘP • Szereg pakietów w R do operacji na klastrze hadoopowym: • rmr – umożliwiający pisanie programów MapReduce w R, • rhdfs – dostęp do plików w HDFS, • rhbase – funkcje umożliwiające dostęp do tabel w Hbase • Możliwość nawiązania połączenia z Hive przez JDBC (pakiet RJDBC w R)
  • 83. R I HADOOP – DOSTĘP DO HIVE
  • 84. R I HADOOP - PRZYKŁAD R Operacje na już zagregowanych danych Tworzenie końcowego produktu (wykresy, raporty) Hive Agregowanie danych (np. podsumowanie aktywności pod tweetami) Bezpośrednie zapytania HBase Mapowanie tabel z Hbase do Hive
  • 85. R I HADOOP - PRODUKT http://www.sotrender.pl/trends/twitt er/reports/201510