问题表象:通过spark UI观察整个执行阶段开在saveAsTextFile阶段,很多task一直处于运行阶段,感觉很慢,程序是不是卡出了。
初步判断:saveAsTextFile既然是卡在了这,肯定是IO瓶颈吧?因为其他阶段特别快呀
分析:
首先根据以往经验,saveAsTextFile应该是一个非常快速的操作。
查看save的结果,只有1024M左右(为我的耐心点赞,为了看输出结果,我等了60分钟!等的花都谢了),可以断定把这个量级的数据导出来是不会消耗多少时间的
那问题来了,这到底是在哪里出了问题导致这么慢,通过UI感觉前面的计算阶段很快呀
很遗憾,那都是表现,不信你在saveAsTextFile面前加一个count的,然后你会发现在spark UI中不在卡在save阶段了,而是卡在了count
豁然开朗,本spark程序并不是一个IO密集型的程序,而是一个计算密集型的程序
怎么办?
翻开spark程序优化宝典,看了半天全是在围绕内存和序列化做文章!
然后再看看自己程序,使用了传说中宇宙最强的序列化类,而且内存已经快开到队列的极限,马上就要引起运维大哥的注意了
回到最初,也许spark除了内存计算最强外,spark还有个分布式的概念吧
对了,那就是增加并行度
增加分区数,增加到365试试,同时增加--num-executors的数量,别怕,先让它等于前面的分区个数试试,记得调低每个core的内存,不然队列就爆了