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,如下:

Apache Spark 2.0 在作业完成时却花费很长时间结束

问题就出在了 Hadoop 2.x 的 FileOutputCommitter 实现FileOutputCommitter 里面有两个值得注意的方法:commitTask 和 commitJob。在 Hadoop 2.x 的FileOutputCommitter 实现里面,mapreduce.fileoutputcommitter.algorithm.version 参数控制着 commitTask 和 commitJob 的工作方式。具体代码如下(为了说明方便,我去掉了无关紧要的语句,完整代码可以参见 FileOutputCommitter.java):

Apache Spark 2.0 在作业完成时却花费很长时间结束

大家可以看到 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

标签:apache,spark
0
投稿

猜你喜欢

  • 百度被伊朗黑客攻陷

    2010-01-12 13:42:00
  • 手把手教你做主题 WordPress皮肤教程(二)

    2010-03-22 18:27:00
  • Linux crontab定时任务配置方法(详解)

    2021-01-10 06:25:17
  • 个人站长作广告联盟必须知道的九件事

    2009-04-19 14:41:00
  • 教你robots文件使用方法屏蔽搜索抓取方法

    2009-02-06 14:18:00
  • SupeSite7.0模板样式解析之日志篇

    2009-09-18 12:45:00
  • 如何在Windows Server 2003中配置DNS

    2008-12-23 15:56:00
  • 如何选择一款适合你的虚拟主机

    2007-12-22 16:53:00
  • Zotonic:下一个Drupal?

    2011-05-17 12:14:00
  • Godaddy正式支持支付宝

    2009-12-23 19:02:00
  • Openssl实现双向认证教程(附服务端客户端代码)

    2023-06-09 12:38:42
  • DoS与DDos攻击工具基本技术及其发展

    2009-12-24 14:41:00
  • Linux chage命令详解

    2023-09-25 11:14:32
  • Office 2010新增Starter版本 首纳产品密钥卡

    2009-10-10 13:50:00
  • VMware配置多节点环境的操作方法

    2022-01-24 17:00:16
  • 任天堂推出新掌上游戏机 4英寸屏幕力拼PSP

    2009-10-31 07:41:00
  • GoDaddy空间如何在子域名及别名域名上设置404页面

    2010-04-12 12:33:00
  • Windows 2003邮件服务器配置指南(图)

    2008-07-28 17:11:00
  • 七种友情链接作弊方法 站长要十分注意

    2009-05-15 16:19:00
  • Service Temporarily Unavailable的503错误是怎么回事?

    2023-06-12 23:04:27
  • asp之家 网站运营 m.aspxhome.com