Distributed Computing with MapReduce Lecture 2 of NoSQL Databases (PA195) David Novak & Vlastislav Dohnal Faculty of Informatics, Masaryk University, Brno Agenda ● Distributed Data Processing ● Google MapReduce ○ Motivation and History ○ Google File System (GFS) ○ MapReduce: Schema, Example, MapReduce Framework ● Apache Hadoop ○ Hadoop Modules and Related Projects ○ Hadoop Distributed File System (HDFS) ○ Hadoop MapReduce ● MapReduce in Other Systems 2 Distributed Data Processing What is the best way of doing distributed processing? Centralized (and in memory) Don't do it, if don't have to 3 Big Data Processing ● Big Data analytics (or data mining) ○ need to process large data volumes quickly ○ want to use computing cluster instead of a super-computer ● Communication (sending data) between compute nodes is expensive => model of “moving the computing to data” 4 Big Data Processing II ● HW failures are rather a rule than an exception: 1. Files must be stored redundantly ■ over different racks to overcome also rack failures 2. Computations must be divided into independent tasks ■ that can be restarted in case of a failure switch racks with compute nodes Computing cluster architecture: source: J. Leskovec, A. Rajaraman, and J. D. Ullman, Mining of Massive Datasets. 2014. 5 Agenda ● Distributed Data Processing ● Google MapReduce ○ Motivation and History ○ Google File System (GFS) ○ MapReduce: Schema, Example, MapReduce Framework ● Apache Hadoop ○ Hadoop Modules and Related Projects ○ Hadoop Distributed File System (HDFS) ○ Hadoop MapReduce ● MapReduce in Other Systems 6 PageRank PageRank works by counting the number and quality of links to a page to determine a rough estimate of how important the website is. The underlying assumption is that more important websites are likely to receive more links from other websites. https://en.wikipedia.org/wiki/PageRank 7 ● Additional factors: 1. Individual data files can be enormous (terabyte or more) 2. The files were rarely updated ■ the computations were read-heavy, but not very write-heavy ■ If writes occurred, they were appended at the end of the file MapReduce: Origins ● In 2003, Google had the following problem: 1. How to rank tens of billions of webpages by their “importance” (PageRank) in a “reasonable” amount of time? 2. How to compute these rankings efficiently when the data is scattered across thousands of computers? 8 Google Solution ● Google found the following solutions: ○ Google File System (GFS) ■ A distributed file system ○ MapReduce ■ A programming model for distributed data processing 9 Google File System (GFS) ● One machine is a master, the other chunkservers ○ The master keeps track of all file metadata ■ mappings from files to chunks and locations of the chunks ○ To find a file chunk, client queries the master, and then contacts the relevant chunkservers ○ The master’s metadata files are also replicated ● Files are divided into chunks (typically 64 MB) ○ The chunks are replicated at three different machines ■ ...in an “intelligent” fashion, e.g. never all on the same computer rack ○ The chunk size and replication factor are tunable 10 GFS: Schema source: http://dl.acm.org/citation.cfm?id=945450 11 MapReduce (1) ● MapReduce is a programming model sitting on the top of a Distributed File System ○ Originally: no data model – data stored directly in files ● A distributed computational task has three phases: 1. The map phase: data transformation 2. The grouping phase ■ done automatically by the MapReduce Framework 3. The reduce phase: data aggregation ● User must define only map & reduce functions 12 Map ● Map function simplifies the problem in this way: ○ Input: a single data item (e.g., line of text) from a data file ○ Output: zero or more (key, value) pairs ● The keys are not typical “keys”: ○ They do not have to be unique ○ A map task can produce several key-value pairs with the same key (even from a single input) ● Map phase applies the map function to all items. 13 input data map function output data (color indicates key) 14 Grouping Phase ● Grouping (Shuffling): The key-value outputs from the map phase are grouped by key ○ Values sharing the same key are sent to the same reducer. ○ These values are consolidated into a single list (key, list). ■ This is convenient for the reduce function ○ This phase is realized by the MapReduce framework. intermediate output (color indicates key) shuffle (grouping) phase 15 Reduce Phase ● Reduce: combine the values for each key ■ to achieve the final result(s) of the computational task ○ Input: (key, value-list) ■ the value-list contains all values generated for a given key in the Map phase ○ Output: (key, value-list) ■ zero or more output records 16 input data map function intermediate output (color indicates key) input data reduce function output data shuffle (grouping) phase 17 Example: Word Count Task: Calculate word frequency in a set of documents map(String key, Text value): // key: document name (ignored) // value: content of document (words) foreach word w in value: emitIntermediate(w, 1); reduce(String key, Iterator values): // key: a word // values: a list of counts int result = 0; foreach v in values: result += v; emit(key, result); 18 Example: Word Count (2) source: http://www.cs.uml.edu/~jlu1/doc/source/report/MapReduce.html 19 MapReduce: Combiner ● If the reduce function is commutative & associative ○ The values can be combined in any order and combined per partes (grouped) ■ with the same result (e.g., Word Counts) ● ...then we can do "partial reductions" ○ Apply the same reduce function right after the map phase, before shuffling and redistribution to reducer nodes ● This (optional) step is known as the combiner ○ Note: it is still necessary to run the reduce phase. 20 Example: Word Count, Combiner Task: Calculate word frequency in a set of documents combine(String key, Iterator values): // key: a word // values: a list of local counts int result = 0; foreach v in values: result += v; emit(key, result); 21 Example: Word Count with Combiner source: http://www.admin-magazine.com/HPC/Articles/MapReduce-and-Hadoop 22 MapReduce Framework ● MapReduce framework takes care about ○ Distribution and parallelizing of the computation ○ Monitoring of the whole distributed task ○ The grouping (shuffling) phase ■ putting together intermediate results ○ Recovering from any failures ● User must define only map & reduce functions ○ but can define also other additional functions (see below) 23 MapReduce Framework (2) source: Dean, J. & Ghemawat, S. (2004). MapReduce: Simplified Data Processing on Large Clusters 24 MapReduce Framework: Details 1. Input reader (function) ○ defines how to read data from underlying storage 2. Map (phase) ○ master node prepares M data splits and M idle Map tasks ○ pass individual splits to the Map tasks that run on workers ○ these map tasks are then running ○ when a task is finished, its intermediate results are stored 3. Combiner (function, optional) ○ combine local intermediate output from the Map phase 25 MapReduce Framework: Details (2) 4. Partition (function) ○ to partition intermediate results for individual Reducers 5. Comparator (function) ○ sort and group the input for each Reducer 6. Reduce (phase) ○ master node creates R idle Reduce tasks on workers ○ Partition function defines a data batch for each reducer ○ each Reduce task uses Comparator to create key-values pairs ○ function Reduce is applied on each key-values pair 7. Output writer (function) ○ defines how the output key-value pairs are written out 26 MapReduce: Example II Task: Calculate a graph of web links ● what pages reference () each page (backlinks) map(String url, Text html): // url: web page URL // html: HTML text of the page (linearized HTML tags) foreach tag t in html: if t is then: emitIntermediate(t.href, url); reduce(String key, Iterator values): // key: target URLs // values: a list of source URLs emit(key, values); 27 Example II: Result Input: (page_URL, HTML_code) ("http://cnn.com", "...link...") ("http://ihned.cz", "...link...") ("http://idnes.cz", "...x... y...z ") Intermediate output after Map phase: ("http://cnn.com", "http://cnn.com") ("http://cnn.com", "http://ihned.cz") ("http://cnn.com", "http://idnes.cz") ("http://ihned.cz", "http://idnes.cz") ("http://idnes.cz", "http://idnes.cz") Intermediate result after shuffle phase (the same as output after Reduce phase): ("http://cnn.com", ["http://cnn.com", "http://ihned.cz", "http://idnes.cz"] ) ("http://ihned.cz", [ "http://idnes.cz" ]) ("http://idnes.cz", [ "http://idnes.cz" ]) 28 MapReduce: Example III Task: What are the lengths of words in the input text ● output = how many words are in the text for each length map(String key, Text value): // key: document name (ignored) // value: content of document (words) foreach word w in value: emitIntermediate(length(w), 1); reduce(Integer key, Iterator values): // key: a length // values: a list of counts int result = 0; foreach v in values: result += v; emit(key, result); 29 MapReduce: Features ● MapReduce uses a “shared nothing” architecture ○ Nodes operate independently, sharing no memory/disk ○ Common feature of many NoSQL systems ● Data partitioned and replicated over many nodes ○ Pro: Large number of read/write operations per second ○ Con: Coordination problem – which nodes have my data, and when? 30 Applicability of MapReduce ● MR is applicable if the problem is parallelizable ● Two problems: 1. The programming model is limited (only two phases with a given schema) 2. There is no data model - it works only on “data chunks” ● Google’s answer to the 2nd problem was BigTable ○ The first column-family system (2005) ○ Subsequent systems: HBase (over Hadoop), Cassandra,... 31 Agenda ● Distributed Data Processing ● Google MapReduce ○ Motivation and History ○ Google File System (GFS) ○ MapReduce: Schema, Example, MapReduce Framework ● Apache Hadoop ○ Hadoop Modules and Related Projects ○ Hadoop Distributed File System (HDFS) ○ Hadoop MapReduce ● MapReduce in Other Systems 32 Apache Hadoop ● Open-source software framework ○ Implemented in Java ● Able to run applications on large clusters of commodity hardware ○ Multi-terabyte data-sets ○ Thousands of nodes ● Derived from the idea of Google's MapReduce and Google File System web: http://hadoop.apache.org/ 33 Hadoop: Modules ● Hadoop Common ○ Common support functions for other Hadoop modules ● Hadoop Distributed File System (HDFS) ○ Distributed file system ○ High-throughput access to application data ● Hadoop YARN ○ Job scheduling and cluster resource management ● Hadoop MapReduce ○ YARN-based system for parallel data processing source: https://goo.gl/NPuuJr 34 HDFS (Hadoop Distributed File System) ● Free and open source ● Cross-platform (pure Java) ○ Bindings for non-Java programming languages ● Highly scalable ● Fault-tolerant ○ Idea: “failure is the norm rather than exception” ■ A HDFS instance may consist of thousands of machines and each can fail ○ Detection of faults ○ Quick, automatic recovery ● Not the best in efficiency 35 HDFS: Data Characteristics ● Assumes: ○ Streaming data access ■ reading the files from the beginning till the end ○ Batch processing rather than interactive user access ● Large data sets and files ● Write-once / read-many ○ A file once created does not need to be changed often ○ This assumption simplifies coherency ● Optimal applications for this model: MapReduce, web-crawlers, data warehouses, … 36 HDFS: Basic Components ● Master/slave architecture ● HDFS exposes file system namespace ○ File is internally split into blocks ● NameNode - master server ○ Manages the file system namespace ■ Opening/closing/renaming files and directories ■ Regulates file accesses ○ Determines mapping of blocks to DataNodes ● DataNode - manages file blocks ○ Block read/write/creation/deletion/replication ○ Usually one per physical node 37 HDFS: Schema 38 HDFS: NameNode ● NameNode has a structure called FsImage ○ Entire file system namespace + mapping of blocks to files + file system properties ○ Stored in a file in NameNode’s local file system ○ Designed to be compact ■ Loaded in NameNode’s memory (4 GB of RAM is sufficient) ● NameNode uses a transaction log called EditLog ○ to record every change to the file system’s meta data ■ E.g., creating a new file, change in replication factor of a file, .. ○ EditLog is stored in the NameNode’s local file system 39 HDFS: DataNode ● Stores data in files on its local file system ○ Each HDFS block in a separate file ○ Has no knowledge about HDFS file system ● When the DataNode starts up: ○ It generates a list of all HDFS blocks = BlockReport ○ It sends the report to NameNode 40 HDFS: Blocks & Replication ● HDFS can store very large files across a cluster ○ Each file is a sequence of blocks ○ All blocks in the file are of the same size ■ Except the last one ■ Block size is configurable per file (default 128MB) ○ Blocks are replicated for fault tolerance ■ Number of replicas is configurable per file ● NameNode receives HeartBeat and BlockReport from each DataNode ○ BlockReport: list of all blocks on a DataNode 41 HDFS: Block Replication 42 HDFS: Reliability ● Primary objective: to store data reliably in case of: ○ NameNode failure ○ DataNode failure ○ Network partition ■ a subset of DataNodes can lose connectivity with NameNode ● In case of absence of a HeartBeat message ○ NameNode marks “dead” the DataNodes without HeartBeat, and does not send any I/O requests to them. ○ The death of a DataNode typically results in re-replication 43 Hadoop: MapReduce ● Hadoop MapReduce requires: ○ Distributed file system (typically HDFS) ○ Engine that can distribute, coordinate, monitor and gather the results (typically YARN) ● Two main components: ○ JobTracker (master) = scheduler ■ tracks the whole MapReduce job ■ communicates with HDFS NameNode to run the task close to the data ○ TaskTracker (slave on each node) – is assigned a Map or a Reduce task (or other operations) ■ Each task runs in its own JVM 44 Hadoop HDFS + MapReduce source: http://bigdata.black/architecture/hadoop/what-is-hadoop/ 45 Hadoop MapReduce: Schema 46 output file 1 output file 2 Map phase Reduce phase input files block 1 block 2 block 3 block 4 block 5 Hadoop MR: WordCount Example (1) public class Map extends Mapper { private final static IntWritable one = new IntWritable(1); private final Text word = new Text(); @Override protected void map(LongWritable key, Text value, Context context) throws ... { String string = value.toString() StringTokenizer tokenizer = new StringTokenizer(string); while (tokenizer.hasMoreTokens()) { word.set(tokenizer.nextToken()); context.write(word, one); } } } 47 Hadoop MR: WordCount Example (2) public class Reduce extends Reducer { @Override public void reduce (Text key, Iterable values, Context context) throws ... { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(key, new IntWritable(sum)); } } 48 source: http://www.dineshonjava.com/2014/11/hadoop-architecture.html#.WLU6aBLyso8 49 Hadoop: Related Projects ● Avro: a data serialization system ● HBase: scalable distributed column-family database ● Cassandra: scalable distributed column-family database ● ZooKeeper: high-performance coordination service for distributed applications ● Hive: data warehouse: ad hoc querying & data summarization ● Mahout: scalable machine learning and data mining library 50 Agenda ● Distributed Data Processing ● Google MapReduce ○ Motivation and History ○ Google File System (GFS) ○ MapReduce: Schema, Example, MapReduce Framework ● Apache Hadoop ○ Hadoop Modules and Related Projects ○ Hadoop Distributed File System (HDFS) ○ Hadoop MapReduce ● MapReduce in Other Systems 51 MapReduce: Implementation Amazon Elastic MapReduce 52 Apache Spark ● Engine for distributed data processing ○ Runs over Hadoop Yarn, Apache Mesos, standalone, … ○ Can access data from HDFS, Cassandra, HBase, AWS S3 ● Can do MapReduce ○ Is much faster than pure Hadoop ■ They say 10x on the disk, 100x in memory ○ The main reason: intermediate data in memory ● Different languages to write MapReduce tasks ○ Java, Scala, Python, R homepage: http://spark.apache.org/ 53 Apache Spark: Example ● Example of a MapReduce task in Spark Shell ○ The shell works with Scala language ○ Example: Word count val textFile = sc.textFile("hdfs://...") val counts = textFile.flatMap(line => line.split(" ")) .map(word => (word, 1)) .reduceByKey(_+_) counts.saveAsTextFile("hdfs://...") ● Comparison of Hadoop and Spark: link 54 MapReduce in MongoDB collection "accesses": { "user_id": , "login_time": , "logout_time": , "access_type": } ● How much time did each user spend logged in ○ Counting just accesses of type “regular” db.accesses.mapReduce( function() { emit (this.user_id, this.logout_time - this.login_time); }, function(key, values) { return Array.sum( values ); }, { query: { access_type: "regular" }, out: "access_times" } ) 55 References ● RNDr. Irena Holubova, Ph.D. MMF UK course NDBI040: Big Data Management and NoSQL Databases ● Dean, J. & Ghemawat, S. MapReduce: Simplified Data Processing on Large Clusters. In OSDI 2004 (pp 137-149) ● Firas Abuzaid, Perth Charernwattanagul (2014). Lecture 8 “NoSQL” of Stanford course CS145. link ● J. Leskovec, A. Rajaraman, and J. D. Ullman, Mining of Massive Datasets. 2014. ● I. Holubová, J. Kosek, K. Minařík, D. Novák. Big Data a NoSQL databáze. Praha: Grada Publishing, 2015. 288 p. 56