我有一个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对象。
答案 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());});