如何在Spark中运行连续批处理

时间:2018-05-16 16:07:31

标签: apache-spark spark-streaming etl spark-structured-streaming

我已经尝试过spark批处理API和spark结构化流API,但我仍然很新,并想知道如何实现接近实时维度表。

我有一个用例,用于近乎实时地更新类型二维表(约10分钟滞后)。它要求最后一个作业的输出作为新作业的输入。我的方法是运行一个连续的批处理spark作业,一旦完成所有转换步骤就从头重新开始,而不是以成功状态退出。它类似于流式传输作业,但在内部运行批处理并阻塞(即,没有读取或处理新数据,最后读取的数据被合并到最终维度表中)。可能吗?

1 个答案:

答案 0 :(得分:0)

在单个Spark运行中执行所有操作是必需的吗?我的意思是,你想创建一个集群并按顺序执行相同的数据处理,当一个终止时,启动另一个?

相反,您可以使用编排工具作为支持按顺序执行任务的Apache Airflow,您可以查看https://airflow.apache.org/code.html并搜索“depends_on_past”。只有当它的前任终止时它才会执行下一个任务。

其他解决方案可能是使用10分钟的翻滚窗口运行的Spark流媒体作业,并将前一任务的输出作为输入。但要确保你有足够的记忆力来在10分钟内保存这些物品。

======================================

编辑:

在阅读@Stella的评论之后,我最终得到了我的初始提案的新版本。但由于我不知道你的数据源和接收器是什么,我做了一些基于RDBMS(H2)的基本版本和本地存储的文本文件。

因此,在数据库中,我添加了一个列,用于存储我们想要在每次迭代中获取的行的版本。我还添加了一个列来处理分区(它必须是数字,我写了一篇关于这里的帖子:http://www.waitingforcode.com/apache-spark-sql/partitioning-rdbms-data-spark-sql-jdbc/read)。 现在它的工作原理如下:

  • Apache Spark Structured Streaming DataFrame读取第一个文件(起始版本)以触发作业
  • 稍后它将与标记为给定版本(Spark SQL,批处理)
  • 的表中的行连接起来
  • 最后它将新的列添加到数据库中,并使用新版本来获取 - 但它也可以在适当的位置更新

enter image description here

我写了一个简单的插图代码并推送到我的Github:https://github.com/bartosz25/spark-scala-playground/blob/master/src/test/scala/com/waitingforcode/stackoverflow/FeedbackOutputIntoInputSparkTest.scala

代码包含一个“简化”版本,在单独的查询中写入每一行。我不确定它是否可以正确扩展,你应该更喜欢批处理SQL操作。