Java私塾:Hadoop实战-中高级部分 之 Hadoop MapReduce高级编程

上传人:飞*** 文档编号:4879352 上传时间:2017-08-27 格式:DOC 页数:6 大小:62KB
返回 下载 相关 举报
Java私塾:Hadoop实战-中高级部分 之 Hadoop MapReduce高级编程_第1页
第1页 / 共6页
Java私塾:Hadoop实战-中高级部分 之 Hadoop MapReduce高级编程_第2页
第2页 / 共6页
Java私塾:Hadoop实战-中高级部分 之 Hadoop MapReduce高级编程_第3页
第3页 / 共6页
Java私塾:Hadoop实战-中高级部分 之 Hadoop MapReduce高级编程_第4页
第4页 / 共6页
Java私塾:Hadoop实战-中高级部分 之 Hadoop MapReduce高级编程_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《Java私塾:Hadoop实战-中高级部分 之 Hadoop MapReduce高级编程》由会员分享,可在线阅读,更多相关《Java私塾:Hadoop实战-中高级部分 之 Hadoop MapReduce高级编程(6页珍藏版)》请在金锄头文库上搜索。

1、创建时间:2013-12-9 09:15:00 内容来自:Java 私塾Hadoop 实战-中高级部分 之 Hadoop MapReduce 高级编程Hadoop RestFulHadoop HDFS 原理 1Hadoop HDFS 原理 2Hadoop 作业调优参数调整及原理Hadoop HAHadoop MapReduce 高级编程Hadoop IOHadoop MapReduce 工作原理Hadoop 管理Hadoop 集群安装Hadoop RPC第一部分:重要的组件Combiner什么是 Combinercombine 函数把一个 map 函数产生的对(多个 key, value)合并

2、成一个新的. 将新的作为输入到 reduce 函数中,其格式与 reduce 函数相同。这样可以有效的较少中间结果,减少网络传输负荷。什么情况下可以使用 Combiner可以对记录进行汇总统计的场景,如求和。求平均数的场景就不可以使用了Combiner 执行时机运行 combiner 函数的时机有可能会是 merge 完成之前,或者之后,这个时机可以由一个参数控制,即 bine(default 3)当 job 中设定了 combiner,并且 spill 数最少有 3 个的时候,那么 combiner 函数就会在 merge 产生结果文件之前运行通过这样的方式,就可以在 spill 非常多需要

3、 merge,并且很多数据需要做 conbine 的时候,减少写入到磁盘文件的数据数量,同样是为了减少对磁盘的读写频率,有可能达到优化作业的目的。Combiner 也有可能不执行, Combiner 会考虑当时集群的负载情况。Combiner 如何使用代码示例继承 Reducer 类public static class Combiner extends MapReduceBase implementsReducer public void reduce(Text key, Iterator values,OutputCollector output, Reporter reporter)th

4、rows IOException 配置作业时加入 conf.setCombinerClass(Combiner.class)创建时间:2013-12-9 09:15:00 内容来自:Java 私塾Partitioner什么是 PartitionerMapreduce 通过 Partitioner 对 Key 进行分区,进而把数据按我们自己的需求来分发。什么情况下使用 Partitioner如果你需要 key 按照自己意愿分发,那么你需要这样的组件。例如:数据文件内包含省份,而输出要求每个省份输出一个文件。框架默认的 HashPartitionerpublic class HashPartiti

5、oner extends Partitioner /* Use link Object#hashCode() to partition. */ public int getPartition(K key, V value, int numReduceTasks) return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; Partitioner 如何使用实现 Partitioner 接口覆盖 getPartition()方法配置作业时加入 conf.setPartitionerClass(MyPartitioner.class);

6、Partitioner 示例public static class MyPartitioner implements Partitioner Override public int getPartition(Text key, Text value, int numPartitions) Partitioner 需求示例需求描述数据文件中含有省份需要相同的省份送到相同的 Reduce 里从而产生不同的文件数据样例1 liaoning1 代表该省份有多少个直辖市步骤实现 Partitioner,覆盖 getPartition根据省份字段进行切分RecordReader什么是 RecordRead

7、er用于在分块中读取 对,也就是说每一次我们读取一条记录都会调用该类。主要是处理经过 InputFormat 分片完的数据 创建时间:2013-12-9 09:15:00 内容来自:Java 私塾什么时候使用 RecordReader需要对输入的数据按自己的需求处理如:要求输入的 key 不是文件的偏移量而是文件的路径或者名字系统默认为 LineRecordReader按照每行的偏移量做为 map 输出时的 key 值,每行的内容作为 map 的 value 值,默认的分隔符是回车和换行。RecordReader 需求示例需求更改 map 对应的输入的 值,key 对应的文件的路径(或者是文件

8、名),value 对应的是文件的内容(content)。步骤重写 InputFormat 不对文件切分重写 RecordReader在配置作业时使用自定义的组件进行数据处理第二部分:Join案例分析输入为 2 个文件,文件一内容如下空格分割:用户名 手机号 年龄内容样例Tom 1314567890 14文件二内容空格分割:手机号 地市内容样例13124567890 hubei需要统计出的汇总信息为 用户名 手机号 年龄 地市Map 端 Join设计思路使用 DistributedCache.addCacheFile()将地市的文件加入到所有 Map 的缓存里在 Map 函数里读取该文件,进行

