如何加载 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")
我想将 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")