熟悉Jobtracker的都知道EagerTaskInitializationListener在Job初始化的时候会锁住JobInProgress然后执行InitTask。详情请查看代码。这里第一步是将初始数据写入hdfs和flush,Fairscheduler的UpdateThread在更新资源池的资源时持有JobTracker和Fairscheduler的独占锁,然后计算各个资源池的资源情况,获取计算running_map/running_reduce时相应的JobInProgress锁。读者可能不明白我为什么要讲这个,问题就出现在这里。Hive在处理动态分区时,主要经过这几个步骤。tablescan->filesink->movetask在执行filesink时是根据records进行处理的,会设置N(part)个recordwriters,然后开始处理动态分区字段,也就是这里的dt。如果dt是连续的,则开一个block开始写入,否则关闭当前block,开一个新的dirblock继续写入。这里如果dt不连续出现,记录数巨大,会产生大量文件,导致hdfs的负载水平与当时hdfs的监控相匹配:当时的集群负载:数量offilesgeneratedatthetime:然后导致JobInProgress被锁定,所以JobTracker被锁定,导致JobTrackerHang!如何解决?使用distributebydt将同一个dt排列在一起再执行filesink不会导致产生大量的小文件。原文链接:http://boylook.blog.51cto.com/7934327/1380981
