【2019-01-04】Spark 程序在driver卡住

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【2019-01-04】Spark 程序在driver卡住相关的知识,希望对你有一定的参考价值。

参考技术A

发现在2019-01-16 15:53:11,748:

最终executor和driver的心跳失效:

此外还有大量shuffle异常日志:

shuffle异常是否也是失败的根因?

1.由于无法获取到driver日志,没法做更多的分析。先排除推测机制的干扰。让客户关闭掉spark推测机制:spark.speculation

2.关闭掉推测机制后,任务运行也失败了。启动executor失败的次数达到上限

并且失败都有大量的socket异常打印,executor和driver网络通信中断:

还是怀疑是网络的问题

1.分析AM日志,发现AM日志从15点到之后都没有任何打印:

发现TID 13203 执行了40多min,在stage 31。虽然stage31的某个task执行慢,但是最终是执行成功的。spark的shuffle对网络性能要求比较高,准备进行如下shuffle调优,避免单个task问题:
准备进行如下调整:调优化shuffle参数:
spark.shuffle.file.buffer=64k,
spark.reducer.maxSizeInFlight=96M
spark.network.timeout=300s
spark.rpc.askTimeout=300s
spark.shuffle.io.serverThreads=8

1.部分task执行慢,是由于shuffle性能影响,调整shuffle参数规避。
spark.shuffle.file.buffer=64k,
spark.reducer.maxSizeInFlight=96M
spark.network.timeout=300s
spark.rpc.askTimeout=300s
spark.shuffle.io.serverThreads=8
2.不排除网络问题的影响,试图调整os参数,但是客户生产
net.ipv4.tcp_keepalive_time= 15
net.ipv4.tcp_keepalive_probes = 10
net.ipv4.tcp_keepalive_intvl= 30
3.关闭sasl
spark.authenticate.enableSaslEncryption=false
spark.authenticate=false

在不同版本的 spark 上远程运行 spark 应用程序

【中文标题】在不同版本的 spark 上远程运行 spark 应用程序【英文标题】:Run spark application on a different version of spark remotely 【发布时间】:2018-10-17 21:34:00 【问题描述】:

我很少有火花测试,我在 spark 1.6.0 上通过 maven 远程运行良好,并且正在使用 scala。现在我想在 spark2 上运行这些测试。问题是 cloudera,默认情况下使用 spark 1.6。 cloudera 是从哪里获取这个版本的,我需要做什么来更改 spark 的默认版本? 此外,spark 1.6 和 spark 2 存在于同一个集群上。两种火花版本都存在于纱线之上。 hadoop 配置文件存在于我用来在测试环境中运行测试的集群上,这就是我获取 spark 上下文的方式。

def getSparkContext(hadoopConfiguration: Configuration): SparkContext =
val conf = new SparkConf().setAppName("SparkTest").setMaster("local")     
hadoopConfiguration.set("hadoop.security.authentication", "Kerberos")
UserGroupInformation.loginUserFromKeytab("alice", "/etc/security/keytab/alice.keytab")
val sc=new SparkContext(conf)
return sc

有什么方法可以在 conf 文件或 cloudera 本身中指定版本吗?

【问题讨论】:

我无法理解您的问题。特别是:有什么方法可以在 conf 文件中指定 it[...]? 这里的“it”是什么? @wind 基于这个How do i specify the version ?,我会说“它”是spark版本。 可以为依赖管理器定义一个版本的 Spark,因此对于 Scala,它可以是 SBT、Maven 或 Gradle。项目中有一个文件(相应的build.sbt、pom.xml、build.gradle)来定义依赖项(包名和版本)。 【参考方案1】:

提交新的 Spark Job 时,有两个地方需要更改 Spark-Version:

    SPARK_HOME 设置为包含正确Spark 安装的(本地)路径。 (有时 - 特别是对于较小的版本更改 - SPARK_HOME 中的版本不必 100% 正确,但我建议保持干净。) 通知您的集群 Spark jar 所在的位置。默认情况下,spark-submit 会将SPARK_HOME 中的jar 上传到您的集群(这是您不应该混合版本的原因之一)。但是您可以通过提示集群管理器使用位于 hdfs 中的 jar 来跳过此上传过程。当您使用 Cloudera 时,我假设您的集群管理器是 Yarn。在这种情况下,请将 spark.yarn.jarsspark.yarn.archive 设置为正确 Spark 版本的 jar 所在的路径。示例:--conf spark.yarn.jar=hdfs://server:port/<path to your jars with the desired Spark version>

在任何情况下,您都应该确保您在运行时使用的 Spark 版本与编译时相同。您在 Maven、Gradle 或 Sbt 配置中指定的版本应始终与 SPARK_HOMEspark.yarn.jars 引用的版本匹配。

【讨论】:

我将 /opt/spark2/jars 中的所有 jars 复制到 hdfs 并在 spark.yarn.jars 中给出了路径。它仍在运行 spark v1.6.0 @werner 您可以在调用 spark-submit 时分享输出的相关部分吗?应该有一行提交过程通知您它不会上传 spark jar,因为它们已经存在于由spark.yarn.jars指定的目录中的 hdfs 中【参考方案2】:

我能够为 spark 2.3.0 成功运行它。我之前无法在 spark 2.3.0 上运行它的问题是因为我在 pom.xml 中为 1.6 版本添加了 spark-core 依赖项。这就是为什么无论我们指定什么 jar 位置,它默认采用 spark 1.6(仍在弄清楚为什么)。在更改库版本时,我能够运行它。

【讨论】:

以上是关于【2019-01-04】Spark 程序在driver卡住的主要内容,如果未能解决你的问题,请参考以下文章

Spark教程Spark连接MongoDB

Spark 运行的4种模式

Spark中的资源调优

Spark 1.5.1 不适用于 hive jdbc 1.2.0

大数据:Spark CoreDriver上的Task的生成分配调度

实战技巧通过Spark日志文件定位作业报错或异常