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的不是适合所有的情况。
例如:
有文件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
9、天龙八部
10、MapReduce的job调优
11、MapReduce常见算法