发布时间: 2016-09-10 | 浏览次数: 252 | 下载次数: 0 | 作者: tianyuyan | 文档编号: EKB1000250692
FusionInsight版本:V100R002C30SPC602
SparkJDBCServer业务间歇性中断。
首先业务间歇性中断,是客户业务的逻辑实现导致,客户的业务是周期性跑,比如1分钟跑一次,但是如果这一次业务在30秒里没有结束,就认为失败。即本次业务中断了。
所以客户真正的问题是为什么任务有时候执行时间会超过预期。
分析SparkJDBCServer运行日志发现客户反馈的任务运行时间超过预期的时候,同时有一个很大的任务在运行。
以19号09:21-24分为例
2015-12-19 09:21:43,953 | INFO |
[sparkDriver-akka.actor.default-dispatcher-23] | Parents of final stage:
List(Stage 76047, Stage 76048) | org.apache.spark.Logging$class.logInfo(Logging.scala:59)
2015-12-19 09:21:43,958 | INFO |
[sparkDriver-akka.actor.default-dispatcher-23] | Missing parents: List(Stage
76047, Stage 76048) | org.apache.spark.Logging$class.logInfo(Logging.scala:59)
2015-12-19 09:21:45,181 | INFO |
[sparkDriver-akka.actor.default-dispatcher-23] | Submitting Stage 76048
(MapPartitionsRDD[686047] at mapPartitions at Exchange.scala:64), which has no
missing parents | org.apache.spark.Logging$class.logInfo(Logging.scala:59)
2015-12-19 09:21:45,288 | INFO |
[sparkDriver-akka.actor.default-dispatcher-23] | Submitting 17439 missing tasks
from Stage 76048 (MapPartitionsRDD[686047] at mapPartitions at
Exchange.scala:64) | org.apache.spark.Logging$class.logInfo(Logging.scala:59)
这个很大的任务一共17439个task,这个任务运行了几分钟,所以同期的其他任务都慢了。
经过和客户研发沟通,该任务存在问题,其实这个任务处理的数据量不大,但是由于客户实现的逻辑导致这个任务出现了上万的task。客户的业务定期会向一张表里insert数据,每次insert的数据量很小,但是文件数很多,最终每天就能产生17000+个文件,导致后面对这张表进行计算时会产生17000+task(task数和文件或文件块个数对应),这种业务逻辑是不合理的。
不要让数据表里产生很多小文件
和客户交流后,决定使用HDFS的append进行数据追加的方式,而不是直接使用insert表的方式,修改后此任务最终只有200个左右的task。