2016-09-13 67 views
0

我有一個java火花應用程序,在其中我實例化一個SparkConf對象與Spark所需的配置。目前,它看起來像這樣:從yaml文件加載Java火花配置

SparkConf conf = new SparkConf() 
    .setAppName(appName) 
    .setMaster(master) 
    .set("spark.executor.memory", "8g") 
    .set.... 

,主機和應用程序的名稱來自yaml文件,其中包含應用程序的配置,使火花配置的其餘部分進行硬編碼,並設置一個在同一時間。

我的yaml文件還包含Spark的這些配置的鍵/值對。我的其他(python)應用程序直接從這裏使用spark配置。它看起來像這樣:

spark: 
    master: ... 
    appname: ... 
    conf: 
     spark.mesos.executor.home: '/data/spark' 
     spark.executor.memory: '8g' 
     spark.network.timeout: '420' 
     ... other spark configs 

我想知道如果我可以用這些CONFIGS從yaml文件設置代碼火花CONFIGS自動使用SparkConf提供setAll()方法,而不是將它們設置一次一個。

這是我如何從yaml文件中讀取當前CONFIGS,但它不工作:

LinkedHashMap<String, String> sparkConf = new LinkedHashMap<>((Map<String, String>) ((Map) yaml.get("spark")).get("conf")); 

我怎樣才能從yaml文件加載spark: conf因此它可以通過setAll()方法一起使用?顯然,該方法需要一個類型爲:Traversable<Tuple2<String, String>>的scala對象。

+0

你認爲這是一個普通的Java/Scala的問題,無關與火花? –

回答

1

您可以在項目中添加「snakeyaml」依賴項來讀取java中的yaml文件。

<dependency> 
     <groupId>org.yaml</groupId> 
     <artifactId>snakeyaml</artifactId> 
     <version>1.17</version> 
</dependency> 

現在,如果你有有像你已經張貼定義配置「application.yaml」文件,你可以閱讀,在用java SETALL創建SparkConf()方法,如下面。

import org.yaml.snakeyaml.Yaml; 
import scala.collection.JavaConversions; 

Yaml yaml = new Yaml(); 
InputStream is = MySparkApplication.class.getClassLoader().getResourceAsStream("application.yaml"); 
Map<String, Object> yamlParsers = (Map<String, Object>) yaml.load(is); 
LinkedHashMap<String,Object> spark = (LinkedHashMap<String,Object>) yamlParsers.get("spark"); 
LinkedHashMap<String,String> config = (LinkedHashMap<String,String>) spark.get("conf"); 
SparkConf conf = new SparkConf() 
      .setAppName((String) spark.get("appname")) 
      .setMaster((String) spark.get("master")) 
      .setAll(JavaConversions.mapAsScalaMap(config)); 
-1

爲jdk8

LinkedHashMap<String,Object> sparkCfg= (LinkedHashMap<>) spark.get("spark.cfg"); 
SparkConf conf = new SparkConf(); 
sparkCfg.forEach((k,v)->{ conf.set(k, v.toString());}); 
+0

添加一些解釋和答案,解答這個問題的答案如何解決當前問題 –

+0

答案時,解釋和記錄您的解決方案非常重要,而不僅僅是發佈它們。 – MayorMonty