从yaml文件加载Java spark配置

时间:2016-09-13 20:25:16

标签: java scala apache-spark yaml

我有一个java spark应用程序,其中我使用Spark所需的配置实例化SparkConf对象。目前,它看起来像这样:

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

我想知道我是否可以使用yaml文件中的这些配置,使用setAll()提供的SparkConf方法自动设置代码中的spark配置,而不是设置他们一次一个。

这就是我目前从yaml文件中读取配置文件的方式,但它无效:

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

如何从spark: conf文件加载yaml,以便setAll()方法可以使用它?显然,该方法需要一个类型为Traversable<Tuple2<String, String>>的scala对象。

2 个答案:

答案 0 :(得分:1)

你可以添加&#34; snakeyaml&#34;在项目中依赖于在java中读取yaml文件。

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

现在,如果你有&#34; application.yaml&#34;如果已经发布了配置定义的文件,您可以在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 :(得分:-1)

表示jdk8

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