我有一个用Zookeeper编写的配置信息。我正在使用Apache Curator来阅读配置(如果有更好的解决方案来阅读它,我很乐意使用它)与Curator Watcher,所以如果在Zookeeper中更改配置,我将收到新的配置。我在Spark中使用此配置。如何将它分享给同一应用程序的所有spark执行器?
谢谢!
LE
谢谢Dikei,
在以下代码中,您将在哪里执行观察程序?我是新手,我不确定每个工人会发生什么。
谢谢!
final JavaDStream<ElementMessage> nodeMessageStream = mapWithStateDistinctAndFiltered.flatMap(pair -> pair._2.buildElementMessages())
.filter(f -> f != null);
nodeMessageStream.foreachRDD(rdd -> {
rdd.foreachPartition(r -> {
final ElementRecordRestClient rest = new ElementRecordRestClient(
startProps.getProperty(InputPropertyKey.WEPAPP_URL.toString()));
r.forEachRemaining(message -> {
rest.createObject(message.toElementRecord());
});
});
});
答案 0 :(得分:0)
在这种情况下,我要做的是在主节点上运行Curator Watcher,并使用Spark的广播变量将配置广播到所有执行程序。每当配置发生更改时,您都会停止当前的流式上下文,并使用新配置启动新的上下文。这将确保您的结果始终保持一致。
另一种方法是在foreachPartition
lambda函数中读取zookeeper配置。但由于配置是由每个分区独立读取的,因此同一RDD的不同分区可能会得到不同的配置,这可能与您的预期不同。