我有一个Java SparkConf
Spark应用程序,在其中实例化具有Spark所需配置的对象。当前,它看起来像这样:
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()
提供的方法自动在代码中设置spark配置SparkConf
,而不是一次设置一个。
这是我yaml
目前从文件中读取配置的方式,但是它不起作用:
LinkedHashMap<String, String> sparkConf = new LinkedHashMap<>((Map<String, String>) ((Map) yaml.get("spark")).get("conf"));
如何spark: conf
从yaml
文件中加载文件,以便该setAll()
方法可以使用它?显然,该方法需要类型为的scala对象Traversable<Tuple2<String, String>>
。
您可以在项目中添加“ 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));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句