我有一个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()
}
我需要更改什么以便可以单独提供配置文件?
1条答案
按热度按时间nwnhqdif1#
据spark docs说,
--files
放在每个执行者的工作目录中。当您试图从驱动程序而不是执行程序访问此文件时。要在驱动端加载配置,请尝试以下操作:
如果您想在executor端加载config,那么需要使用
spark.executor.extraJavaOptions
财产。在这种情况下,需要在executor上运行的lambda中加载配置,例如RDDAPI:建筑物的可见性
config
将限制在lambda的范围内。这是一个相当复杂的方法,下面我将描述一个更好的选择。关于如何在spark中使用自定义配置的一般建议:
阅读spark docs的这一章
在驾驶员侧加载配置
将需要的设置Map到不可变的case类
通过闭包将这个case类传递给执行者
请记住,带有设置的case类应该包含尽可能少的数据,任何字段类型都应该是基元类型或实现类型
java.io.Serializable
特定于emr的是很难访问驱动程序的文件系统。因此,最好将配置存储在外部存储器中,通常是s3。typesafe config lib无法直接从s3加载文件,因此可以将路径作为app参数传递给配置,而不是-dproperty,使用从s3读取它
AmazonS3Client
然后使用ConfigFactory.parseString()
. 以这个答案为例。