Apache spark 无法实现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());
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版本的结构非常相似,只是更加详细。如果您将整个作业流程添加到代码示例中,那会更好。很难理解你到底有什么问题。