`
dacoolbaby
  • 浏览: 1265752 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hive常用Job配置 & Map,Reduce数量控制

    博客分类:
  • Hive
阅读更多

开启动态分区:
hive.exec.dynamic.partition=true
默认值:false
描述:是否允许动态分区
hive.exec.dynamic.partition.mode=nonstrict
默认值:strict
描述:strict是避免全分区字段是动态的,必须有至少一个分区字段是指定有值的。
读取表的时候可以不指定分区。

设置如下参数配置动态分区的使用环境:
hive.exec.max.dynamic.partitions.pernode=100
默认值:100
描述:each mapper or reducer可以创建的最大动态分区数
hive.exec.max.dynamic.partitions=1000
默认值:1000
描述:一个DML操作可以创建的最大动态分区数
hive.exec.max.created.files=100000
默认值:100000
描述:一个DML操作可以创建的文件数

设置如下参数取消一些限制(HIVE 0.7后没有此限制):
hive.merge.mapfiles=false
默认值:true
描述:是否合并Map的输出文件,也就是把小文件合并成一个map
hive.merge.mapredfiles=false
默认值:false
描述:是否合并Reduce的输出文件,也就是在Map输出阶段做一次reduce操作,再输出

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

这个参数表示执行前进行小文件合并,
前面三个参数确定合并文件块的大小,大于文件块大小128m的,
按照128m来分隔,小于128m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的),
进行合并,最终生成了74个块。

自0.7版本后Hive开始支持任务执行选择本地模式(local mode),如此一来,对数据量比较小的操作,就可以在本地执行,这样要比提交任务到集群执行效率要快很多。
配置如下参数,可以开启Hive的本地模式:
hive> set hive.exec.mode.local.auto=true;(默认为false)

set mapred.reduce.tasks;
设置当前Session的map,reduce 的个数,默认值是-1,为系统自动匹配。
匹配原则是按照block的个数来启动map。

但并非map的数量越多越好,当有大量的小文件的时候,反而适合一个map负责读取多个文件对象。
因为每启动一个map都是一个开销。

一、控制hive任务中的map数:

1.通常情况下,作业会通过input的目录产生一个或者多个map任务。
主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改);

2.举例:
a)假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和1个12m的块),从而产生7个map数
b)假设input目录下有3个文件a,b,c,大小分别为10m,20m,130m,那么hadoop会分隔成4个块(10m,20m,128m,2m),从而产生4个map数
即,如果文件大于块大小(128m),那么会拆分,如果小于块大小,则把该文件当成一个块。

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

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

针对上面的问题3和4,我们需要采取两种方式来解决:即减少map数和增加map数;

如何合并小文件,减少map数?
 假设一个SQL任务:
 Select count(1) from popt_tbaccountcopy_mes where pt = ‘2012-07-04’;
 该任务的inputdir  /group/p_sdo_data/p_sdo_data_etl/pt/popt_tbaccountcopy_mes/pt=2012-07-04
 共有194个文件,其中很多是远远小于128m的小文件,总大小9G,正常执行会用194个map任务。
 Map总共消耗的计算资源: SLOTS_MILLIS_MAPS= 623,020

 我通过以下方法来在map执行前合并小文件,减少map数:
 set mapred.max.split.size=100000000;
 set mapred.min.split.size.per.node=100000000;
 set mapred.min.split.size.per.rack=100000000;
 set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
 再执行上面的语句,用了74个map任务,map消耗的计算资源:SLOTS_MILLIS_MAPS= 333,500
 对于这个简单SQL任务,执行时间上可能差不多,但节省了一半的计算资源。
 大概解释一下,100000000表示100M,
 set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
 这个参数表示执行前进行小文件合并,
 
 前面三个参数确定合并文件块的大小,大于文件块大小128m的,按照128m来分隔,
 小于128m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的),
 进行合并,最终生成了74个块。
        
如何适当的增加map数?

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

 假设有这样一个任务:
 Select data_desc,
  count(1),
  count(distinct id),
  sum(case when …),
  sum(case when ...),
  sum(…)
from a group by data_desc

如果表a只有一个文件,大小为120M,但包含几千万的记录,
如果用1个map去完成这个任务,肯定是比较耗时的,
这种情况下,我们要考虑将这一个文件合理的拆分成多个,
这样就可以用多个map任务去完成。

   set mapred.reduce.tasks=10;
   create table a_1 as
   select * from a
   distribute by rand(123);
                  
这样会将a表的记录,随机的分散到包含10个文件的a_1表中,再用a_1代替上面sql中的a表,则会用10个map任务去完成。
每个map任务处理大于12M(几百万记录)的数据,效率肯定会好很多。
   
看上去,貌似这两种有些矛盾,一个是要合并小文件,一个是要把大文件拆成小文件,这点正是重点需要关注的地方,
根据实际情况,控制map数量需要遵循两个原则:使大数据量利用合适的map数;使单个map任务处理合适的数据量;

二、控制hive任务的reduce数:

1.Hive自己如何确定reduce数:
reduce个数的设定极大影响任务执行效率,不指定reduce个数的情况下,Hive会猜测确定一个reduce个数,基于以下两个设定:
hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G)
hive.exec.reducers.max(每个任务最大的reduce数,默认为999)
计算reducer数的公式很简单N=min(参数2,总输入数据量/参数1)
即,如果reduce的输入(map的输出)总大小不超过1G,那么只会有一个reduce任务;
如:
select pt,count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04' group by pt;
 /group/p_sdo_data/p_sdo_data_etl/pt/popt_tbaccountcopy_mes/pt=2012-07-04 总大小为9G多,
 因此这句有10个reduce

2.调整reduce个数方法一:
调整hive.exec.reducers.bytes.per.reducer参数的值;
set hive.exec.reducers.bytes.per.reducer=500000000; (500M)
select pt,count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04' group by pt; 这次有20个reduce
        
3.调整reduce个数方法二;
set mapred.reduce.tasks = 15;
select pt,count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04' group by pt;这次有15个reduce

4.reduce个数并不是越多越好;
同map一样,启动和初始化reduce也会消耗时间和资源;
另外,有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,
那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;

5.什么情况下只有一个reduce;
很多时候你会发现任务中不管数据量多大,不管你有没有设置调整reduce个数的参数,任务中一直都只有一个reduce任务;
其实只有一个reduce任务的情况,除了数据量小于hive.exec.reducers.bytes.per.reducer参数值的情况外,还有以下原因:
a)没有group by的汇总,比如把select pt,count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04' group by pt;
写成 select count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04';
这点非常常见,希望大家尽量改写。
b)用了Order by
c)有笛卡尔积
通常这些情况下,除了找办法来变通和避免,我暂时没有什么好的办法,
因为这些操作都是全局的,所以hadoop不得不用一个reduce去完成;

同样的,在设置reduce个数的时候也需要考虑这两个原则:
使大数据量利用合适的reduce数;使单个reduce任务处理合适的数据量。

hive.exec.parallel参数控制在同一个sql中的不同的job是否可以同时运行,默认为false.

下面是对于该参数的测试过程:
测试sql:
select r1.a
from (
   select t.a from sunwg_10 t join sunwg_10000000 s on t.a=s.b) r1
   join
   (select s.b from sunwg_100000 t join sunwg_10 s on t.a=s.b) r2
   on (r1.a=r2.b);

当参数为false的时候,三个job是顺序的执行
set hive.exec.parallel=false;

但是可以看出来其实两个子查询中的sql并无关系,可以并行的跑
set hive.exec.parallel=true;

总结:
在资源充足的时候hive.exec.parallel会让那些存在并发job的sql运行得更快,
但同时消耗更多的资源可以评估下hive.exec.parallel对我们的刷新任务是否有帮助.

 

 

 


 

分享到:
评论

相关推荐

    Hive大数据倾斜总结

    Hive查询生成多个map reduce job,一个map reduce job又有map,reduce,spill,shuffle,sort等多个阶段,所以针对hive查询的优化可以大致分为针对MR中单个步骤的优化,针对MR全局的优化以及针对整个查询的优化。...

    hive参数配置说明大全

    如果设置为true,则Hive将开启map/reduce job的并发提交,默认值为false。 15. hive.security.authorization.enabled 该参数决定了Hive是否开启权限认证。如果设置为true,则Hive将开启权限认证,默认值为false。 ...

    深入浅出数据仓库中SQL性能优化之Hive篇

    Hive查询生成多个map reduce job,一个map reduce job又有map,reduce,spill,shuffle, sort等多个阶段,所以针对hive查询的优化可以大致分为针对MR中单个步骤的优化,针对MR全局的优化以 及针对整个查询的优化。

    hive参数优化总结

    控制 Map 数和 Reduce 数是 Hive 中一个非常重要的优化手段,影响着数据处理的速度和效率。可以通过设置相关参数来控制 Map 数和 Reduce 数,例如:set mapred.max.split.size=256000000 等。 3. 解决数据倾斜 ...

    hive性能优化

    通常,Hive会根据输入数据量动态计算Reduce任务数量,公式为`num_reduce_tasks = min(${hive.exec.reducers.max},${input.size} / ${hive.exec.reducers.bytes.per.reducer})`,其中`hive.exec.reducers.bytes.per....

    hive配置说明

    - **含义**:控制是否开启map/reduce job的并发提交,开启后可以加速执行过程。 - **默认值**:`false` - **建议设置**:对于复杂的查询或大数据量,开启并发可以显著提高效率。 14. **hive.security....

    hive参数优化文档

    - **Reduce数量调整**:合理设置`mapreduce.job.reduces`参数,减少Reduce任务的数量,从而降低Reduce端的压力。 - **Shuffle优化**:优化Shuffle过程中的排序与合并操作,提高数据传输效率。 3. **Shuffle阶段...

    Hive优化方法整理

    Hive 优化方法整理是 Hive 数据处理过程中的重要步骤,涉及到 Hive 的类 SQL 语句本身进行调优、参数调优、Hadoop 的 HDFS 参数调优和 Map/Reduce 调优等多个方面。 Hive 类 SQL 语句优化 1. 尽量尽早地过滤数据...

    Hive性能优化总结

    例如,可以通过调整`hive.exec.reducers.bytes.per.reducer`参数来控制reduce任务的数量。该参数定义了每个reduce任务可以处理的最大字节数。 ##### 代码层面优化 - **避免使用`COUNT(DISTINCT)`**:在可能的情况...

    hive监控巡检优化文档

    - **减少job数**:设置`hive.merge.mapfiles`和`hive.merge.mapredfiles`为`true`,可以合并小文件,减少map/reduce job的数量。 - **CDH-hive优化参数**:参考Cloudera提供的调优文档,针对不同场景调整参数配置...

    Hive_优化——深入浅出学Hive

    3. **控制 Map 数**:合理设置 Map 数量,避免过多小文件导致的任务开销。 4. **JOIN**:优化 JOIN 操作,例如使用 MapJoin,避免大表全扫描。 5. **GROUP BY**:优化 GROUP BY 操作,可以结合分区和 Bucketing ...

    Hive原理与实现

    - **优化Join操作**:对于常见的Join操作,如Common Join、Map Join等,可以通过优化选择合适的Join类型来减少map和reduce任务的数量。 ##### 2. 如何编写HQL以减少M/R任务 - **使用Map Join**:当连接表较小且...

    hive工作调优小结

    - 启用JVM重用:设置**mapreduce.job.jvm.numtasks**,该参数指定单个JVM实例可以运行的Map或Reduce任务的数量。 - 根据作业的具体情况调整JVM重用策略。 综上所述,通过对Hive作业的各个阶段进行细致的调优,可以...

    hive调优总结文档-hive tuning ppt

    - **Hive配置**:设置合适的`mapreduce.job.maps`和`mapreduce.job.reduces`以平衡计算资源和任务数量。 - **公平调度器**:根据不同的工作负载设置优先级,保证重要任务的执行。 6. **缓存与重用**: - **Hive ...

    Hive优化.docx

    - **多Join合并**:如果多个Join操作的连接键相同,Hive会尝试合并这些Join为一个MapReduce任务,从而减少Job的数量,提高效率。 2. **理解Hadoop核心能力**: - **数据倾斜问题**:Hadoop处理大量数据时,数据...

    hive on spark mr 数据开发常见问题解决

    另外,可以考虑增加reduce任务数量(`mapreduce.job.reduces`),使得数据分布更均匀,减少单个reduce任务的负载。 在日常开发中,建立一个汇总常见问题的知识库是提高效率的关键。遇到问题时,能够快速查找和应用...

    《企业级Hive实战课程》大纲

    - 几种Join方式(ReduceJoin、MapJoin、SMBJoin)的工作原理与适用场景; - PredicatePushdown(PPD)的作用与实现; - 数据倾斜现象的诊断与解决策略; - 分区使用的优化方法。 2. **实战案例** - 通过具体的...

    第02节:hadoop精讲之map reduce原理及代码.rar

    Driver类会初始化Job对象,设置输入输出路径,配置Mapper和Reducer类,以及其他的参数设置。最后,通过Job的submit()方法提交作业到Hadoop集群。 在Hadoop生态系统中,MapReduce可以与其他组件如HDFS(Hadoop ...

    hive数据加载导出查询

    2016-03-09 23:45:52,385 Stage-1 map=100%, reduce=0%, Cumulative CPU 2.39 sec MapReduce Total cumulative CPU time: 2 seconds 390 msec Ended Job = job_1457532219378_0001 Stage-4 is selected by condition...

    HiveSQL优化手册

    可根据Map端输出的数据量及业务需求手动调整Reduce Task的数量。 #### 表优化 **表优化**旨在提高查询效率和减少不必要的计算资源消耗,主要包括以下几个方面: 1. **避免笛卡尔积** - **避免省略连接条件**:...

Global site tag (gtag.js) - Google Analytics