这里我们以查询某一年、某一个月的最高温度
//随机生成温度代码
package com.shujia.weather;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class RandomWeather {
public static void main(String[] args) throws ParseException {
//创建日期格式
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");long start = sdf.parse("2000-01-01 00:00:00").getTime();
long end = sdf.parse("2022-12-31 00:00:00").getTime();
long difference = end - start;for (int i = 0; i < 10000; i++) {
//随机生成时间2000-2023
Date date = new Date(start + (long) (Math.random() * difference));
//随机生成一个温度
int temperature = -20 + (int) (Math.random() * 60);
//打印生成的结果
System.out.println(sdf.format(date) + "\t" + temperature);
}}
}
优化1、Combiner
减少了reduce拉去数据的过程,提高了计算效率。
使用之前
使用之后
由上面我们可以得知,Combiner会将map任务得到的数据在Combiner里先计算,后将计算好的数据再由Reduce拉去过去,这样大大减少了Reduce的计算时间。(PS: Combiner操作只适合等幂操作)
优化2:join(数据倾斜)
MapReduce中的join
其实就是类似于关系行数据中的链接查询一样。需要计算的数据可能存储在不同的文件中或不同的表中,两个文件又有一些相同的字段可以关联,这时候我们就可以通过这些关联的字段进行计算了。
Reduce join
1、map函数主要是对不同文件中的数据打标签。
2、reduce函数获取key值相同的value list,进行笛卡尔积。
Map join
假如有两个表,一个表非常大,而另一个非常小,以至于小表可以直接存放在内存中。这样,我们可以将小表复制很多份,让每个map task任务中都保存一个hash map,将小表数据放入到这个hash map中,key是小表和大表的连接字段,value是小表的一个记录,然后只需要扫描大表,对于大表中的每一条记录key/value,在hash map中查找是否有相同的key的记录,如果有直接输出即可。
Semi join
它是reduce join的一种优化,就是在map端多虑掉不参加join操作的数据,则可以大大减少数据量,提高网络传输速度。
优化3、根据实际情况调整切片大小
为什么默认切片是128MB和block大小一致呢?
1、切片大小默认一致,是为了数据本地化,减少数据拉去网络消耗的IO。
2、并不是越大越好,也不是越小越好,需要根据集群的资源情况而定。
当集群资源充足的时候:将切片大小改小,增加map数量,提高读取效率。
当集群资源紧张的时候:将切片的大小调大,减少map任务的数量,让任务正常运转。
优化4、可以设置yarn资源和队列
yarn对异常task的处理
推测执行实在分布式环境下,因为某种原因造成同一个job的多个task运行速度不一致,有得task运行速度明显慢于其他task,则这些task拖慢了整个job的执行进度,为了避免这种情况发生,Hadoop会为该task启动备份任务,让该speculative task与原始task同时处理一份数据,那个先运行完,则将谁的结果作为最终结果。推测执行优化机制采用了典型的以空间换时间的优化策略v,他同时启动多个相同的task(备份任务)处理相同的数据块,那个完成的早,则采用那个task的结果,这样可防止拖后腿task任务的出现,进而提高作业计算速度,但是会占用更多的资源。
yarn调度器的策略
yarn默认是计算能力调度FifoScheduler:根据先进先出排队,最简单的调度器。FIFO
CapacityScheduler(计算能力调度)
FairScheduler(公平调度)
相同点:
1、都是队列
2、都有资源最大最小上线限制
3、都是资源共享,每个队列剩余的资源可以给其他队列使用
不同点:
1、队列排序算法不同:计算能力调度资源使用量小的优先。公平调度根据排序算法排序。
2、应该用选择算法不同:计算能力调度是先进先出。公平调度是先进先出或者公平排序算法排序。
3、资源枪战:公平调度如果当前队列有新应用提交后,会把共享出去的资源抢夺回来。