如何在apachespark中使用typesafe配置?

z4bn682m  于 2021-05-17  发布在  Spark
关注(0)|答案(1)|浏览(442)

我有一个spark应用程序,我正试图将其打包为一个胖jar,并使用它部署到本地集群 spark-submit . 我正在使用typesafe config为各种部署环境创建配置文件- local.conf , staging.conf ,和 production.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()
}

我需要更改什么以便可以单独提供配置文件?

nwnhqdif

nwnhqdif1#

据spark docs说, --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

如果您想在executor端加载config,那么需要使用 spark.executor.extraJavaOptions 财产。在这种情况下,需要在executor上运行的lambda中加载配置,例如RDDAPI:

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

建筑物的可见性 config 将限制在lambda的范围内。这是一个相当复杂的方法,下面我将描述一个更好的选择。
关于如何在spark中使用自定义配置的一般建议:
阅读spark docs的这一章
在驾驶员侧加载配置
将需要的设置Map到不可变的case类
通过闭包将这个case类传递给执行者
请记住,带有设置的case类应该包含尽可能少的数据,任何字段类型都应该是基元类型或实现类型 java.io.Serializable 特定于emr的是很难访问驱动程序的文件系统。因此,最好将配置存储在外部存储器中,通常是s3。
typesafe config lib无法直接从s3加载文件,因此可以将路径作为app参数传递给配置,而不是-dproperty,使用从s3读取它 AmazonS3Client 然后使用 ConfigFactory.parseString() . 以这个答案为例。

相关问题