600 likes | 717 Views
Nowe abstrakcje programowania rozproszonego. Wykład: Map Reduce Laboratoria: Hadoop. Aftowicz Jakub Ciesielczyk Tomasz. Problemy. Big Data. B i g D a t a. MapReduce. M a p R e d u c e. Aftowicz Jakub Ciesielczyk Tomasz. Motywacje.
E N D
Nowe abstrakcje programowania rozproszonego Wykład: Map Reduce Laboratoria: Hadoop Aftowicz JakubCiesielczyk Tomasz
Problemy Big Data BigData
MapReduce MapReduce Aftowicz JakubCiesielczyk Tomasz
Motywacje • Page Rank – mnożenie dużych macierzy przez wektor • Przeglądanie i przeszukiwanie sieci społecznościowych (facebook – ponad miliard użytkowników). Grafy z miliardem węzłów oraz miliardami (bilionami) krawędzi. • Analiza zawartości pobranych stron • Tworzenie indeksów odwrotnych
Przykład wordcount Ala ma kota. Ala ma psa. Pies ma Alę.
Word count – jedna maszyna HashMap<String,Integer> wordCount = newHashMap<>();
Word count – jedna maszyna HashMap<String,Integer> wordCount = newHashMap<>(); for (Documentdocument : documentSet){ String[] T = tokenize ( document ) ; }
Word count – jedna maszyna HashMap<String,Integer> wordCount = newHashMap<>(); for (Documentdocument : documentSet){ String[] T = tokenize ( document ) ; for(Stringtoken: T){ if (!wordCount.containsKey(token)){ wordCount.put(token,1); } else{ wordCount.put(token, wordCount.get(token)+1); } } }
Word count – wiele maszyn HashMap<String,Integer> wordCount = newHashMap<>(); for (Documentdocument: documentSubSet){ String[] T = tokenize ( document ) ; for(Stringtoken: T){ if (!wordCount.containsKey(token)){ wordCount.put(token,1); } else{ wordCount.put(token, wordCount.get(token)+1); } } } sendSecondStep(wordCount);
Word count – wiele maszyn Second step: HashMap<String,Integer> globalWordCount; for ( HashMap<String,Integer> wordCount : receivedWordCount) { add(globalWordCount , wordCount); }
Word count – wiele maszyn Aby procedura mogła zadziałać na grupie maszyn, musimy spełnić następujące funkcjonalności: • Składowanie plików (fragmentów danych) na dyskach maszyn (documentSubSet) • Zapisywanie dane do tabeli hashowych opartych o dyski twarde tak by nie być ograniczonym pamięcią RAM • Podzielenie danych pośrednich (wordCount) z kroku pierwszego. • Rozdysponowanie fragmentów danych do odpowiednich maszyn • Sprawdzanie poprawności
Word count – wiele maszyn • Co się stanie w przypadku awarii jednej ze stacji roboczych? • Co się stanie w przypadku awarii zarządcy? • Co się stanie w przypadku natrafienia na wadliwe dane? • Jak należy rozproszyć dane? • W jaki sposób zebrać wyniki?
MapReduce - Założenia • Automatyczna dystrybucja danych programista tylko definiuje w jaki sposób odczytywać dane (np. podziel wiersz w pliku po średniku) • Automatyczne zrównoleglenie zadań programista tylko pisze co chce zrobić (reducer) • Automatyczne zarządzanie zadaniami zrównoleglenie wątków jest transparentne dla programisty
MapReduce - Założenia • Odporność - implementacja powinna być niewrażliwa na awarię maszyn • Automatyczna komunikacja • „Loadbalancing” • Skalowalność – skalowalny liniowo poprzez dodawanie kolejnych maszyn • Dostępność – użycie na grupie normalnych maszyn (PC), chmura obliczeniowa typu Amazon, Beyond
MapReduce - Idea • Map Generowanie pary klucz-wartość • Reduce Łączy wartości związane z wcześniej wygenerowanymi kluczami „Dziel i zwyciężaj”
Word count – MapReduce public map( Stringfilename , Stringdocument ) { List<String> T = tokenize ( document ) ; for(Stringtoken: T){ emit(token , 1) ; } }
Word count – MapReduce public reduce ( Stringtoken , List<Integer>values ) { Integer sum = 0; for(Integervalue:values) { sum = sum + value ; } emit (token , sum) ; }
Mnożenie macierzyprzezwektor • Zdefiniujmy macierz M o rozmiarze n x n o elementach mijoraz wektor V o długości n o elementach vj • Wynikiem iloczynu M*V jest wektor X o długości no elementach zdefiniowano: • Macierz M jest przechowywana za pomocą trójki liczb (i, j,mij)
Mnożenie macierzyprzezwektor • Załóżmy, że n jest duże, ale nie na tyle, żeby wektor nie zmieścił się w pamięci i jest dostępny w każdym Mapperze
Mnożenie macierzyprzezwektor • Map: • Przechowuje cały wektor v i fragment macierzy M. • Z każdego elementu mij produkuje parę klucz-wartość <i, mij*vj>component • Reduce • Sumowanie wszystkich wartości dla danego klucza i (komórka wektora x). Wyjście : <i,xi>
Mnożenie macierzyprzezwektor • Załóżmy, że n jest na tyle duże że wektor nie zmieścił się w pamięci Mappera i musi nastąpić jego podział • Podzielmy zatem macierz na pionowe fragmenty o jednakowej szerokości, a następnie wektor na jednakową ilość poziomych fragmentów • i-ty fragment macierzy będzie mnożony jedyni z elementami z i-tego fragmentu wektora
Mnożenie macierzyprzezwektor • Map: • Przechowuje fragment wektora v i macierzy M. • Z każdego elementu mij produkuje parę klucz-wartość <i, mij*vj>component • Reduce • Sumowanie wszystkich wartości dla danego klucza i (komórka wektora x). Wyjście : <i,xi>
Korzyści… • Umożliwia programistom bez doświadczenia z dziedziny systemów równoległych i rozproszonych, korzystanie z zasobów dużego systemu rozproszonego • Ukrywa „niechlujne” szczegółyzrównoleglenia, obsługi błędów, rozproszenie danychi równoważenie obciążenia w bibliotece.
Awaria workera • Master periodycznie pinguje każdego workera • Master oznacza wadliwego workera • Wszystkie zadania Mapowania zlecone do tej pory danemu workerowi przywracane są do stanu Idle • Wyniki przechowywane są lokalnie na maszynie która uległa awarii • Ukończone zadania typu Reduce nie muszą być powtarzane • Wyniki zadań Reduce przechowywane są w GFS
Awaria workera • Kiedy zadanie Map zostaje przeniesione z workera A do B wszyscy workerzy wykonujący zadania typu Reduce zostają powiadomieni o zmianie • Powtórne wykonanie podstawowym mechanizmem obsługi błędów • MapReduce jest odporne na awarie wielu stacji roboczych naraz, przenosząc obliczenia na działające maszyny i kontynuąjąc przetwarzanie
Awaria Mastera • Master może wykonywać Checkpointy • Po awarii nowa kopia Mastera może wystartować z ostatniego Checkpointu • Jednak przy posiadaniu tylko jednego Mastera sznasa jego awarii jest niewielka… • … dlatego implementacje przerywają przetwarzanie w przypadku awarii mastera
Ciekawostki i zalecenia • Problem „Maruderów” • Wykonania „Pojedynczych” zadań się przeciągają • Backup Tasks • Do 44% wzrost czasu wykonania • Problem „Złych Rekordów” • Błędy w kodzie użytkownika powodujące awarie w wyniku przetwarzania pewnych danych • Błędy w zewnętrznych bibliotekach • Czasami dopuszczalne jest pominięcie niektórych rekordów
Ciekawostki i zalecenia • Partycjonowanie • Domyślne • (hash(key) mod R) • Użytkownika • Np. grupowanie po URL (hash(Hostname(urlkey)) modR) • Zasoby na jednym serwerze odpytywane przez jednego workera • korzystamy z usprawnień protokołu HTTP i HTTPS • Sortowanie (TeraSort)
Ciekawostki i zalecenia • Combiner • Kierowanie danych w paczkach do Reducerów • Z reguły powiela kod Reducera • Potrafi znacząco przyspieszyć rozwiązywani niektórych problemów MapReduce • Np. wordcount • wiele <the, 1> zagregowane do <the, k> • Oszczędność przy wysyłaniu przez sieć
MapReduce: koszt i problemy • Wąskim gardłem dla MapReduce jest komunikacja danych po sieci • Ilość zadań powinna być dużo większa od ilości workerów
MapReduce koszt i problemy • Dla maksymalnego zrównoleglenia mappery i reducery powinny być stateless, nie powinny zależeć od żadnych danych w obrębie zadania MapReduce. Nie jest możliwym sterowania porządkiem wykonywania zadań map i reduce. • Faza reduce nie jest wykonywana przed zakończeniem fazy map • Zakłada się, że wynik reducera jest mniejszy od wejścia mappera
MapReduce: koszt i problemy Czy MapReduce/Hadoop rozwiąże moje problemy? • tak, jeśli umiesz przekształcić algorytm do postać Map-Reduce • „It is not a silver bullet to all the problems of scale, just a good technique to work on large sets of data when you can work on small pieces of that dataset in parallel „
SQL a MapReduce • R,S – relacje (tabele) • t, t’ : krotki • s – warunek selekcji • A, B, C – podzbiór atrybutów • a, b, c – wartości atrybutów dla danego podzbioru atrybutów
Selekcja • MapDla każdej krotki t w R sprawdź czy spełnia warunek selekcji s. Jeśli spełnia to produkuj parę klucz wartość: (t, t) • Reduce Po prostu przekazuje dane na wyjście
Projekcja • MapDla każdej krotki t w R wyprodukuj krotkę t’ poprzez wyeliminowanie atrybutów spoza zbioru A. Wyjście (t,t’) • ReduceDla każdego klucza może być wiele krotek t’. Wejście (t’,[t’,…t’]). Wyjście: dla każdej krotki t’ wyprodukuj (t’,t’)
Suma (Union) • Map wyjście: (t’,t’) dla każdej z relacji S i R • Reduce Dla każdego klucza t wyprodukuj (t,t)
Różnica • MapDla krotki t z relacji R wyprodukuj (t, name(R)). Dla krotki t z relacji S: (t, name(S)) • Reduce Dla każdego klucza t : -jeśli lista wartości zawiera tylko name(R) to wyporodukuj (t, t) -jeśli lista wartości zawiera: [name(R), name(S)] lub [name(s)] lub [name(S), name(R)] nie produkuj nic
Przecięcie • Map: dla każdej R lub S wyprodukuj (t, t) • Reduce Jeżeli klucz t ma parę wartości to wyprodukuj (t, t). W Przeciwnym wypadku nie produkuj nic
Natural Join • Map dla każdej krotki (a, b) z R wyprodukuj (b,[name(R),a]). Dla każdej krotki (b, c) z S wyprodukuj (b,[name(S),c]) • Reduce klucz b zawiązany jest z wartościami: [name(R),a] i [name(S),c]. Wygeneruj wszystkie możliwe pary: (b,a1,c1), (b,a2,c1), … , (b,an,cn).
Grupowanie i Agregacja • MapDana relacja R (A,B,C). Aby pogrupować ją po atrybucie A i zagregować po atrybucie B wyprodukuj parę (a,b) • Reducewejście: (a,[b1,b2 …]). Dla listy wartości przeprowadź funkcje agregacji, np. suma. Wyprodukuj parę (a, x) gdzie x to suma wszystkich wartości dla klucza a
Hadoop Aftowicz JakubCiesielczyk Tomasz
Hadoop • Implementacja OpenSourceMapReduce • Pracuje w architekturze master/slave dla rozproszonych danych oraz rozproszonych obliczeń • Uruchomienie Hadoopa wiąże się z uruchomieniem szeregiem różnych usług na serwerach dostępnych w sieci: NameNode, DataNode, SecondaryNameNode, JobTracker, TaskTracker
Hadoop - NameNode • Zarządza Hadoop File System(HDFS), kieruje niskopoziomowymi operacjami we/wyj na DataNode • Śledzi podział danych (plików) na bloki, wie gdzie te bloki się znajdują • NameNodezazwyczaj nie przechowuje żadnych danych oraz nie robi żadnych obliczeń dla procesu MapReduce • W przypadku awarii NameNode HDFS nie działa. Można opcjonalnie użyć SecondaryNameNode
Hadoop – SecondaryNameNode • Odpowiada za monitorowanie stanu HDFS • Każda grupa komputerów/klaster? (cluster) ma jeden SecondaryNameNode, który znajduje się na osobnej maszynie • Różni się od NameNode tym że nie dostaje ani nie rejestruje żadnych danych w czasie rzeczywistym od HDFS. W zamian za to komunikuje się z NameNode, żeby zapisać stan HDFS (snapshot). Częstotliwość zapisu jest determinowana przez ustawienia klastra.