赞
踩
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) 执行笛卡尔积
在执行一个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语句间是串行(一个一个来,排了一个对)执行:
hive提供一种严格模式, 主要目的, 是为了限制一些 效率极低的SQL 防止其执行时间过长, 影响其他的操作
屏蔽一下操作: 1) 执行order by 不加 limit 2) 出现笛卡尔积的现象SQL 3) 查询分区表, 不带分区字段 前提: 数据量足够大, 如果数据量比较少, 严格模式对此三项内容不生效
如何配置:
set hive.mapred.mode = strict; --开启严格模式 set hive.mapred.mode = nostrict; --开启非严格模式 最新默认 注意: 1- 从Hive3.x版本开始,该参数已经失效,内部就是严格模式 2- 前提: 表数据量足够大才会进行严格模式的检查。如果数据量比较少, 严格模式对此三项内容不生效
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。