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

运维 数据库运维 数据库
昨天下午有20多分钟Hadoop平台无法跑Hive,Jobtracker的页面也打不开,hadoop job –list也hang住没有响应,过了10分钟后恢复了,查看gc日志发现Jobtracker没有进行full gc,查看这段时间的Job日志发现一个可疑的Hive SQL: Insert into table t(dt) as select xxx,dt from txx,是一个用了动态分区的查询.这个查询和Jobtracker Hang住有什么关系呢?

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

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

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

当时的集群负载:

wKiom1Mr3syTM-zOAAMWZ6-2LOo698.jpg

当时产生的文件数:

wKioL1Mr3rOSDZwoAANEo5qPywU667.jpg

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

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

原文链接:http://boylook.blog.51cto.com/7934327/1380981

责任编辑:彭凡 来源: 51CTO博客
相关推荐

2012-08-16 10:43:10

GC

2021-02-20 08:21:18

Hive动态分区

2010-08-25 10:24:40

2017-04-19 12:09:56

数组动态扩容GC

2023-03-30 09:06:20

HiveSpark大数据

2021-07-14 23:38:02

PostgreSQLOracle模式

2016-12-19 19:04:30

Hive问题集

2010-04-29 11:01:14

Unix分区

2010-06-09 13:03:00

Opensuse分区

2022-12-13 10:05:13

MySQL数据库

2016-11-07 09:20:24

2017-07-05 14:14:33

MySQL表服务变慢

2021-01-08 05:22:47

Spark动态优化

2015-07-20 17:05:38

SQL ServerNULL值

2017-07-19 09:53:42

Oracle分区问题

2011-07-06 15:47:29

SQL Server分区

2023-01-30 08:09:18

权限GreatSQL运行

2022-07-03 20:31:59

JVMJava虚拟机

2022-05-11 08:22:54

IO负载NFSOS

2010-06-08 17:12:55

OpenSUSE 硬盘
点赞
收藏

51CTO技术栈公众号