【原创】大叔经验分享(20)spark job之间会停顿几分钟

今天遇到一个问题,spark应用中在一个循环里执行sql,每一个sql都会向一张表写入数据,好比html

insert overwrite table test_table partition(dt) select * from test_table_another;web

除了执行sql没有其余逻辑,每一个sql都会对应1个job,在spark web ui上看到job和job之间会停顿几分钟,而且很是有规律,任何两个job之间都会停顿,是否是很神奇?sql

 

答案揭晓:数据库

spark在执行insert overwrite table partition的时候,分为两个部分,一个是执行select(读数据),一个是执行load partition(写数据),具体详见执行计划;ui

每一个sql对应1个job,这个job执行的select部分(读数据),不包含load partition部分(写数据),由于spark为了兼容hive,直接使用hive的元数据库,全部ddl操做都是经过反射直接调用hive的代码(spark2.1依赖的是hive1.2),这个过程并不包含在spark job中,因此看起来job执行完以后停顿了几分钟才执行下个job,这里停顿的几分钟实际上是在作load partition操做(写数据);spa

 

这里还有另一个问题,hive1.2在loadPartition删除文件时是串行操做,很是慢,这个问题在hive2时改成线程池解决,具体代码及问题解析详见:http://www.javashuo.com/article/p-nknezqoq-dz.html线程

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息