• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
陈辞滥调 显示全部楼层 发表于 2021-10-26 13:48:55 |阅读模式 打印 上一主题 下一主题
征象
大家在利用 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 函数的,以是执行的慢也是有到底的。
而我们可以看到,如果我们将
  1. 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 里面设置这个参数
题目已经找到了,我们可以在步调里面办理这个题目。有以下几种方法:
      
  • 直接在
    1.  conf/spark-defaults.conf 
    复制代码
    里面设置
    1. 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 设置文档里面了
  1.  configuration.html
复制代码
,具体拜见 SPARK-20107。
总结
以上所述是小编给大家先容的Apache Spark 2.0 在作业完成时却耗费很长时间竣事,渴望对大家有所帮助!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作