Algoritmy pre rozsiahle dáta Michal Prílepok 27. septembra 2017 Katedra informatiky Fakulta elektrotechniky a informatiky Vysoká škola báňská Technická univerzita Ostrava
MapReduce/ Hadoop
MapReduce
MapReduce Programovací model a softvérový framework (infraštruktúra) vyvinutý spoločnosťou Google, určený na spracovanie rozsiahlych dát pomocou paralelných a distribuovaných algoritmov. Jerey Dean and Sanjay Ghemawat. MapReduce: Simplified data processing on large clusters. In Proceedings of the 6th Symposium on Operating System Design and Implementation (OSDI 2004), pages 137-150, San Francisco, California, 2004. Jerey Dean and Sanjay Ghemawat. MapReduce: Simplified data processing on large clusters. Communications of the ACM, 51(1):107-113, 2008. Jerey Dean and Sanjay Ghemawat. MapReduce: A flexible data processing tool. Communications of the ACM, 53(1):72-77, 2010.
Cieľom frameworku je zjednodušiť paralelné spracovanie rozsiahlych dát na veľkých výpočtových klastroch pozostávajúcich z bežne dostupného hardvéru, tak by bola zaistené spoľahlivosť a odolnosť voči chybám a výpadkom architektúry. Peta bajty dát Tisícky uzlov Spracovanie štruktúrovaných a neštruktúrovaných dát.
Poskytuje Automatickú paralelizáciu a distribúciu výpočtov. Ľahké rozširovanie architektúry. Plánovanie I/O operácií. Vyrovnávanie záťaže. Optimalizácia sieťových a dátových prenosov. Ochrana pred zlyhaním SW a HW. Ochrana pred stratou dát.
Tento prístup využíva prístup rozdeľ a panuj na distribúciu extrémne rozsiahlych problémov na extrémne veľkom počte výpočtových uzlov. Algoritmus MapReduce pozostáva z 2 hlavných úloh Map a Reduce. Map konvertuje vstupné dáta na dáta na formát klúč/ hodnota. Reduce výstup z úlohy Map spája medzivýsledky Map úloh do požadovaného výstupu.
Programovací model
Tok dát 1. Načítanie vstupu načítanie a rozdelenie vstupu na vhodné úseky dát, typicky 64/ 128MB a priradenie Map funkcie vygeneruje páry kľúč hodnota typicky distribuovaný súborový systém 2. Map funkcia vstupov je postupnosť párov kľuč/ hodnota a spracuje ich na výstupné páry kľúč hodnota vstupný a výstupný formát je často odlišný 3. Reduce funkcia Vygeneruje výstup 4. zápis výstupu
Príklad Spočítanie frekvenčného výskytu mien študentov Map() Filtrovanie, usporiadanie Usporiadania študentov podľa mena do front, jedna fronta pre každé meno Reduce() Vykonáva výslednú operáciu sumarizácie Spočítanie študentov v jednotlivých frontách, poskytnutie počtu výskotov pre každé meno
Tok dát (2)
Príklad 2 function map(string name, String document): // name: document name // document: document contents for each word w in document: emit (w, 1) function reduce(string word, Iterator partialcounts): // word: a word // partialcounts: a list of aggregated partial counts sum = 0 for each pc in partialcounts: sum += pc emit (word, sum)
MapReduce Hadoop Program fork fork fork Input Data assign map Master assign reduce Output Data Split 0 Split 1 Split 2 Transfer read petascale data through network Worker Worker Worker Map local write remote read, sort Worker Worker Reduce write Output File 0 Output File 1 16
GFS Proprietárny distribuovaný súborový systém Vyvinutý spoločnosťou Google Poskytuje efektívny prístup k dátam ma bežnom HW
GFS Skladá sa z Master node Chunk servers Každý súbor je rozdelený na bloky pevnej dĺžky Bloky dát sú uložené na chunk serveroch Každý blok je replikovaný niekoľko krát na iných chunk serveroch, minimálne 3 krát
GFS Master node Neukladaná dáta, obsahuje iba meta dáta o jednotlivých blokoch dát Riadi I/O operácie nad dátami Prijíma Heart-beat messages od chunk serverov
GFS
GFS Architektúra 22
Write operácia 23
PayLoad Aplikácia implementujúca Map a Reduce funkcie, vytvára tzv. Job. Mapper - Mapper mapuje vstupné kľúč/ hodnota páry na množinu medzi výsledkov vo forme kľúč/ hodnota párov. NamedNode Uzol riadiaci distribuovaný súborový systém Distributed File System (HDFS). DataNode Uzol na ktorý sú dáta uložené v predstihu pred ich spracovaním. MasterNode Uzol, na ktorom JobTracker spúšťa a prijíma jednotlivé úlohy od klientov. SlaveNode Uzol na ktorom sú spúšťané Map a Reduce programy. JobTracker Plánuje a prideľuje úlohy jednotlivým Task tracker-om. Task Tracker Sleduje stav a spracovanie úloh a reportuje ich stav JobTracker-u. Job Spustený program s implementovaným funkciami Map a Reduce nad dátami. Task Spustený program s funkciami Map a Reduce nad časťou dát. Task Attempt Konkrétna inštancia spustenej úlohy na SlaveNode uzle.
Implementácie: OpenSource Hadoop. Komerčné Cloudera.
Využitie MapReduce Google: Index building for Google Search Article clustering for Google News Statistical machine translation Yahoo!: Index building for Yahoo! Search Spam detection for Yahoo! Mail Facebook: Data mining Ad optimization Spam detection
Hadoop
Hadoop Framework, ktorý umožňuje distribuované spracovanie rozsiahlych dát na rozsiahlom počet výpočtových uzlov s použitím jednoduchých programovacích modelov. Obsahuje: HDFS (Hadoop Distributed File System) distribuovaný súborový systém. Hbase databázu. Hive SQL rozhranie na prehliadané dát. Pig platforma na vytváranie MapReduce programov.
Hadoop základné myšlienky Aplikácie sú písané v jazyku vyššej úrovne. Odpadá riešenie problémov s komunikáciou, výmenou dát. Jednotlivé uzly komunikujú čo najmenej. Vývojár by nemal písať kód na komunikáciu medzi jednotlivými uzlami. Dáta sú uložené do jednotlivých uzlov v predstihu. Výpočet prebieha na uzle, kde sú dáta uložené a kde je to možné. Dáta sú replikované do viacerých uzlov, aby sa zvýšila dostupnosť a spoľahlivosť.
Dáta sú rozdelené do blokov, zvyčajne 64 alebo 128MB. Hlavný program alokuje prácu jednotlivým uzlom. Viaceré uzly pracujú paralelne, každý na svojom bloku dát. Ak zlyhá uzol, master deteguje chybu a pridelí úlohu na iný. Reštartovanie úlohy nevyžaduje komunikáciu s inými uzlami pracujúcimi na iných blokoch dát. Ak jeden z uzlov pracuje pomaly, master môže redundantne spustiť rovnakú úlohy na inom uzle. Výsledky prvej dokončenej úlohy budú použité.
Hadoop ekosystém
Hadoop Distributed File System (HDFS) Súborový systém navrhnutý na výkonnosť a spoľahlivosť na obrovské dátové sady. Inšpirovaný Google File System. Napísaný v Jave. Ukladá veľké súbory na viacerých uzloch. Skladaná sa name node a data nodes Name node - centrálny uzol súborového systému Data node - obsahuje bloky dát Dáta sú uložené v 3 data nodes. Jednotlivé data node môžu medzi sebou komunikovať presúvanie, kopírovanie dát
ApacheHBase Nerelačná distribuovaná databáza. Vychádza z Goole BigTable. Podporuje kompresie a in-memory operácie. Tabuľky HBase databázy môžu byť použité ako vstup a výstup MapReduce úloh. Využíva Facebook Messaging Platform.
Apache Hive Framework umožňujúci sumarizáciu dát, spracovanie požiadaviek a analýzu. Vyvinutý spoločnosťou Facebook. Umožňuje: prácu s dátami pomocou HiveQL, jazyk založený na SQL, prácu s komprimovanými dátami. Vývoj podporujú spoločnosti ako Netflix, Amazon.
Pig platforma na vytváranie MapReduce programov. Programovací jazyk vyššie úrovne. Vývojári sa nestarajú o sieťové programovanie, časové závislosti,... Abstraktný programovací jazyk Pig Latin. Vyvinutý spoločnosťou Yahoo (2006).
WordCount 2 vstupné súbory: file1: hello world hello moon file2: goodbye world goodnight moon 3 operácia: Map Combine Reduce
WordCount Map File1 File2 < hello, 1 > < goodbye, 1 > < world, 1 > < world, 1 > < hello, 1 > < goodnight, 1 > < moon, 1 > < moon, 1 > Combine < moon, 1 > < goodbye, 1 > < world, 1 > < world, 1 > < hello, 2 > < goodnight, 1 > < moon, 1 > Reduce < goodbye, 1 >, < goodnight, 1 >, < moon, 2 >, < world, 2 >, < hello, 2 >
public int run(string[] args) { - Create a new job with the given configuration - Set Job Output as <key.class, value.class> as <Text, IntWritable> - Set Job Input as <key.class, value.class> as <TextInputFormat, TextOutputFormat> - Tell Job to use our Map as Mapper class - Tell Job to use our Reduce as Combiner class - Tell Job to use our Reduce as Reducer class - Set file input paths - Set file output paths in the Job - Wait until Job is done - Return success if successful }
public int run(string[] args) { Job job = new Job(getConf()); job.setjarbyclass(wordcount.class); job.setjobname( wordcount ); job.setoutputkeyclass(text.class); job.setoutputvalueclass(intwritable.class); job.setmapperclass(map.class); job.setcombinerclass(reduce.class); job.setreducerclass(reduce.class); job.setinputformatclass(textinputformat.class); job.setoutputformatclass(textoutputformat.class); FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPaths(job, new Path(args[1])); boolean success = job.waitforcompletion(true); return success? 0 : 1; }
public static class Map extends Mapper { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(longwritable key, Text value, Context context) { String line = value.tostring(); StringTokenizer tokenizer = new StringTokenizer(line); while (tokenizer.hasmoretokens()) { word.set(tokenizer.nexttoken()); context.write(word, one); } } }
File1 File2 < hello, 1 > < goodbye, 1 > < world, 1 > < world, 1 > < hello, 1 > < goodnight, 1 > < moon, 1 > < moon, 1 >
Combine Určuje ako sa budú spájať jednotlivé páry kľúč/ hodnota pre miestnu agregáciu.
< moon, 1 > < goodbye, 1 > < world, 1 > < world, 1 > < hello, 2 > < goodnight, 1 > < moon, 1 >
public static class Reduce extends Reducer { public void reduce(text key, Iterable values, Context context) { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(key, new IntWritable(sum)); } }
< goodbye, 1 >, < goodnight, 1 >, < moon, 2 >, < world, 2 >, < hello, 2 >
Pig Platforma na vytváranie MapReduce programov vo vyššie abstraktného programovacieho jazyka Vyvinutý spoločnosťou Yahoo (2006) Formát jazyka je podobný zápisu SQL jazyka Môže byť rozšírený pomocou užívateľom definovaných funkcií (UDF) napísaných v jazykoch Java, Python, JavaScript, Ruby alebo Groovy
Word Count - Pig input_lines = LOAD '/tmp/my-copy-of-all-pages-on-internet' AS (line:chararray); -- Extract words from each line and put them into a pig bag -- datatype, then flatten the bag to get one word on each row words = FOREACH input_lines GENERATE FLATTEN(TOKENIZE(line)) AS word; -- filter out any words that are just white spaces filtered_words = FILTER words BY word MATCHES '\\w+'; -- create a group for each word word_groups = GROUP filtered_words BY word;
Word Count (2) -- count the entries in each group word_count = FOREACH word_groups GENERATE COUNT(filtered_words) AS count, group AS word; -- order the records by count ordered_word_count = ORDER word_count BY count DESC; STORE ordered_word_count INTO '/tmp/number-of-words-oninternet';