Apache spark Spark实时处理一个应用程序中的一个或多个作业

Apache spark Spark实时处理一个应用程序中的一个或多个作业,apache-spark,Apache Spark,我很想知道设计spark流媒体应用程序的最佳实践方法是什么 我们有很多数据源,我们希望通过spark streaming在kafka上接收、清理和转换 处理过程分为3个步骤,产生一个新主题,每个主题都有新的结构,例如原始、标准化和逻辑化 该问题涉及火花蒸汽应用的设计。我有3个选择 每个步骤1个流应用程序,意味着每个源3个运行spark作业 每个源1个流应用程序意味着1个正在运行的spark作业,可为同一源读取和写入多个主题 1个适用于所有源和主题的流媒体应用程序 我的直觉告诉我,选项2是最好的折

我很想知道设计spark流媒体应用程序的最佳实践方法是什么

我们有很多数据源,我们希望通过spark streaming在kafka上接收、清理和转换

处理过程分为3个步骤,产生一个新主题,每个主题都有新的结构,例如原始、标准化和逻辑化

该问题涉及火花蒸汽应用的设计。我有3个选择

  • 每个步骤1个流应用程序,意味着每个源3个运行spark作业
  • 每个源1个流应用程序意味着1个正在运行的spark作业,可为同一源读取和写入多个主题
  • 1个适用于所有源和主题的流媒体应用程序
  • 我的直觉告诉我,选项2是最好的折衷方案,因为选项1会导致太多正在运行的spark作业以及单个作业中太多的复杂性


    然而,让一个单一的工作在管道中完成超过一个步骤实际上是一个好主意吗?如果作业停止或失败,是否会降低可靠性或导致某种类型的数据丢失?

    如评论部分所确认的,流程如下所示:

    sources->step1(原始)->topic1->step2(标准)->topic2->step3(逻辑)->target

    我会将整个流媒体管道保存在一个应用程序中(即您提到的第三个选项)。以下是这种方法的好处:

    • 无需将中间结果(步骤1和步骤2)写入磁盘(卡夫卡主题或文件)。当整个计算都可以在内存中完成时,为什么还要涉及磁盘IO呢。这就是全部
    • 单个应用程序将易于维护。i、 e.所有转换逻辑都可以在单个应用程序中。与为新转换生成新应用程序(步骤)相比,在同一应用程序中添加新转换(步骤)将更容易
    关于您对数据丢失的担忧:

    不太确定基于数据流的流式处理,但对于结构化流式处理,如果流式处理应用程序因任何原因失败,Spark将重新处理最近一批(作业失败)的数据,直到源代码可重放为止。所以不会有数据丢失,但可能会有重复的数据。检查此链接:

    对于基于数据流的流式传输,我相信可以保证零数据丢失。检查此链接:

    然而,我在基于数据流的模型方面没有太多实际操作经验。所以我不会对此发表太多评论


    注意:我假设步骤1和步骤2的中间结果不会被步骤2和步骤3以外的任何其他应用程序或作业使用。如果您必须存储中间结果,那么我们需要重新考虑方法。

    这三个步骤相互关联吗?i、 e.步骤2是否依赖于步骤1?如果第一步失败了,那么你还能处理第二步和第三步吗?好问题,这些步骤是相关的,也就是说,原始数据的输出是标准化的输入,标准化的输入创建了logicalOk的输入,我对流程有点困惑。这是数据流的正确表示吗?“源->步骤1(原始)->主题1->步骤2(标准)->主题2->步骤3(逻辑)->目标”。或者流程中涉及到更多的复杂性?流或结构streaming@vatsalmevada是的,流是正确的,将所有转换逻辑封装到单个应用程序中似乎很方便,但从运行时的角度来看,感觉更脆弱,因为无论何时添加/修改/更新源,实时处理都会受到影响,即使作业完全失败,它也会失败。我同意。这就是为什么我提到假设,如果你使用的是步骤1和步骤2的中间结果。假设所有步骤都有单独的应用程序,步骤1通过,步骤2失败,在这种情况下,您是使用步骤1的输出进行分析查询,还是对其他一些应用程序有用?