使用Spark Streaming定期保留计算结果?

时间:2017-08-01 10:43:07

标签: apache-spark spark-streaming aggregation

我正在努力要求根据输入数据计算的一些聚合显示实时仪表板。

我刚刚开始探索Spark / Spark Streaming,我发现我们可以使用微集中的Spark Integration实时计算,并为UI Dashboard提供相同的功能。

我的查询是,如果在Spark Integration作业启动后的任何时间,它会停止/或崩溃,当它出现时,它将如何从它上次处理的位置恢复。我理解Spark维护一个内部状态,我们会为每个收到的新数据更新该状态。但是,当它重新启动时,该状态是否会消失。

我觉得我们可能需要定期持续运行总计/结果,以便在重新启动时通过从那里获取Spark来恢复其处理。但是,不知道如何使用Spark Streaming来做到这一点。

但是,不确定Spark Streaming是否默认确保数据不会丢失,因为我刚开始使用它。

如果有人遇到类似的情况,请您就我如何解决这个问题提出您的想法。

2 个答案:

答案 0 :(得分:1)

要点:

  1. 启用接收器的预写日志
  2. 启用检查点
  3. 详细

    1. 启用WAL:设置spark.streaming.receiver.writeAheadLog.enable true
    2. 启用检查点
    3. checkpoint是定期将您的应用状态写入可靠存储。当您的应用程序失败时,它可以从检查点文件中恢复。 要编写检查点,请写下:

      ssc.checkpoint("checkpoint.path")
      

      从检查点读取:

      def main(args: Array[String]): Unit = {
          val ssc = StreamingContext.getOrCreate("checkpoint_path", () => createContext())
      
          ssc.start()
          ssc.awaitTermination()
      }
      

      createContext函数中,您应该创建ssc并执行自己的逻辑。例如:

      def createContext(): StreamingContext = {
        val conf = new SparkConf()
          .setAppName("app.name")
          .set("spark.streaming.stopGracefullyOnShutdown", "true")
      
        val ssc = new StreamingContext(conf, Seconds("streaming.interval"))
        ssc.checkpoint("checkpoint.path")
      
        // your code here 
      
        ssc
      }
      

      以下是有关如何部署火花串流应用程序的必要步骤的文档,包括从驱动程序/执行程序故障中恢复。

      https://spark.apache.org/docs/1.6.1/streaming-programming-guide.html#deploying-applications

答案 1 :(得分:0)

Spark Streaming充当消费者应用程序。实时地,从Kafka主题中提取数据,您可以在其中存储数据在某些数据存储中的偏移量。如果您正在从Twitter流中读取数据,情况也是如此。您可以按照以下帖子存储偏移量,如果应用程序崩溃或重新启动。

http://aseigneurin.github.io/2016/05/07/spark-kafka-achieving-zero-data-loss.html

https://www.linkedin.com/pulse/achieving-exactly-once-semantics-kafka-application-ishan-kumar