快乐大数据第四课 Mapreduce的优化
1.Shuffle的过程
(1)每个Mag Task把输出结果写到内存中的环形缓冲区;当内存环形缓冲区写入的数据量达到一定
阈值时,后台线程会把数据溢出写到磁盘(根据分区号(数据的哈希值/reduce task的ID的余数),把数据写入不同的分区,对每个分区上的数据进行排序)。
(2)随着Map Task的不断进行,磁盘上的溢出文件会越来越多。在Shuffle过程中,Aplication Master会将这些溢出
文件合并,对于一个分区下的不同分片,使用归并排序,同一分区内数据进行有序排序。
(3)Reduce Task通过网络远程拷贝mapTask的结果中属于它的分区文件。合并所有已经拷贝过的数据文件,使用归并排序算法,将相同key的数据归为一组,不同key之间有序排列。最终生成一个key对应一组值的数据集,一个key对应的一组数据调用一次reduce方法
"-Djava.ext.dirs=D:\java1.8\jre\lib\ext", "D:\java1.8\jre1.8\bin\server\jvm.dll"
2.Combiner总结
(1)Combiner调用的地方
MapTask的环形缓冲区向磁盘溢写文件调用Combiner
map阶段在合并本地多个文件写入一个大文件之前调用Combiner
(2)使用Combiner的好处
减少Map Task输出数据量,由于临时结果写入本地磁盘,所以能减少磁盘I/O
减少Reduce-Map网络传输数据量,由于reduce需要远程通过
应用场景:针对结果可以叠加的场景 SUM(YES),Average(NO)
设置方法:(local reducer)
job.setCombinerClass(WordCountReducer.class)
3.YARN调度器
数据本地性 任务运行与需要处理的数据在同一个节点,则称为该任务具有“数据本地性”
数据本地性级别(性能由高到低排列)
同节点(node-local)
同机架(rack-local)
跨机架(off-switch)
4.推测执行
发现执行慢的任务,在其他机器上执行一个备份任务,同时运行,谁先运行
完,则采用谁的结果。但对于存在的大数据量的负载倾斜,或者向数据库写
数据。不适合推测执行
5.YARN-调度器
之前采用FIFO(先入先出)的法则。资源利用低,紧急的作业无法插队
随后采用多队列分开调度的方法:所有资源按照比例划分到不同的队列。每个队列实现单独的调度测了
优点是让更多的应用程序获得资源,使用灵活,资源利用率高。
调度器包括 CapacityScheduler调度器和FairScheduler调度器。
5(1)CapacityScheduler配置方法
capacity-scheduler.xml参数说明
capacity:队列占用的集群资源容量百分比,所有队列的容量之和少于100
maximum-capacity 由于存在资源共享,因此一个队列使用的资源可能超过其容量,最多使用
可通过该参数限制.配置完成后无需重启YARN,使用管理命令刷新调度设置
bin/yarn madmin -refreshQueues
5(2)FairScheduler调度器
以队列方式组织作业,基于最小资源量和公平共享量进行调度;支持资源抢占。内部队列中
可用的策略:FIFO fair(默认),基于内存使用量调度分配资源
任务延时调度:提高数据本地性和提高系统整体吞吐率。
实战
A演示公平调度器
在node02上,cd /usr/local/hadoop/etc/hadoop
编辑公平调度器后,重启
yarn-daemon.sh stop resourcemanager
yarn-daemon.sh start resourcemanager
新建 data_bi用户
echo data_bi |passwd --stdin data_bi
以用户data_bi完成wordcount的例子 阐释 公平调度器中不同用户完成作业的过程。
B广告曝光的例子
B1 计算曝光量
首先在第一台机器上切换到用户 hadoop
su hadoop
cd ~
mkdir jobs
在jobs目录下:
删除之前的 MapReducePro-1.0-SNAPSHOT.jar
rm -f MapReducePro-1.0-SNAPSHOT.jar
上传最新的
rz
mkdir mr_pvdata
cd mr_pvdata
rz
广告文件
格式 地域ID 用户ID 曝光还是点击 日期
在根目录下创建文件夹存数据
hadoop fs -mkdir -p /addata/pv_click_datas
上传数据
hadoop fs -put ad_data_2017122* /addata/pv_click_datas
hadoop fs -ls /addata/pv_click_datas
cd ~/jobs
hadoop jar MapReducePro-1.0-SNAPSHOT.jar bigdata.mr.MrPvSortByDayApp /addata/pv_click_datas /addata/pv_click_datas/out
hadoop fs -ls /addata/pv_click_datas/out
查看排序结果
hadoop fs -cat /addata/pv_click_datas/out/part-r-00000
B2把28号的数据单独建立一个文件夹,再把28号的数据传上去,然后计算曝光率
hadoop fs -mkdir /addata/dt=20171228
hadoop fs -put ~/jobs/mr_pvdata/ad_data_20171228.txt /addata/dt=20171228
hadoop fs -ls hadoop fs /addata/dt=20171228
在jobs目录下
hadoop jar MapReducePro-1.0-SNAPSHOT.jar bigdata.mr.MrPvClickByAreaDayApp /addata/dt=20171228 /addata/dt=20171228/out
hadoop fs -ls /addata/dt=20171228/out
查看曝光率的结果
hadoop fs -cat /addata/dt=20171228/out/part-r-00000
B3 统计同一年龄段不同性别人的最高打分
hadoop fs -mkdir /addata/user_core
cd ~/jobs/mr_pvdata
hadoop fs -put user_core.txt /addata/user_core
cd ..
在jobs目录下
hadoop jar MapReducePro-1.0-SNAPSHOT.jar bigdata.mr.MrUserAgeMaxCoreApp /addata/user_core /addata/user_core/out
查看结果
会有三个 ,每个年龄段一个
hadoop fs -ls /addata/user_core/out
hadoop fs -cat /addata/user_core/out/part-r-00002
hadoop fs -cat /addata/user_core/out/part-r-00001
hadoop fs -cat /addata/user_core/out/part-r-00000