Apache Spark 2.0 在作业完成时却花费很长时间结束
作者:胖头鱼 发布时间:2023-08-31 18:54:39
现象
大家在使用 Apache Spark 2.x 的时候可能会遇到这种现象:虽然我们的 Spark Jobs 已经全部完成了,但是我们的程序却还在执行。比如我们使用 Spark SQL 去执行一些 SQL,这个 SQL 在最后生成了大量的文件。然后我们可以看到,这个 SQL 所有的 Spark Jobs 其实已经运行完成了,但是这个查询语句还在运行。通过日志,我们可以看到 driver 节点正在一个一个地将 tasks 生成的文件移动到最终表的目录下面,当我们作业生成的文件很多的情况下,就很容易产生这种现象。本文将给大家介绍一种方法来解决这个问题。
为什么会造成这个现象
Spark 2.x 用到了 Hadoop 2.x,其将生成的文件保存到 HDFS 的时候,最后会调用了 saveAsHadoopFile,而这个函数在里面用到了 FileOutputCommitter,如下:
问题就出在了 Hadoop 2.x 的 FileOutputCommitter 实现FileOutputCommitter 里面有两个值得注意的方法:commitTask 和 commitJob。在 Hadoop 2.x 的FileOutputCommitter 实现里面,mapreduce.fileoutputcommitter.algorithm.version 参数控制着 commitTask 和 commitJob 的工作方式。具体代码如下(为了说明方便,我去掉了无关紧要的语句,完整代码可以参见 FileOutputCommitter.java):
大家可以看到 commitTask 方法里面,有个条件判断 algorithmVersion == 1,这个就是 mapreduce.fileoutputcommitter.algorithm.version 参数的值,默认为1;如果这个参数为1,那么在 Task 完成的时候,是将 Task 临时生成的数据移到 task 的对应目录下,然后再在 commitJob 的时候移到最终作业输出目录,而这个参数,在 Hadoop 2.x 的默认值就是 1!这也就是为什么我们看到 job 完成了,但是程序还在移动数据,从而导致整个作业尚未完成,而且最后是由 Spark 的 Driver 执行 commitJob 函数的,所以执行的慢也是有到底的。
而我们可以看到,如果我们将 mapreduce.fileoutputcommitter.algorithm.version
参数的值设置为 2,那么在 commitTask 执行的时候,就会调用 mergePaths 方法直接将 Task 生成的数据从 Task 临时目录移动到程序最后生成目录。而在执行 commitJob 的时候,直接就不用移动数据了,自然会比默认的值要快很多。
注意,其实在 Hadoop 2.7.0 之前版本,我们可以将 mapreduce.fileoutputcommitter.algorithm.version 参数设置为非1的值就可以实现这个目的,因为程序里面并没有限制这个值一定为2,。不过到了 Hadoop 2.7.0,mapreduce.fileoutputcommitter.algorithm.version 参数的值必须为1或2,具体参见 MAPREDUCE-4815。
怎么在 Spark 里面设置这个参数
问题已经找到了,我们可以在程序里面解决这个问题。有以下几种方法:
直接在
conf/spark-defaults.conf
里面设置spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version 2
,这个是全局影响的。直接在 Spark 程序里面设置,spark.conf.set("mapreduce.fileoutputcommitter.algorithm.version", "2"),这个是作业级别的。
如果你是使用 Dataset API 写数据到 HDFS,那么你可以这么设置 dataset.write.option("mapreduce.fileoutputcommitter.algorithm.version", "2")。
不过如果你的 Hadoop 版本为 3.x,mapreduce.fileoutputcommitter.algorithm.version 参数的默认值已经设置为2了,具体参见 MAPREDUCE-6336 和 MAPREDUCE-6406。
因为这个参数对性能有一些影响,所以到了 Spark 2.2.0,这个参数已经记录在 Spark 配置文档里面了 configuration.html
,具体参见 SPARK-20107。
总结
以上所述是小编给大家介绍的Apache Spark 2.0 在作业完成时却花费很长时间结束,希望对大家有所帮助!
来源:https://mp.weixin.qq.com/s?__biz=MzU3NTE2NzAxNQ==&mid=2247484099&idx=1&sn=0a0a3a1f407d30a22dcfbd85fab488e6&chksm=fd260d8bca51849d94e8df9f2249462d5a5dfc8079c45b4d9ab489aaea77c0ce14108a948f94&token=2064668791&lang=zh_CN&utm_source=tuicool&utm_medium=referral


