MapReduce的特征 1. 每个分片输入的文件可以比较大。默认64M Map1结果与Map2结果重叠现象?(传统的分布式计算无法解决) 方案:Map2与Map2原封不动的把数据传到Reduce; 问题:结果Map啥事没干,Reduce最终累死, 分而治之成为了空谈。 最终方案:使用partition把相同key的结果分配到同一个reduce上执行 输入文件把切分成多个块, 每个块的默认大小是64M, 每一个块就是一个maptask任务 map任务工作过程: Map从HDFS上获取数据块(Datanode上每个map任务都会有一个内存缓冲区(默认100M),用来存储它输出的结果「有它的原因:减少对磁盘的读写频率」) 如果map结果很大使缓冲区默认100M满了后将缓冲区中数据spill到磁盘上(spill过程), 默认是80%时就spill(可以设置), spill过程中map还产生结果; spill过程 对数据进行sort; spill出来的单独文件(又叫溢写文件);如果有大数据量的话,就生成多个溢写文件,又要将这些文件合并起来(merge过程「可以通过参数设置每次merge多少个文件」); 问题:如果merge只是只是合并过程,像WordCount例子,第一个溢写文件中key:name value:4, 第二个溢写文件key:name value:3 的话,merge后还会出现此key值的,所以如果之前设置了combiner,就会使用combiner将相同的key的value进行合并; 最终的这个输出文件也是存储在本地磁盘中。 reduce任务工作过程: reduce是将map的输出作为reduce的输入,只要有一个map任务执行完就会有reduce任务开始执行。实际运行过程中,map与reduce运行过程很可能不是在同一个datanode上,那它们是通过什么来联系的呢?reduce是通过http向JobTracker发请求看那些map执行完了,然后从map所在的TaskTracker远程获取map的输出文件,注意:并不是获取整个map的输出文件, 而是获取reduce能处理的了的数据; 在这个下载过程中,也会做归并排序,因为不同的map很有可能含有相同的key值; 对于reduce来说它的文件来源可能来自多个map,这个下载过程可以是并行的,不过这个并行数据可以设置的,默认是5,即使reduce 所需要的数据是从很多个map上的(若是大于设置的并行度),也只能一次并行的从设置的这么多个Map上下载所需数据;copy获取到的数据也是放到内存当中, 问题:处理10亿条数据,只求最大值, 这样的话在网上传输占了很大的带宽/专利计算中最终会把数据聚集到reduce端,加重reduce负担 Combiner:就是把了减少map与reduce间数据传输而设置的; 注意:combine的输入和reduce的完全一致,输出和map的完全一致;一个combiner只是处理一个结点的输出,不像reduce享受shuffle后的数据;“迷你reduce” 注意几点: 1.与map和reduce不同,combiner没有默认的实现 2.并不是所有的任务都适合使用combiner,比如 求最大值,求和可以, 求中值不行, 平均值也应该不行; 词频统计map输出(hello, 1), (hello, 1)经过combiner后(hello, 2)压缩后再送到reduce
Hadoop将输入数据切分成若干个输入分片(inputsplit), 并将每个split交给一个MapTask处理,MapTask不断地从对应的split中解析出一个个key/value, 并调用map()函数处理,处理完之后根据ReduceTask个数将结果分成若干个分片写到本地磁盘。同时每个ReduceTask从每个MapTask上读取属于自己的那个partition, 然后使用基于排序的方法将key相同的数据聚焦在一起,调用reduce()函数处理,并将结果输出到文件中。 以上缺少三个基本的组件:1.指定输入文件格式(InputFormat) 2.map()函数产生的每个key/value对 发给哪个ReduceTask函数处理(Partitioner) 3.指定输出文件格式(OutputFormat) 编程实例: 1.Top K问题 需要统计最近最热门的key个查询词 分解成两个MapReduce作业:分别完成统计词频 和 找出词频最高的前K个 第一个作业是典型的WordCount问题, hello 1 world 9 name 3 tom 5 john 23 对于第二个作业,首先map()函数中输出前key个频率最高的词,然后由reduce()函数汇总每个Map任务得到的前K个查询词,并输出频率最高的前K个查询词 map输入 9 world reduce收到所有9的单词,1.直接换了kv位置输出 2.通过TreeMap把前k放到集合中, public class MyInt implements Comparable<MyInt>{ private Integer value; public MyInt(Integer value){ this.value = value; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } @Override public int compareTo(MyInt o) { return value.compareTo(o.getValue()); } } // 用TreeMap存储可以利用它的排序功能 // 这里用 MyInt 因为TreeMap是对key排序,且不能唯一,而词频可能相同,要以词频为Key就必需对它封装 private static TreeMap<MyInt, String> tm = new TreeMap<MyInt, String>( new Comparator<MyInt>() { /** * 默认是从小到大的顺序排的,现在修改为从大到小 * * @param o1 * @param o2 * @return */ @Override public int compare(MyInt o1, MyInt o2) { return o2.compareTo(o1); } }); private static MultipleOutputs<Text, IntWritable> mos = null; protected void reduce(IntWritable key, Iterable<Text> values, Context context) throws IOException, InterruptedException { for (Text text : values) { context.write(text, key); tm.put(new MyInt(key.get()), text.toString()); // TreeMap以对内部数据进行了排序,最后一个必定是最小的 if (tm.size() > k) { tm.remove(tm.lastKey()); } } } protected void cleanup(Context context) throws IOException, InterruptedException { String path = context.getConfiguration().get("topKout"); mos = new MultipleOutputs<Text, IntWritable>(context); Set<Entry<MyInt, String>> set = tm.entrySet(); for (Entry<MyInt, String> entry : set) { mos.write("topKMOS", new Text(entry.getValue()), new IntWritable(entry.getKey().getValue()), path); } mos.close(); }
相关推荐
本文通过对 Hadoop 的深入分析和研究,根据交易记录查询系统的需求,设计并实现了 基于 Hadoop 的海量交易记录查询系统。首先对 Hadoop 及其相关技术做了研究,着重介绍了 Hadoop 云计算框架中的 HDFS 分布式文件...
记录hadoop作业,
NULL 博文链接:https://sealbird.iteye.com/blog/1340283
Hadoop 分析统计学生考试成绩1
小白搭建hadoop完全分布式环境笔记,步骤详细,原创
5.5 小结 5.6 更多资源 第6章 编程实践 6.1 开发MapReduce 程序 6.1.1 本地模式 6.1.2 伪分布模式 6.2 生产集群上的监视和调试 6.2.1 计数器 6.2.2 跳过坏记录 6.2.3 用IsolationRunner重新运行出错的任务...
1.4 添加hosts记录 此步骤所有节点都要操作 vi /etc/hosts 192.168.80.90 Master.Hadoop 192.168.80.91 Slave1.Hadoop 192.168.80.92 Slave2.Hadoop 1.5 建立hadoop用户之间相互信任(互相无密码登陆)...
本书从Hadoop的缘起开始,由浅入深,结合理论和实践,全方位地介绍Hadoop这一高性能处理海量数据集的理想工具。全书共16章,3个附录,涉及的主题包括:Haddoop简介;MapReduce简介;Hadoop分布式文件系统;Hadoop...
Hadoop学习时间轴 MapReduce 记录处理等
Hadoop 分布式集群搭建 Hadoop由Apache基金会开发的分布式系统基础架构,是利用集群对大量数据进行分布式处理和存储的软件框架。用户可以轻松地在Hadoop集群上开发和运行处理海量数据的应用程序。Hadoop有高可靠,...
包含hadoop平台Java开发的所有所需jar包,例如activation-1.1.jar apacheds-i18n-2.0.0-M15.jar apacheds-kerberos-codec-2.0.0-M15.jar api-asn1-api-1.0.0-M20.jar api-util-1.0.0-M20.jar asm-3.2.jar avro-1.7.7...
dfs.safemode.threshold.pct(缺省值0.999f)表示HDFS启动的时候,如果DataNode上报的block个数达到了 元数据记录的block个数的0.999倍才可以离开安全模式,否则一直是这种只读模式。如果设为1则HDFS永远是处于Safe...
例,任务跑完就自动释放掉服务器,本文记录下 Hadoop 集群的搭建过程,方便自己日后查看,也希望能帮到初学者,本文所有软 件都是通过 yum 安装,大家也可以下载相应的二进制文件进行安装,使用哪种方式安装,从属...
linux hadoop集群简单几步完成SSH配置。 不可思议。真的很简单。
第1章 初识Hadoop 数据!数据! 数据存储与分析 与其他系统相比 关系型数据库管理系统 网格计算 志愿计算 1.3.4 Hadoop 发展简史 Apache Hadoop和Hadoop生态圈 第2章 关于MapReduce 一个气象数据集 数据的格式 使用...
本教程是根据个人在UBUNTU虚拟机上安装配置Hadoop2.7.3的实际操作步骤一步步记录下来的,大部分指令操作的目的都加了注释以方便理解。(本教程很详细,如果还是遇到问题可以直接咨询楼主,不会让你的积分百花的)
该文档记录了在linux的shell环境下执行的hadoop的相关操作命令,包括多hafs文件的相关操作
网上也已经有很多教程了,但是其中都有不少坑,在此记录一下自己安装的过程。 目标:使用docker搭建一个一主两从三台机器的hadoop2.7.7版本的集群 准备: 首先要有一台内存8G以上的centos7机器,我用的是阿里云主机...
记录了Ubuntu下的Hadoop的配置与运行 ,经典例子
手动搭建hadoop集群(包括hadoop的Ha好可用),零基础教程