Hadoop的优化

这里我们以查询某一年、某一个月的最高温度

//随机生成温度代码

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、资源枪战:公平调度如果当前队列有新应用提交后,会把共享出去的资源抢夺回来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值