9、Join 将结果输出到 reduce需要注意的是DistributedCache 需要在生成 Job 作业前使用Reduce 端 Join设计思路Map 端读取所有文件,并在输出的内容里加上标识代表数据时从哪个文件里来的在 reduce 对按照标识对数据进行保存然后根据 Key 的 Join 来求出结果直接输出第三部分:排序创建时间:2013-12-9 09:15:00 内容来自:Java 私塾普通排序Mapreduce 本身自带排序功能Text 对象是不适合排序的,如果内容为整型不会安照编码顺序去排序一般情况下我们可以考虑以 IntWritable 做为 Key,同时将 Reduce 设置成

10、 0 ,进行排序部分排序即输出的每个文件都是排过序的如果我们不需要全局排序,那么这是个不错的选择。全局排序产生背景Hadoop 平台没有提供全局数据排序,而在大规模数据处理中进行数据的全局排序是非常普遍的需求。使用 hadoop 进行大量的数据排序排序最直观的方法是把文件所有内容给 map 之后,map 不做任何处理,直接输出给一个 reduce,利用 hadoop 的自己的 shuffle 机制,对所有数据进行排序,而后由reduce 直接输出。快速排序基本步骤就是需要现在所有数据中选取一个作为支点。然后将大于这个支点的放在一边,小于这个支点的放在另一边。设想如果我们有 N 个支点(这里可以

11、称为标尺),就可以把所有的数据分成 N+1 个 part ,将这 N+1个 part 丢给 reduce,由 hadoop 自动排序,最后输出 N+1 个内部有序的文件,再把这 N+1 个文件首尾相连合并成一个文件,收工 。由此我们可以归纳出这样一个用 hadoop 对大量数据排序的步骤:1 ) 对待排序数据进行抽样;2 ) 对抽样数据进行排序,产生标尺;3 ) Map 对输入的每条数据计算其处于哪两个标尺之间;将数据发给对应区间 ID 的 reduce4 ) Reduce 将获得数据直接输出。Hadoop 提供了 Sampler 接口可以返回一组样本,该接口为 Hadoop 的采样器。pub

12、lic interface Sampler K getSample(InputFormat inf, Job job)throws IOException, InterruptedException;Hadoop 提供了一个 TotalOrderPartitioner,可以使我们来实现全局排序。二次排序产生背景MapReduce 默认会对 key 进行排序将输出到 Reduce 的 values 也进行预先的排序实现方式重写 Partitioner,完成 key 分区,进行第一次排序实现 WritableComparator,完成自己的排序逻辑,完成 key 的第 2 次排序原理Map 之前的

13、数据key1 1key2 2创建时间:2013-12-9 09:15:00 内容来自:Java 私塾key2 3key3 4key1 2Mapduce 只能排序 key,所以为了二次排序我们要重新定义自己的 key 简单说来就是 value ,组合完后12342原理接下来实现自定义的排序类,分组类,数据变成12234最后 reduce 处理后输出结果key1 1key1 2key2 2key2 3key3 4第四部分:计数器什么是计数器计数器主要用来收集系统信息和作业运行信息,用于知道作业成功、失败等情况,比日志更便利进行分析。内置计数器Hadoop 内置的计数器,记录作业执行情况和记录情况。

14、包括 MapReduce 框架、文件系统、作业计数三大类。计数器由关联任务维护,定期传递给 tasktracker,再由 tasktracker 传给 jobtracker。计数器可以被全局聚集。内置的作业计数器实际上由 jobtracker 维护,不必在整个网络中传递。当一个作业执行成功后,计数器的值才是完整可靠的。用户自定义 Java 计数器MapReduce 框架允许用户自定义计数器计数器是全局使用的计数器有组的概念,可以由一个 Java 枚举类型来定义如何配置创建时间:2013-12-9 09:15:00 内容来自:Java 私塾0.20.2 以下的版本使用 Reporter,0.20

15、.2 以上的版本使用 context.getCounter(groupName, counterName) 来获取计数器配置并设置。动态计数器所谓动态计数器即不采用 Java 枚举的方式来定义Reporter 中的获取动态计数器的方法public void incrCounter(String group,String counter,long amount)组名称,计数器名称,计数值一些原则创建计数器时,尽量让名称易读获取计数器Web UI命令行 hadoop job-counterJava APIJava API在作业运行完成后,计数器稳定后获取。 使用 job.getCounters()得到 Counters第五部分:合并小文件示例产生背景Hadoop 不适合处理小文件会占用大量的内存空间解决方案文件内容读取到 SequenceFile 内

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号