Как загрузить файл свойств Java и использовать его в Spark?

Я хочу сохранить аргументы Spark, такие как входной файл, выходной файл, в файлы свойств Java и передать этот файл в Spark Driver. Я использую spark-submit для отправки задания, но не могу найти параметр для передачи файла свойств. У вас есть предложения?

Ответы

Ответ 1

здесь я нашел одно решение:

файл реквизита: (mypropsfile.conf)// note: префикс вашего ключа с помощью "искры". иначе реквизиты будут проигнорированы.

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

Ответ 2

Предыдущий подход к ответу имеет ограничение: каждое свойство должно начинаться с spark в свойстве file-

например

spark.myapp.input
spark.myapp.output

Если предположить, что у вас есть свойство, которое не начинается с spark:

job.property:

app.name = хуг

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

Spark игнорирует все свойства без префикса spark. с сообщением:

Предупреждение: игнорирование свойства конфигурации без искры: 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 пользовательскую переменную среды java APP_ENV:

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