【问题标题】:Loading Java spark config from yaml file从 yaml 文件加载 Java spark 配置
【发布时间】:2016-09-13 20:25:16
【问题描述】:

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

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

master 和 app 名称来自一个包含 app 配置的 yaml 文件,其余的 spark 配置是硬编码的,一次设置一个。

我的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 文件中的这些配置,使用SparkConf 提供的setAll() 方法在代码中自动设置火花配置,而不是一次设置一个。

这就是我目前从yaml 文件中读取配置的方式,但它不起作用:

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

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

【问题讨论】:

  • 你认为这是一般的 Java/Scala 问题,与 Spark 无关吗?

标签: java scala apache-spark yaml


【解决方案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));

【讨论】:

  • 非常感谢,如果我们在某个外部文件夹中有“application.yaml”并且它的路径是动态设置的......如何将文件路径动态传递给火花作业?
【解决方案2】:

对于 jdk8

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

【讨论】:

  • 添加一些解释,说明此答案如何帮助 OP 解决当前问题
  • 在回答问题时,重要的是要解释和记录您的解决方案,而不仅仅是发布它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
相关资源
最近更新 更多