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

Posted

技术标签:

【中文标题】在不同版本的 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(仍在弄清楚为什么)。在更改库版本时,我能够运行它。

【讨论】:

以上是关于在不同版本的 spark 上远程运行 spark 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 IntelliJ 上添加对远程 spark 的依赖

多节点火花集群上的 spark-shell 无法在远程工作节点上旋转执行程序

运行之间的 Spark DataFrame 行数不一致

在远程集群上从 Spark 运行 hive 查询时,客户端无法通过以下方式进行身份验证:[TOKEN, KERBEROS]

Spark数据传输及ShuffleClient(源码阅读)

Spark Shuffle服务和客户端