猜你喜欢
- linux系统下,我们可以修改或者添加.htaccess 文件来实现discuz的伪静态。1. 文章中引用的部分,则是实现伪静态的方法!我们
- ASP 的新增功能除了内部性能增强和优化外,该版本的 Active Server Pages(ASP) 还具有如下新功能:更好的国际化和 U
- UCenter Home 默认有 8 个分组,如下图所示: 很多会员想修改默认的会员分组,下面我们仔细讲解如何修改好友分组的名称。
- 1、对于论坛的优化来说是比较难的,主动性太差,一般在不计用户体验的情况下点击率达到3%已经很不容易了。2、对于论坛来说,我们的目标就是尽可能
- 1.将nginx的压缩包nginx-1.8.0.tar.gz上传到Linux服务器2.由于nginx是C语言开发的并且我们这里是通过编译ng
- 从有了Google Adsense英文站便成了一个热门的话题,因为很多站长都坚信做英文站是一个能快速发家致富的捷径,只是他们中大部分人从来就
- 11月5日消息,网络电话服务商Skype的诉讼纷扰可能要告一段落了,美国《纽约时报(NewYorkTimes)》报道引述几位知情人士透露,这
- 要想从事网络游戏运营服务,就必须经过“互联网出版许可证”这第一道准入门槛。这是新闻出版总署、国家版权
- Exchange Server在满足大企业和小公司不同需求上不断地努力,并得到用户广泛的认可。但今天各种规模的企业用户有着新的、相似的沟通服
- 北京时间5月5日消息,据国外媒体报道,美国知名市场研究公司Gartner近日发布预测报告称,到2008年年底时,全球使用手机支付的用户总量有
- 我做互联网这个行业有5年了,一直做网站建设和推广销售。真正拥有自己的网站是去年。那时我是自己出来单干了,还有一个代理商赠送的一个代理平台,严
- 最近在与一些网络广告商的接触中,很多商务人员向我推荐“精准定向广告”,也就是“窄告”。其中具代表性的是阿里妈妈和一些副媒体类广告代理。我研究
- 以百万富翁为诱饵在观众面前,一问一答,再问抢答,过五关斩六将,最终胜利者将获得百万大奖。这种“百万富翁&rdqu
- 一直不太想说Google Pagerank劫持这个话题,因为怕造成一些人刻意利用来骗其他的站长。不过聚友提供了判断PR劫持的目标网站的方法已
- 最近在论坛上经常看到关于ARP病毒的问题,于是在Google上搜索ARP关键字!结果出来N多关于这类问题的讨论。想再学习ARP下相关知识,所
- SEO Digger [ 关键词查询, 排名查询 ] - 检测你站点中已经有比较好排名的关键词,并可以查看他们排名的位置。我想,
- 10月13日是世博倒计时200天,“星耀世博——首批世博城市之星颁奖典礼&
- 1、关键字研究在做任何举动之前,先用关键字工具来做一个广泛的调查,看哪些关键字/词适用于你的站点。你的直接竞争对手用的是什么关键词?是不是有
- 这段时间买国外主机的筒子们越来越多,而付款就是首先摆在大家眼前的一道障碍,大部分美国主机商只能通过信用卡购买,付款不方便。因为这个原因,很多
- 搜狗云输入法跨平台、免安装,对于Linux、Mac OS等操作系统的用户,或在网吧等临时使用环境,都能在上网冲浪时享受搜狗输入法的流畅输入体