在多个Spark Executors上共享Zookeeper配置

时间:2016-07-05 14:19:15

标签: java apache-spark apache-zookeeper apache-curator

我有一个用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());
            });
        });
    });

1 个答案:

答案 0 :(得分:0)

在这种情况下,我要做的是在主节点上运行Curator Watcher,并使用Spark的广播变量将配置广播到所有执行程序。每当配置发生更改时,您都会停止当前的流式上下文,并使用新配置启动新的上下文。这将确保您的结果始终保持一致。

另一种方法是在foreachPartition lambda函数中读取zookeeper配置。但由于配置是由每个分区独立读取的,因此同一RDD的不同分区可能会得到不同的配置,这可能与您的预期不同。