球友提问汪哥
问题1:
set hive.exec.max.dynamic.partitions=1000; – 所有节点的总(默认)限制为1000个动态分区
set hive.exec.max.dynamic.partitions.pernode=100; – 默认值为每个节点100个动态分区
我看某个博客上:
set hive.exec.max.dynamic.partitions.pernode=100
#表示每个maper或reducer可以允许创建的最大动态分区个数
这种说法对吗?如果正确,是不是:意味着每个节点上只能有1个maper或reducer
问题2、输入的数据量比较大,比如1T数据,此时启动2000个Mapper任务去读取,这些Mapper任务的并行度是多少呢,如何确定的?开启动态分区后,这个任务的小文件数是如何确定的呢?
博客上说是每个任务下有100个分区,将产生2000*100=200000个小文件,这个说法对吗?
问题3:如图,dynamic.partitions / dynamic.partitions.pernode <=mapred.reduce.tasks如何理解?
回答
第一个问题是最大上限,第二个问题你需要理解一下mapper数量的生成规则,他是根据文件与你设置的参数和集群hdfs对应的block大小,取一个max计算出来的。
而且也不是说你设置了这些参数,有些map数量也不一定就是完全就会处理对应的数据,可以追踪一下源码,分析一下hive4.0之后应该是做了很多优化了。
还有个问题,小文件大多是shuffle过程中出现的,也就是说,你设置的动态分区上限,往往需要考虑对应reduce数量,才可能会得到理想的效果。
你可以看下,如果你1t的数据,只谈论mapper,可能设置20000个map数量中,不一定所有的map会真正的处理数据的,甚至你设置的这个结果都不一定会生效,这是hive的情况,不过现在企业基本都切sparksql了,可能跟hive还不太一样了。