`

hive任务的mappe-reducer数量

    博客分类:
  • hive
 
阅读更多

 

 1 hive mapper数量:

 

hadoop mapper数量以及hive对此的优化:

hadoop2中,

5000个100M左右的文件,则会产生5000个map任务,建立5000个进程来执行销毁成本较高,

hive默认是使用CombileFileInputFormat,对小文件进行合并,来减少mapper数,

每个进程的开启和关闭耗时,涉及cpu io 带宽 jvm等。

hive-default.xml.template中默认设置如下:

  <property>
    <name>hive.input.format</name>
    <value>org.apache.hadoop.hive.ql.io.CombineHiveInputFormat</value>
    <description>The default input format. Set this to HiveInputFormat if you encounter problems with CombineHiveInputFormat.</description>
  </property>

 这样在hive执行mapper task时,会对大量小文件进行合并,让涉及到要操作的文件数据所存储的小文件先进行文件块合并,减少操作的split后在对合并后的文件进行mapper task操作(比如要对 10个50M的存储hdfs文件进行mapper操作,先处理成5个100M的在对这5个文件进行处理这样从10个mapper进程减少到5个)

 

 

疑问:  hive>descirbe extended stu;后看到表stu都是 textinputformat  textoutputformat,

         那么这个表的两个format和hive配置文件默认的CombineHiveInputFormat各自使用场景区别在哪?

         目前没理解好,找不到答案。

 

 

 

总结: hive mapper数量由两个因素决定 1 inputsplit   2 CombineHiveInputFormat

 

 

 

 2  hive reducer数量:

 

 

这是默认reducer task任务个数, hive-default.xml.template中设置为:

<property>
    <name>hive.exec.reducers.max</name>
    <value>1009</value>
    <description>
      max number of reducers will be used. If the one specified in the configuration parameter mapred.reduce.tasks is
      negative, Hive will use this one as the max number of reducers when automatically determine number of reducers.
    </description>
  </property>

 

hive中查看当前设置的reducer任务个数:

hive>set mapred.reduce.tasks
mapred.reduce.tasks=-1 

 数值为-1时,hive会自动推测决定reduce task数量,而最大数值在上面配置文件中配置好了为1009

如果reduce task个数超过这个数值时,就会排队等待,

 

设置hivereducer个数:

hive (default)> set mapred.reduce.tasks;  
mapred.reduce.tasks=3

 

设置后就意味着hive.exec.reducer.max=3

 

 

每个reduce任务处理的数据量也是由限定的,hive-default.xml.template中设置为:

  <property>
    <name>hive.exec.reducers.bytes.per.reducer</name>
    <value>256000000</value>
    <description>size per reducer.The default is 256Mb, i.e if the input size is 1G, it will use 4 reducers.</description>
  </property>

 默认是256M,如果给reducer输入的数据量是1G,那么按照默认规则就会分拆成4个reducer。

 

 

reducer 任务个数 :

   min(向上取整(reduce输入文件大小/reducer默认处理大小) , hive.exec.reducer.max)

 

eg:

1G的reduce输入数据

hive.exec.reducers.bytes.per.reducer=256M

mapred.reduce.tasks=-1 或者 hive.exec.reducer.max=1009

 

那么真实产生recuder个数为:

 min(向上取整(1G/256m), 1009) = 4;

 

1T的reduce数据则为    min(向上取整(1T/256m), 1009) = 1009;

 

 

 

 

 

 

 

 

 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics