Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 火花流重播_Apache Spark_Cassandra_Spark Streaming_Apache Flink - Fatal编程技术网

Apache spark 火花流重播

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获取历史数据。比如说, <

我有一个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获取历史数据。比如说,

<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
滑动窗口
按时间计数。我怎样才能做到这一点?