16-1-5:MapReduce

???1、加载程序运行时所需要的外部类:

命令:

bin/hadoop jar xxxx.jar /file1 /out –D mapred.input.dir=/test/input1

可以直接指定mapred.input.dir的值

2、文件读取顺序:

应用场景:当处理多个文件中的数据,且数据之间有先后关系

例如:

有两个文件:一个是城市跟手机号的对应数据。一个是手机号跟对应的流量,统计结果是每个城市一天的总流量。

类似上面的需求,就需要在map程序开始之前,先将城市与手机号之间的映射数据先读取进去,然后在用map程序处理手机号与产生的流量之间的对应关系。

所以就可以使用setup()方法,setup在map之前执行。

继承Mapper类,重写它的setup()方法,将需要在map之前处理的逻辑写在setup()中就可以了。

Mapper类中还有一个cleanup()方法,cleanup()里面的程序在map之后处理。

3、Yarn平台的运行过程

程序写完之后将它打成jar包,在linux上使用hadoop jar xxx.jar /file /out 运行程序。这个时候,jar会被框架上传到hdfs上,然后程序向ResourceManager(RM)申请资源,RM在NodeManager(NM)上为程序分配一个容器,称为MapReduceApplicationMaster(Master)。Master从HDFS上加载jar,计算需要的资源,向RM申请更多的资源(根据map和reduce向RM申请容器,容器中的内容叫资源),RM在NM上给Master分配资源。Master决定一个容器中运行的是map task还是reduce task。在task运行的过程中,不断的与Master打交道,汇报自身的运行情况。当一个task中的程序运行完成后,Master告诉RM不需要该容器了,RM通知NM回收该容器。

4、combiner合并

每一个map都可能会产生大量的输出数据,combiner的作用就是在map端对输出的数据先做一次合并。这样做的好处:

1):减少网络传输到reducer的数据量,提高效率。

2):减少reduce处理的数据量。(之前所有的结果都是在reduce完成,效率会相对低下)

combiner最基本是实现本地key的归并,combiner具有本地reduce的功能。

注意:combiner的不是适合所有的情况。

例如:

aa

有文件a.txt和b.txt两个文件求平均数:

如果使用combiner,先求出a.txt的平均值为1,在求出b.txt的平均数为2,然后reduce在处理两个map的结果,求得平均数为1.5。

而正确的结果应该是10/7。所以这种情况就不适合用combiner。

5、自定义计数器

hadoop计数器:可以让开发人员以全局的视角来审查程序的运行情况以及各项指标,即使做出错误诊断并进行相应处理。

自定义计数器的功能(用途)?

可以使我们自己的操作打印在MapReduce执行页面的控制台上。

例如:

文件中有两行

hello you

hello me

我们可以将hello出现的总次数打印在MapReduce执行时的控制台上。

自定义计数器的实现:

6、查看System.out.println();输出到哪了?

7、分区

8、shuffle

image

9、天龙八部

10、MapReduce的job调优

11、MapReduce常见算法

原文地址:https://www.cnblogs.com/tzq9308/p/5114242.html