我刚刚了解了SnappyData(并观看了一些关于它的视频),它看起来很有趣,主要是说性能可能比普通的火花作业快很多倍。
以下代码(代码段)是否可以利用SnappyData功能来提高作业的性能并提供相同的行为?
Dataset<EventData> ds = spark
.readStream()
.format("kafka")
(...)
.as(Encoders.bean(EventData.class));
KeyValueGroupedDataset<String, EventData> kvDataset = ds.groupByKey(new MapFunction<EventData, String>() {
public String call(EventData value) throws Exception {
return value.getId();
}
}, Encoders.STRING());
Dataset<EventData> processedDataset = kvDataset.mapGroupsWithState(new MapGroupsWithStateFunction<String, EventData, EventData, EventData>(){
public EventData call(String key, Iterator<EventData> values, GroupState<EventData> state) throws Exception {
/* state control code */
EventData processed = EventHandler.validate(key,values);
return processed;
}}, Encoders.bean(EventData.class), Encoders.bean(EventData.class));
StreamingQuery query = processedDataset.writeStream()
.outputMode("update")
.format("console")
.start();
答案 0 :(得分:1)
我怀疑SnappyData会优化这个管道。优化设计用于处理DataFrames(托管内存表)以及GroupBy,Join,scan等常用运算符。
在您的示例中,我认为映射函数主导着处理时间。也许,可以将formResponse.status
转换为Dataset<EventData>
(使用toDF()),将其存储在表中,使用内置的spark-sql运算符或UDF然后对其进行操作。这可能会显着改变摄取率。
在这个简单的例子中,您输出到Console。在现实世界中,我假设你将这种状态摄入某个商店。这是SnappyData可以产生重大影响的地方。