Java 在多个Spark执行器上共享Zookeeper配置

Java 在多个Spark执行器上共享Zookeeper配置,java,apache-spark,apache-zookeeper,apache-curator,Java,Apache Spark,Apache Zookeeper,Apache Curator,我有一个用Zookeeper写的配置信息。我使用Apache Curator与Curator Watcher一起读取配置(如果有更好的读取解决方案,我很乐意使用),因此如果Zookeeper中的配置发生更改,我将收到新的配置。我在Spark中使用此配置。如何将其共享给同一应用程序的所有spark执行者 谢谢大家! final JavaDStream<ElementMessage> nodeMessageStream = mapWithStateDistinctAndFiltered.

我有一个用Zookeeper写的配置信息。我使用Apache Curator与Curator Watcher一起读取配置(如果有更好的读取解决方案,我很乐意使用),因此如果Zookeeper中的配置发生更改,我将收到新的配置。我在Spark中使用此配置。如何将其共享给同一应用程序的所有spark执行者

谢谢大家!

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());
            });
        });
    });
乐:

谢谢你,我

在下面的代码中,您将在哪里执行watcher实现?我是spark的新手,我不确定每个员工都会得到什么

谢谢大家!

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());
            });
        });
    });
final JavaDStream nodeMessageStream=MapWithStateDistrinctandFiltered.flatMap(对->对._2.buildElementMessages())
.filter(f->f!=null);
nodeMessageStream.foreachRDD(rdd->{
rdd.foreachPartition(r->{
final ElementRecordRestClient rest=新ElementRecordRestClient(
startProps.getProperty(InputPropertyKey.WEPAPP_URL.toString());
r、 ForEachLeving(消息->{
createObject(message.toElementRecord());
});
});
});

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


另一种方法是读取
foreachPartition
lambda函数中的zookeeper配置。但是,由于配置由每个分区独立读取,同一RDD的不同分区可以获得不同的配置,这可能不是您所期望的。

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


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

谢谢您的回答。我已经编辑了最初的帖子。谢谢你的回答。我已经编辑了最初的帖子。有趣的解决方案,第一个,但是流的停止和启动让我很困扰。这到底意味着什么,我如何停止和启动流(手动除外)?非常感谢。您必须通过对当前上下文对象调用
stop
来手动停止处理。然后创建一个新的流媒体上下文,并通过调用
start
启动它。如果您的输入源像一个持久队列,那么当新的流上下文启动时,它将恢复到上一个上下文停止的位置。感谢您的帮助。有趣的解决方案,第一个解决方案,但流的停止和启动困扰着我。这到底意味着什么,我如何停止和启动流(手动除外)?非常感谢。您必须通过对当前上下文对象调用
stop
来手动停止处理。然后创建一个新的流媒体上下文,并通过调用
start
启动它。如果您的输入源的行为类似于一个持久队列,那么当新的流上下文启动时,它将恢复到上一个上下文停止的位置。感谢您的帮助。