你好,游客 登录 注册 搜索
背景:
阅读新闻

Hive动态分区导致的Jobtracker Hang问题

[日期:2014-04-01] 来源:Linux社区  作者: [字体: ]

  熟悉Jobtracker的都知道,在进行Job初始化时EagerTaskInitializationListener会锁住 JobInProgress然后进行InitTask,细节请各位查看代码,这里有一步就是需要向hdfs写入初始数据并flush,而 Fairscheduler的Update Thread在更新资源池的资源时是在持有JobTracker和Fairscheduler的独占锁然后再去计算每个资源池的资源情况,而计算 running_map/running_reduce的时候要去获取相应的JobInProgress锁,各位读者可能不明白,我为啥要讲这块呢,问题就出现在这里.

Hive,Jobtracker Hang

 

  Hive在处理动态分区的时候,主要经历这么几个步骤tablescan->filesink->movetask

  在进行filesink的时候是根据记录来处理的,会起N(part)个record writer然后开始处理动态分区字段,即这里的dt,如果dt是连续的那么打开一个block开始写,否则关闭当前block,打开新dir的 block继续写,这里如果dt是不连续的出现并且记录数量巨大的情况下会产生大量的文件,导致hdfs的负载标高,和当时的hdfs的监控是匹配的:

  当时的集群负载:

Hive,Jobtracker Hang

 

  当时产生的文件数:

Hive,Jobtracker Hang

 

  进而导致JobInProgress被锁住,从而JobTracker被锁住,导致JobTracker Hang住了!

  那怎么解决呢?利用distributeby dt把相同的dt排列到一起再进行filesink就不会造成大量的小文件产生了。





收藏 推荐 打印 | 录入:Cstor | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款