web-dev-qa-db-fra.com

Comment charger Java et l'utiliser dans Spark?

Je veux stocker les arguments Spark tels que le fichier d'entrée, le fichier de sortie dans un fichier de propriétés Java et passer ce fichier dans le pilote Spark. J'utilise spark-submit pour soumettre le travail, mais je n'ai pas trouvé de paramètre pour transmettre le fichier de propriétés. Avez vous des suggestions?

21
diplomaticguru

ici j'ai trouvé une solution:

fichier d'accessoires: (mypropsfile.conf) // note: préfixez votre clé avec "spark". sinon les accessoires seront ignorés.

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

lancement

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

comment appeler le code :( dans le code)

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

L'approche de la réponse précédente a la restriction selon laquelle chaque propriété doit commencer par spark dans le fichier de propriétés -

par exemple.

spark.myapp.input
spark.myapp.output

Si supposons que vous ayez une propriété qui ne commence pas par spark:

job.property:

app.name = xyz

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

Spark ignorera toutes les propriétés n'ayant pas de préfixe spark. avec message:

Avertissement: Ignorer la propriété de configuration non-spark: app.name = test

Comment je gère le fichier de propriétés dans le pilote et l'exécuteur de l'application:

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

code Java pour accéder au fichier cache (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");

Si vous avez des propriétés spécifiques à l'environnement (dev/test/prod) puis fournissez APP_ENV personnalisé Java dans spark-submit:

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

Remplacez votre code pilote ou exécuteur:

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