分布式计算模型MapReduce
1.理解MapReduce设计思想 2.理解MapReduce分布式计算的基本原理 3.掌握使用Java进行MapReduce编程 4.掌握在Hadoop集群中提交MapReduce任务 |
1. MapReduce设计思想
1.1 什么是MapReduce 1)MapReduce是一个分布式计算框架 它将大型数据操作作业分解为可以跨服务器集群并行执行的单个任务。 起源于Google 2)适用于大规模数据处理场景 每个节点处理存储在该节点的数据 3)每个job包含Map(分类kv)和Reduce(计算)两部分 |
1.2 MapReduce的设计思想 1)分而治之:简化并行计算的编程模型 2)构建抽象模型:Map和Reduce 开发人员专注于实现Mapper和Reducer函数 3)隐藏系统层细节:开发人员专注于业务逻辑实现 |
1.3 MapReduce特点 1)优点:易于编程;可扩展性;高容错性;高吞吐量 2)不适用领域:难以实时计算;不适合流式计算;不适合DGA(有向图)计算 |
1.4 MapReduce编程规范 1)MapReduce框架处理的数据格式是<K,V>键值对形式 Mapper Map端接收<K,V>键值对数据,经过处理输出新的<K,V>键值对 Map端处理逻辑写在Mapper类中map()方法中 2)Reducer Reduce端搜集多个Mapper端输出的<K,V>数据,进行汇总 Reducer的业务逻辑写在reduce()方法中 每一组相同k的<k,Iterator<v>>组调用一次reduce()方法 |
2. 使用Java进行MapReduce编程
3.1 WordCount功能实现 (1)物料准备:wordcount (2)WordCountMapper (3)WordCountReduce (4)WordCountDriver 执行后输出: |
3. Hadoop集群中提交MapReduce任务
Idea打包工程成jar包,执行命令 |
4. MapReduce分布式计算的基本原理
4.1 Hadoop序列化 什么是序列化:序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化)和网络传输。 反序列化就是将收到字节序列(或其他数据传输协议)或者是磁盘的持久化数据,转换成内存中的对象。 (1)必须可序列化(serializable) 作用:网络传输以及持久化存储 IntWritable、LongWriteable、FloatWritable、Text、DoubleWritable, BooleanWritable、NullWritable等 (2)都继承了Writable接口 并实现write()和readFields()方法 (3)Keys必须实现WritableComparable接口 MapReduce框架会按照Key进行排序 Reduce阶段需要sort keys需要可比较 |
4.2 MapReduce框架原理 MapReduce执行流程: (1)split阶段:计算分片 (2)map阶段:调用map()方法对数据进行处理 (3)shffule阶段:主要负责将map端生成的数据传递给reduce端 (4)reduce阶段:对Shffule阶段传来的数据进行最后的整理合并 |
4.3 MapTask |
4.4 ReduceTask |
4.5 InputFormat数据输入接口 |
4.6 InputSplit(输入分片) |
4.7 Shuffle阶段 数据从Map输出到Reduce输入的过程 |
4.8 Combiner类 (1)Combiner相当于本地化的Reduce操作 在shuffle之前进行本地聚合 用于性能优化,可选项 输入和输出类型一致 (2)Reducer可以被用作Combiner的条件 符合交换律和结合律 (3)实现Combiner job.setCombinerClass(WCReducer.class) |
4.9 Partitioner类 (1)用于在Map端对key进行分区 默认使用的是HashPartitioner 获取key的哈希值 使用key的哈希值对Reduce任务数求模 决定每条记录应该送到哪个Reducer处理 (2)自定义Partitioner 继承抽象类Partitioner,重写getPartition方法 job.setPartitionerClass(MyPartitioner.class) |
5. MapReduce实现 SQL Join操作
4.1 map端join 1)使用场景 Map Join适用于一张表十分小、一张表很大的场景。 2)优点 思考:在Reduce端处理过多的表,非常容易产生数据倾斜。怎么办? 在Map端缓存多张表,提前处理业务逻辑,这样增加Map端业务,减少Reduce端数据的压力,尽可能的减少数据倾斜。 3)具体办法:采用DistributedCache (1)在Mapper的setup阶段,将文件读取到缓存集合中。 (2)在Driver驱动类中加载缓存。 //缓存普通文件到Task运行节点。 job.addCacheFile(new URI("file:///e:/cache/pd.txt")); //如果是集群运行,需要设置HDFS路径 job.addCacheFile(new URI("hdfs://hadoop102:8020/cache/pd.txt")); |
4.2 reduce端join Map端的主要工作:为来自不同表或文件的key/value对,打标签以区别不同来源的记录。然后用连接字段作为key,其余部分和新加的标志作为value,最后进行输出。 Reduce端的主要工作:在Reduce端以连接字段作为key的分组已经完成,我们只需要在每一个分组当中将那些来源于不同文件的记录(在Map阶段已经打标志)分开,最后进行合并就ok了。 |