当前位置: 首页 > 知识库问答 >
问题:

如何在Apache Spark中使用类型安全配置?

单修德
2023-03-14

我有一个Spark应用程序,我正试图将其打包为fat jar并使用spark-submit部署到本地集群。我正在使用Typesafe config为各种部署环境-local.confstaging.confproduction.conf创建配置文件,并尝试提交我的JAR。

我正在运行的命令如下:

/opt/spark-3.0.1-bin-hadoop2.7/bin/spark-submit \
--master spark://127.0.0.1:7077 \
--files ../files/local.conf \
--driver-java-options '-Dconfig.file=local.conf' \
target/scala-2.12/spark-starter-2.jar  

我通过一个接一个地添加选项,以增量方式构建了该命令。使用--files,日志提示文件正在上载到Spark,但当我添加--driver-java-options时,提交失败,找不到文件。

Caused by: java.io.FileNotFoundException: local.conf (No such file or directory)
        at java.base/java.io.FileInputStream.open0(Native Method)
        at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
        at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
        at com.typesafe.config.impl.Parseable$ParseableFile.reader(Parseable.java:629)
        at com.typesafe.config.impl.Parseable.reader(Parseable.java:99)
        at com.typesafe.config.impl.Parseable.rawParseValue(Parseable.java:233)
        at com.typesafe.config.impl.Parseable.parseValue(Parseable.java:180)
        ... 35 more

代码:

import com.example.spark.settings.Settings
import com.typesafe.config.ConfigFactory
import org.apache.spark.sql.SparkSession

object App extends App {
  val config = ConfigFactory.load()
  val settings = Settings(config = config)

  val spark = SparkSession
    .builder()
    .getOrCreate()

  spark.stop()
}

共有1个答案

宗烨赫
2023-03-14

根据Spark文档,--files被放置在每个执行器的工作目录中。同时尝试从驱动程序(而不是执行程序)访问此文件。

为了在驱动程序端加载配置,请尝试以下操作:

/opt/spark-3.0.1-bin-hadoop2.7/bin/spark-submit \
--master spark://127.0.0.1:7077 \
--driver-java-options '-Dconfig.file=../files/local.conf' \
target/scala-2.12/spark-starter-2.jar  

如果您希望在执行器端加载配置,则需要使用spark.executor.ExtraJavaOptions属性。在这种情况下,您需要加载运行在executor上的lambda内部的配置,例如RDD API:


myRdd.map { row => 
  val config = ConfigFactory.load()
  ...
}

EMR的具体特点是很难访问驱动程序的文件系统。因此最好将配置存储在外部存储中,通常是S3。

Typesafe配置库不能直接从S3加载文件,因此可以将配置的路径作为app参数传递,而不是作为-dProperty,使用amazons3client从S3读取,然后使用configFactory.parseString()作为配置加载。请参阅此答案作为示例。

 类似资料:
  • 问题内容: 我有课 和班级 关键是该方法不安全,因为我可以提供的项目与当前报告无关,但与其他报告相关,编译器不会抱怨。 是否可以用类型安全的方式编写该方法,即我们可以仅将T作为当前报表的类型作为参数传递。 问题答案: 我认为您正在寻找以下内容。 它的工作方式是: 您想用从 您要确保所有列表都属于同一类型 为了将参数绑定到从扩展的对象,您需要对自身进行参数化: 您添加需要从报表扩展的绑定 但是您要

  • 我一直在尝试使用Kotlin DSL以一种类型安全的方式转换我的项目的Gradle文件,但到目前为止还是失败了。我的所有项目都是Java中的多项目构建。其思想是对子模块的公共配置进行因子分解/重复数据删除(不管是在根模块的“subprojects”块中,还是在单独的“kts”文件中,我不关心)。官方文档指出,不可能对“子项目”和应用程序(从='shared.gradle.kts')进行类型安全(h

  • 我想在Kotlin中为具有不可变属性的类型使用类型安全生成器。 我想到了两种解决方案: 选项 1:创建生成器类: 选项2:创建自定义委托以防止再次设置该值: 选项1的缺点是我必须维护两个类,选项2的缺点是编译器将允许再次设置< code>DataClass中的值,并且检查将只在运行时进行。 有没有更好的方法来解决这个问题而没有提到的缺点?

  • 问题内容: 我想在Java中创建一个通用数组,以维护通常由Java提供的类型安全。 我正在使用此代码: 此代码类型安全吗?如果是这样,为什么?为什么它是类型安全的,我需要强制转换? 问题答案: 该方法的返回类型为。因此,您不能将其直接分配给以外的任何其他对象。因此,您需要演员表。 该方法委托给一个方法 创建具有指定组件类型和长度的新数组 因此,它正在创建一个type数组。 类型安全性,假设声明为

  • 问题内容: 我有一个结构如下的文件: 我想在命令行中覆盖。 对于其他值为简单类型(字符串,数字)的配置键,我可以使用进行覆盖,并且效果很好。 但是,我似乎找不到为 list 做到这一点的方法。在上面的示例中,我尝试将其设置为如下所示:,但是我得到了一个例外,即键值是字符串,而不是列表。 有没有一种方法可以通知类型安全配置库此值是一个列表? 问题答案: 为此,在1.0.1版中实现了另一种语法:

  • 问题内容: 当居中的flexbox项溢出其容器时,它们可能具有不良行为。 已经针对此问题提供了几种非灵活的解决方案,但是根据MDN,存在一个如下所述的值。 如果项目的大小溢出对齐容器,则将对齐该项目,就好像对齐模式已开始一样。 可以如下使用。 不幸的是,我无法找到任何示例或讨论,也无法确定浏览器对此有多少支持。 我试图在此CodePen中使用。但是,它对我不起作用。本似乎被忽略,或者容器元素是不正