如何加载 java 属性文件并在 Spark 中使用?

How to load java properties file and use in Spark?

我想将 Spark 参数(例如输入文件、输出文件)存储到 Java 属性 文件中,然后将该文件传递到 Spark 驱动程序中。我正在使用 spark-submit 提交作业,但找不到传递属性文件的参数。你有什么建议吗?

在这里我找到了一个解决方案:

props 文件 : (mypropsfile.conf) // 注意:在您的密钥前加上 "spark." 前缀,否则 props 将被忽略。

spark.myapp.input /input/path
spark.myapp.output /output/path

启动

$SPARK_HOME/bin/spark-submit --properties-file  mypropsfile.conf

如何在代码中调用 :(内码)

sc.getConf.get("spark.driver.host")  // localhost
sc.getConf.get("spark.myapp.input")       // /input/path
sc.getConf.get("spark.myapp.output")      // /output/path

前一个答案的方法有限制,即每个 属性 应该以 属性 文件中的 spark 开头-

例如

spark.myapp.input
spark.myapp.output

如果假设您有一个不以 spark 开头的 属性:

job.property:

app.name=xyz

$SPARK_HOME/bin/spark-submit --properties-file  job.property

Spark 将忽略所有没有前缀 spark. 且消息为:

的属性

Warning: Ignoring non-spark config property: app.name=test

我如何在应用程序的驱动程序和执行程序中管理 属性 文件:

${SPARK_HOME}/bin/spark-submit --files job.properties

Java 访问缓存文件的代码(job.properties):

import java.util.Properties;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.spark.SparkFiles;
import java.io.InputStream;
import java.io.FileInputStream;

//Load file to propert object using HDFS FileSystem
String fileName = SparkFiles.get("job.properties")
Configuration hdfsConf = new Configuration();
FileSystem fs = FileSystem.get(hdfsConf);

//THe file name contains absolute path of file
FSDataInputStream is = fs.open(new Path(fileName));

// Or use java IO
InputStream is = new FileInputStream("/res/example.xls");

Properties prop = new Properties();
//load properties
prop.load(is)
//retrieve properties
prop.getProperty("app.name");

如果您有特定于环境的属性 (dev/test/prod) 然后在 spark-submit 中提供 APP_ENV 自定义 java 环境变量:

${SPARK_HOME}/bin/spark-submit --conf \
"spark.driver.extraJavaOptions=-DAPP_ENV=dev spark.executor.extraJavaOptions=-DAPP_ENV=dev" \
--properties-file  dev.property

替换您的驱动程序或执行程序代码:

//Load file to propert object using HDFS FileSystem
String fileName = SparkFiles.get(System.getProperty("APP_ENV")+".properties")