当前位置:   article > 正文

摸鱼大数据——Hive调优13-15

摸鱼大数据——Hive调优13-15

13、如何调整map和reduce的数量

1>是不是map数越多越好? 答案是否定的。如果一个任务有很多小文件(远远小于块大小128m),则每个小文件也会被当做一个块,用一个map任务来完成,而一个map任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费。而且,同时可执行的map数是受限的。

2>是不是保证每个map处理接近128m的文件块,就高枕无忧了? 答案也是不一定。比如有一个127m的文件,正常会用一个map去完成,但这个文件只有一个或者两个小字段,却有几千万的记录,如果map处理的逻辑比较复杂,用一个map任务去做,肯定也比较耗时。

3>是不是reduce数越多越好? 答案是否定的。如果reduce设置的过大,对整个作业会产生一定的影响。 ①过多的启动和初始化reduce也会消耗时间和资源; ②另外,有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;

4>在什么情况下, 只能有一个reduce呢?

以下几种, 不管如何设置, 最终翻译后reduce只能有一个 ​ 1) 执行order by操作 ​ 2) 执行不需要group by直接聚合的操作 ​ 3) 执行笛卡尔积

  • 如何调整mapTask数量:

    小文件场景:当input的文件都很小,把小文件进行合并归档,减少map数, 设置map数量:

    -- 每个Map最大输入大小(这个值决定了合并后文件的数量)
        set mapred.max.split.size=256000000;
    -- 一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)
        set mapred.min.split.size.per.node=1;
    -- 一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并)
        set mapred.min.split.size.per.rack=1;
    -- 执行Map前进行小文件合并默认CombineHiveInputFormat
        set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

    大文件场景:当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。

    举例:如果表a只有一个文件,大小为120M,但包含几千万的记录,如果用1个map去完成这个任务,肯定是比较耗时的, ​ 这种情况下,我们要考虑将这一个文件合理的拆分成多个,这样就可以用多个map任务去完成。 ​ set mapred.reduce.tasks=10; ​ create table a_1 as select * from tab_info distribute by rand(123); ​ 这样会将a表的记录,随机的分散到包含10个文件的a_1表中,再用a_1代替上面sql中的a表,则会用10个map任务去完成。

  • 如何reduce的数量:

    -- 查看reduces数量
    -- 该值默认为-1,由hive自己根据任务情况进行判断。
    set mapred.reduce.tasks;
    set mapreduce.job.reduces;
    -- (1)每个Reduce处理的数据量默认是256MB左右
    set hive.exec.reducers.bytes.per.reducer=256000000;
    -- (2)每个任务最大的reduce数,默认为1009;
    set hive.exec.reducers.max=1009;
    ​
    ​
    注意: 以下几种, 不管如何设置, 最终翻译后reduce只能有一个
    1) 执行order by操作 
    2) 执行不需要group by直接聚合的操作
    3) 执行笛卡尔积

14、并行执行

在执行一个SQL语句的时候, SQL会被翻译为MR, 一个SQL有可能被翻译成多个MR, 那么在多个MR之间, 有些MR之间可能不存在任何的关联, 此时可以设置让这些没有关联的MR 并行执行, 从而提升效率 , 默认是 一个一个来

如何配置:

set hive.exec.parallel=false;              -- 打开任务并行执行,默认关闭
set hive.exec.parallel.thread.number=8;  -- 同一个sql允许最大并行度,默认为8。
​
前提: 服务器必须有资源, 如果没有 即使支持并行, 也没有任何作用

案例:

下面这些SQL案例,都是会翻译成多个MapReduce
​
select  * from A ....
union all
select * from B ...;
​
例如:
select from (select * from A group by ...) tmp1 join (select * from B group by xxx) on ...

没有开启并行执行的时候,SQL语句间是串行(一个一个来,排了一个对)执行:

15、严格模式

hive提供一种严格模式, 主要目的, 是为了限制一些 效率极低的SQL 防止其执行时间过长, 影响其他的操作

屏蔽一下操作:
1) 执行order by 不加 limit
2) 出现笛卡尔积的现象SQL
3) 查询分区表, 不带分区字段
​
前提: 数据量足够大, 如果数据量比较少, 严格模式对此三项内容不生效

如何配置:

set hive.mapred.mode = strict;  --开启严格模式 
set hive.mapred.mode = nostrict; --开启非严格模式   最新默认
​
注意: 
    1- 从Hive3.x版本开始,该参数已经失效,内部就是严格模式
    2- 前提: 表数据量足够大才会进行严格模式的检查。如果数据量比较少, 严格模式对此三项内容不生效
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号