php 网站 上传到空间,程序制作软件,appcms程序怎么做网站,旅行社英文模板网站MapReduce剖析图 如上图所示是MR的运行详细过程
首先mapTask读文件是通过InputFormat#xff08;内部是调RecordReader()–#xff1e;read()#xff09;来一次读一行#xff0c;返回K,V值。#xff08;默认是TextInputFormat#xff0c;还可以输入其他的类型如:音视频内部是调RecordReader()–read()来一次读一行返回K,V值。默认是TextInputFormat还可以输入其他的类型如:音视频图片等。。mapper(map(k,v))–context.write()即mapTask阶段。输出数据到OutputCollector收集器不会输出一组就传到下一步进行处理而是需要一个收集的过程减少IO将收集到的数据写到环形缓冲区–通过Spiller来将溢出的数据溢出到文件中去在这里会通过hashPartitioner执行分区、通过key.comPareTo来实现排序分为系统默认的快排和外部排序即实现了shuffle的核心机制分区和排序。将多个溢出文件进行Merge采用归并排序合并成一个大文件。将文件下载到ReduceTask的本地磁盘工作目录–将多个MapTask的输出结果再进行归并排序也可以说是ReduceTask去各个mapTask对应的分区去取对应的数据。Reducer(reducek,v))–context.write(k,v)– OutputFormat(RecordWriter.write(k,v))即reduceTask阶段。将数据写到part-r-00000这里
如上图所示图中用红色粗线描述的组件都是可以重写的。 mapreduce在编程的时候基本上一个固化的模式没有太多可灵活改变的地方除了以下几处
1、输入数据接口InputFormat — FileInputFormat(文件类型数据读取的通用抽象类) DBInputFormat 数据库数据读取的通用抽象类
默认使用的实现类是 TextInputFormat。 job.setInputFormatClass(TextInputFormat.class) TextInputFormat的功能逻辑是一次读一行文本然后将该行的起始偏移量作为key行内容作为value返回
2、逻辑处理接口 Mapper 完全需要用户自己去实现其中 map() setup() clean()
3、map输出的结果在shuffle阶段会被partition以及sort此处有两个接口可自定义 Partitioner 有默认实现 HashPartitioner逻辑是 根据key和numReduces来返回一个分区号 key.hashCode()Integer.MAXVALUE % numReduces 通常情况下用默认的这个HashPartitioner就可以如果业务上有特别的需求可以自定义Comparable 当我们用自定义的对象作为key来输出时就必须要实现WritableComparable接口override其中的compareTo()方法
4、reduce端的数据分组比较接口 Groupingcomparator reduceTask拿到输入数据一个partition的所有数据后首先需要对数据进行分组其分组的默认原则是key相同然后对每一组kv数据调用一次reduce()方法并且将这一组kv中的第一个kv的key作为参数传给reduce的key将这一组数据的value的迭代器传给reduce()的values参数
5、逻辑处理接口Reducer 完全需要用户自己去实现其中 reduce() setup() clean()
6、输出数据接口 OutputFormat — 有一系列子类 FileOutputformat DBoutputFormat ….. 默认实现类是TextOutputFormat功能逻辑是 将每一个KV对向目标文本文件中输出为一行
整个过程需要注意以下几点
环形缓存区数据从outputCollector中传入环形缓存区直到达到80%的缓存时缓存才会启用清理机制将已经溢出的数据溢出到文件中去通过spiller来将数据溢出到文件中去会溢出多次每次溢出都会对数据进行分区排序形成多个分区排序后的数据最终进行合并。combiner的作用对spiller阶段的溢出数据进行一个reduce处理直接让相同k的value值相加减少数据量以及传输过程中的开销大大提高效率。根据业务需求使用并不是每个业务都要用。可自定义一个Combiner类内部逻辑和Reduce类似shuffle:洗牌、发牌——核心机制数据分区排序缓存 具体来说就是将maptask输出的处理结果数据分发给reducetask并在分发的过程中对数据按key进行了分区和排序数据倾斜指的是任务在shuffle阶段时会进行一个分区操作默认的是hashcode取模如果有大部分数据被分到一个ReduceTask端进行处理一小部分任务被分到其他的ReduceTask端进行处理就会造成其他ReduceTask处理完成后仍有一个ReduceTask还在处理数据。最终造成整个工程延迟的情况。为了解决这个问题引入了Partition
总结
MapReduce中最核心的知识点就是MR运行的整体流程除此之外要达到博主菜鸟级别的水平你还需要了解以下几个知识点 1、MapReduce是什么用来干什么的无论学什么首先都得知道这一点。 2、MapReduce框架的设计思想。 3、MapReduce框架中的程序实体角色以及对应的作用maptask reducetask mrappmaster。 1和2详见https://blog.csdn.net/qq_16633405/article/details/78404018 4、MapReduce程序中maptask任务切片规划的机制。 详见https://blog.csdn.net/qq_16633405/article/details/79729172 5、Yarn在MapReduce中作用。 详见https://blog.csdn.net/qq_16633405/article/details/79734021 6、掌握MapReduce的编程套路通过不断的写MR案例领悟编写MR程序的核心思想即如何确定对应K-V值。 后续会将对应的MR的一些特殊套路案例上传到Git上 目前想到的就这么点后续有遗漏的话会接着补充。