Apache spark 无法实现Spark函数的顺序执行

Apache spark 无法实现Spark函数的顺序执行,apache-spark,spark-streaming,Apache Spark,Spark Streaming,在我们的Spark管道中,我们阅读来自卡夫卡的信息 JavaPairDStream<byte[],byte[]> = messagesKafkaUtils.createStream(streamingContext, byte[].class, byte[].class,DefaultDecoder.class,DefaultDecoder.class, configMap,topic,StorageLevel.MEMORY_ONLY_SER());

在我们的Spark管道中,我们阅读来自卡夫卡的信息

JavaPairDStream<byte[],byte[]> = messagesKafkaUtils.createStream(streamingContext, byte[].class, byte[].class,DefaultDecoder.class,DefaultDecoder.class,
                configMap,topic,StorageLevel.MEMORY_ONLY_SER());
我们使用映射函数转换这些消息

JavaDStream<ProcessedData> lines=messages.map(new Function<Tuple2<byte[],byte[]>, ProcessedData>() 
        {
          public ProcessedData  call(Tuple2<byte[],byte[]> tuple2) 
            {


            }
        });
//这里ProcessedData是我的消息bean类

在此之后,我们使用foreachRDD函数将此消息保存到Cassandra中。然后我们使用foreachRDD函数在ElasticSearch中为同一消息编制索引。我们需要的是,首先将消息存储在Cassandra中并成功执行,然后仅在ElasticSearch中对其编制索引。为此,我们需要顺序执行Cassandra和弹性搜索函数

我们无法在Cassandra的foreachRDD函数中生成JavaDStream,作为ElasticSearch函数的输入

如果我们在Cassandra和Elastic搜索函数中使用map函数,我们可以成功地执行它们的顺序执行。但是,我们的Spark管道中没有任何操作,它也没有执行


任何帮助都将不胜感激。

实现此排序的一种方法是将Cassandra插入和ElasticSearch索引放在同一任务中。 大致如下*:

val kafkaDStream = ???
val processedData = kafkaDStream.map(elem => ProcessData(elem))
val cassandraConnector = CassandraConnector(sparkConf)
processData.forEachRDD{rdd =>
    rdd.forEachPartition{partition => 
        val elasClient = ??? elasticSearch client instance
        partition.foreach{elem => 
            cassandraConnector.withSessionDo(session =>
                 session.execute("INSERT ....")
            }
            elasClient.index(elem) // whatever the client method is called
        }
     }
}
例如,为了实现排序,我们牺牲了Cassandra spark连接器内部完成的批处理操作的能力


*这段代码的Java版本的结构非常相似,只是更加详细。

如果您将整个作业流程添加到代码示例中,那会更好。很难理解你到底有什么问题。