Apache spark 火花流重播
我有一个Spark流应用程序来分析来自Kafka代理的事件。我有如下规则,可以通过组合现有规则生成新规则:Apache spark 火花流重播,apache-spark,cassandra,spark-streaming,apache-flink,Apache Spark,Cassandra,Spark Streaming,Apache Flink,我有一个Spark流应用程序来分析来自Kafka代理的事件。我有如下规则,可以通过组合现有规则生成新规则: If this event type occurs raise an alert. If this event type occurs more than 3 times in a 5-minute interval, raise an alert. 同时,我将每个传入的数据保存到Cassandra。我喜欢做的是运行这个流媒体应用程序,从Cassandra获取历史数据。比如说, <
If this event type occurs raise an alert.
If this event type occurs more than 3 times in a 5-minute interval, raise an alert.
同时,我将每个传入的数据保存到Cassandra。我喜欢做的是运行这个流媒体应用程序,从Cassandra获取历史数据。比如说,
<This rule> would have generated <these> alerts for <last week>.
将为生成警报。
有没有办法在Spark或路线图中做到这一点?例如,ApacheFlink具有事件时间处理功能。但是将现有的代码库迁移到it似乎很难,我想通过重用现有代码来解决这个问题。这相当简单,但有一些警告。首先,它有助于从卡夫卡的角度理解这一点 Kafka管理所谓的偏移量——Kafka中的每条消息都有一个相对于其在分区中位置的偏移量。(分区是主题的逻辑分区。)分区中的第一条消息的偏移量为
0L
,第二条消息的偏移量为1L
等。但由于日志滚动和可能的主题压缩,0L
并不总是分区中最早的偏移量
您必须做的第一件事是从一开始就收集所有要读取的分区的偏移量。这里有一个函数可以实现这一点:
def getOffsets(consumer: SimpleConsumer, topic: String, partition: Int) : (Long,Long) = {
val time = kafka.api.OffsetRequest.LatestTime
val reqInfo = Map[TopicAndPartition,PartitionOffsetRequestInfo](
(new TopicAndPartition(topic, partition)) -> (new PartitionOffsetRequestInfo(time, 1000))
)
val req = new kafka.javaapi.OffsetRequest(
reqInfo, kafka.api.OffsetRequest.CurrentVersion, "test"
)
val resp = consumer.getOffsetsBefore(req)
val offsets = resp.offsets(topic, partition)
(offsets(offsets.size - 1), offsets(0))
}
你可以这样称呼它:
val (firstOffset,nextOffset) = getOffsets(consumer, "MyTopicName", 0)
有关从卡夫卡检索偏移量的所有信息,。至少可以说,这很神秘。(例如,当您完全理解PartitionOffsetRequestInfo
的第二个参数时,请告知我。)
现在您已经有了要历史查看的分区的firstOffset
和lastOffset
,然后使用createDirectStream
的fromOffset
参数,该参数的类型为:fromOffset:Map[TopicAndPartition,Long]
。您可以将Long
/值设置为从getoffset()
获得的firstOffset
至于nextofset
——当您从处理历史数据转移到新数据时,您可以使用它来确定流中的数据。如果msg.offset==nextofset
,则您正在处理分区内的第一条非历史记录
现在,关于注意事项,请直接:
- 一旦启动了上下文,就不能进行新的流计算 设置或添加到它
- 一旦上下文被停止,它就不能被删除 重新启动
- 在同一时间,JVM中只能有一个StreamingContext处于活动状态 同时
- StreamingContext上的stop()也会停止SparkContext。到 仅停止StreamingContext,设置stop()的可选参数 将stopSparkContext调用为false
- SparkContext可以重新用于 创建多个StreamingContext,只要上一个 StreamingContext已停止(不停止SparkContext) 在创建下一个StreamingContext之前
正是由于这些注意事项,我在获取
nextofset
的同时获取了firstOffset
——因此我可以保持流向上,但将上下文从历史处理更改为当前处理。感谢您提供的详细答案。我已经读过了,以后还会再读一遍,以便更好地理解它。同时,我使用Spark滑动窗口
按时间计数。我怎样才能做到这一点?