2015-06-29 13 views
17

Chcę przechowywać argumenty Spark, takie jak plik wejściowy, plik wyjściowy do plików właściwości Java i przekazać ten plik do sterownika Spark. Korzystam z funkcji przesyłania z iskrą do przesłania zadania, ale nie mogę znaleźć parametru, który przekazałby plik właściwości. Czy masz jakieś sugestie?Jak załadować plik właściwości Java i użyć go w Sparku?

+1

czy zmęczyłeś tę opcję: --prop erties-file FILE Ścieżka do pliku, z którego można załadować dodatkowe właściwości –

Odpowiedz

28

tutaj znalazłem jedno rozwiązanie: Plik

rekwizyty (mypropsfile.conf) // uwaga: prefiks klucz z "iskrą". inne rekwizyty będą ignorowane.

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

launch

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

jak zadzwonić w kodzie :(wewnątrz kodu)

sc.getConf.get("spark.driver.host") // localhost 
sc.getConf.get("spark.myapp.input")  // /input/path 
sc.getConf.get("spark.myapp.output")  // /output/path 
+1

+ ta sama sztuczka zadziała również w przypadku iskrzenia-skorupy .... –

+0

dziękuję :-) To działało! – diplomaticguru

+0

@ ramisetty.vijay: rozszerzenie pliku powinno być .conf lub możemy również użyć .properties? – Shankar

3

podejście poprzednią odpowiedź zawiera ograniczenie, które jest każda nieruchomość powinna zacząć z spark w pliku właściwości -

np.

spark.myapp.input
spark.myapp.output

Jeśli Załóżmy, że masz nieruchomość, która nie rozpoczyna się spark:

job.property:

app.name = xyz

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

Spark zignoruje wszystkie właściwości nie posiada prefiksu spark. z komunikatem:

Ostrzeżenie: Zignorowanie non-iskra nieruchomość config: app.name = test

Jak ja zarządzaj plikiem właściwości w sterowniku aplikacji i executorze:

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

Kod Java umożliwiający dostęp do pliku pamięci podręcznej (zadanie.Właściwości):

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; 

//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)); 
Properties prop = new Properties(); 
//load properties 
prop.load(is) 
//retrieve properties 
prop.getProperty("app.name"); 

Jeśli masz środowiska specyficzne właściwości (dev/test/prod) następnie dostarczyć APP_ENV niestandardową zmienną środowiskową java w spark-submit:

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

Wymień sterownika lub wykonawcy kod:

//Load file to propert object using HDFS FileSystem 
String fileName = SparkFiles.get(System.getProperty("APP_ENV")+".properties") 
Powiązane problemy