MapReduce
MapReduce的运行模式
MapReduce 的3种运行模式
(1)本地运行模式
1.1 src下不能有hadoop的配置文件
1.2如果处理的数据和输出的结果在hdfs上
需要指定active的namenode
为什么需要指定fs.defaultFs的值?
因为:再导入的jar包中hadoop-hdfs-2.2.5.jar中的hdfs-default.xml文件中有默认是从本地文件系统中寻找指定的文件
默认值:
如果程序中不指定fs.defaults,运行程序就会报错
1.3 在本地运行便于业务逻辑的debug
1.3.1 需要在window系统中解压一份在集群中安装的hadoop的jar包
1.3.2 同时配置window系统的环境变量
注意:必须写HADOOP_HOME不能直接在Path中配置
E:\soft\hadoop\hadoop-2.5.1\bin
1.3.3 拷贝winutils.exe到hadoop的bin目录下:
1.4修改hadoop NativeIo类中access方法的源码
暴力修改源码:
复制整个类,加入到本地代码中:
集群模式下都需要在src目录下导入集群的配置文件core-site.xml hdfs-site.xml yarn.site.xml mapred-site.xml
(2)集群运行模式一
将mapreduce提交到yarn集群的resourcemanger,分发给很多节点并发执行
2.1将MR程序 打成jar包,传到集群的任意一个节点上
2.2通过: hadoop jar jar路径 类的全限定名 启动
执行成功结果
(3)集群运行模式二
在本地调用,执行过程在集群上执行(真正的企业环境)
3.1指定本地jar包的路径
3.2 在本地执行运行
MapReduce 中的Combiner函数的理解
1.combiner是mapReduce程序中Mapper和Reducer之外的一种组件。
2.Combiner组件的父类是Reducer
3.Combiner和Reducer的区别在于运行的位置:
(1)Combiner是在每一个Maptask所在的节点上运行
(2)Reducer是接受全局所有的Maptask的输出结果
4.意义:
5.Combiner使用的前提是不能影响业务逻辑,同时Combiner的输出的KV,要符合Reducer的输入的KV类型的要求
为什么使用Combiner要慎重?
因为combiner在mapreducer的过程中可能调用也可能不调用,可能调用一次也可能是调用多次,无法确定。
6、具体的实现步骤:
(1)自定义一个combiner类继承Reducer,重写reduce方法
(2)在job中设置job.setCombinerClass(mycombiner.class);
7.Combiner加入后产生的效果:
MapReduce 底层原理详解
1、结构:
一个完整的MapReduce在分布式上运行时有三类进程:
(1) MRAppMaster:负责整个程序的过程调度和状态协调
(2) mapTask :负责map阶段的整个数据处理流程
(3) ReduceTask:负责reduce阶段的数据处理流程
2、流程详解图
(1)切片详解图
切片过程分析:
1.获取设置的文件的大小:通过fs.sizeOf(test.txt);
2.计算切片大小
computeSplitSize(Math.max(minSize,Math.max(maxSize,blocksize)))=blocksize;
3.形成切片规划文件(假设