【问题标题】:How to load java properties file and use in Spark?如何加载 java 属性文件并在 Spark 中使用?
【发布时间】:2015-09-15 22:16:41
【问题描述】:

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

【问题讨论】:

  • 你是否厌倦了这个选项:--properties-file FILE 加载额外属性的文件路径

标签: java apache-spark properties-file


【解决方案1】:

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

props 文件 : (mypropsfile.conf) // 注意:在您的密钥前加上“spark”。 else 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

【讨论】:

  • @ramisetty.vijay : 文件扩展名应该是 .conf 或者我们也可以使用 .properties?
  • 它也适用于 .properties 文件。但里面的格式应该是 spark.my.key \t myvalue
  • 如何添加多个属性文件?最好在目录中。
  • 警告,使用 --properties-file 确实会覆盖任何以前定义的 spark-defaults.conf (spark.apache.org/docs/latest/submitting-applications.html),因此可能需要创建自己的合并版本。
  • 使用 --properties-file 可以覆盖 spark-defaults.conf 中定义的任何设置,每个环境可能不同。是否需要确保属性文件是合并版本?
【解决方案2】:

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

例如

spark.myapp.input
spark.myapp.output

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

job.property:

app.name=xyz

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

Spark 将忽略所有没有前缀 spark. 的属性,并带有消息:

警告:忽略非火花配置属性:app.name=test

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

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

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

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")

【讨论】:

  • 它是如何连接到 HDFS 文件系统的?
  • 就我而言,我使用的是 HDFS。您也可以使用 java io 来读取属性文件。
猜你喜欢
  • 2012-01-02
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 2011-07-09
  • 2015-06-11
  • 2017-01-14
  • 2022-01-15
  • 2011-11-27
相关资源
最近更新 更多