hive中如何控制mapper的数量

参考文档:https://www.cnblogs.com/1130136248wlxk/articles/5352154.html

1. 决定map的数据的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改);

2.是不是map数越多越好,如何减少?

  a. 不是越多越好,多了会造成资源的浪费;因为map任务的启动和初始化的时间,远远大于逻辑处理的时间;并且,map的数据是有限制的。

  b. 可以通过set设置,让map在执行前合并小文件,从而达到减少map数:

    比如:  set mapred.max.split.size=100000000; -- 决定每个map处理的最大的文件大小,单位为B
                        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;---实现map中的数据合并需要设置下面的参数,集群默认就是这个格式

3. 是不是每个map处理的接近128M的文件块,就OK了呢? 如果不OK,如何增加map的数量?

  a. 并不一定。当文件接近128M,但是里的内容却非常多的时候并且map处理的逻辑比较复杂。那么用一个map处理,则时间会比较长

  b. 把原来的单个文件拆分成多个的文件, 然后使用新的文件来执行sql。

      set mapred.reduce.tasks=10;
                   create table a_1 as 
                   select * from a 
                   distribute by rand(123);

4. 控制map整体原则1:大数据量要利用合适的map数;单个map要处理合适的数据量 。 2:map占用资源要合并小文件;map不足要把大文件拆成小文件。

5.reduce简单总结:

  a. 有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;

  b.什么情况下只有一个reduce:1. 没有group by就进行count(1)。2.使用了order by。3.存在笛卡儿积。因为这些都是全局操作,生成一个文件,就只有1个reduce。

  c. set mapred.reduce.tasks/set hive.exec.reducers.bytes.per.reducer=1073741824 -- 每个reduce处理的数据量,默认1GB

6. map数量一些深入的知识:

  a. default_num = total_size/block_size,默认情况下map的个数

  b.可以通过set mapred.map.tasks = goal_num 来设置期望的map个人,但是这个数量仅在大于default_num 的时候才会生效。

  c. 可以通过set mapred.min.split.size来设置每个task的文件大小,但是这个数量在大于block_size的时候才会生效。

    split_size = max(mapred.min.split.size,block_size); split_num = total_szie/split_size

  d.

原文地址:https://www.cnblogs.com/chengdu-jackwu/p/10170895.html