web-dev-qa-db-ja.com

Javaプロパティファイルを読み込んでSparkで使用するには?

入力ファイル、出力ファイルなどのSpark引数をJavaプロパティファイルに格納し、そのファイルをSparkドライバーに渡します。ジョブの送信にspark-submitを使用していますが、プロパティファイルを渡すパラメーターが見つかりませんでした。何か提案はありますか?

21
diplomaticguru

ここで私は1つの解決策を見つけました:

props file:(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
33
vijay kumar

前の回答のアプローチには、すべてのプロパティがプロパティファイルの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)がある場合は、APP_ENV custom Java spark-submitの環境変数):

${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")
7
Rahul Sharma