在Spark Streaming中合并微批次

时间:2016-04-26 10:22:24

标签: hdfs apache-kafka spark-streaming

(我对批量火花知之甚少,但没有关于火花流的知识)

问题

我有一个kafka主题Kafka[(A,B)->X],其中(A,B)是关键(A和B是简单的数字类型),X是消息类型,相对较大(Mb的几个)。抛开输入失败的问题,数据是网格:对于a中的每个A(a,b)中的所有b都会显示消息B }。此外,b是有序的,我认为我们可以假设一个a的所有消息都将按照b的顺序到达(我知道主题是按此顺序填充的。)

然后我需要处理以下消息:

  1. 一对(几个)函数应用于每封邮件(a,b)->x,输出(a,b)->y
  2. 应在aB->Seq[y]
  3. 所在的邮件aB = {(a,b) for all b in B}上应用一项功能

    (后来有一个传递,其中消息需要“转置”以在所有a上进行处理,但这不是问题)

    问题

    如何从步骤1到步骤2实现这样的消息合并?

    它看起来像是子键a上的一个组,但根据我的理解,方法groupby将按照微批量应用。我需要的是,对于每个a,等待收到所有b(假设一个简单的计数系统可以工作)。再次将丢失的b和输入数据中的错误放在一边。

    一些想法

    如果没有知识,我会尝试通过附加到hdfs文件(每个文件一个)来查看是否可以实现这种合并。并尝试在完成后对这些文件触发第二个流处理。即当它包含所有b时,将文件移动到第2步的输入目录。但是:

    1. 我不知道这种附加是否可以在hdfs上实现
    2. 两个sparkStreamingContext需要并行运行,每个步骤一个。这似乎是一个问题(?)。
    3. 我明白通过hdfs会破坏spark(流媒体)的“一次性”属性

1 个答案:

答案 0 :(得分:1)

您可以创建主RDD,并将流生成的微型RDD与RDD.union合并到主服务器。类似的东西:

var masterRDD: RDD[(Long,Long), String] = sc.emptyRDD  // guessing on RDD type

myStream.foreachRDD(rdd => {
  if (! rdd.isEmpty) {
    masterRDD.union(rdd)

    masterRDD.groupBy(...).....
  }
})

你也应该花一些时间和 read up 来检查点,特别是:

  

数据检查点 - 将生成的RDD保存到可靠的存储中。   这在组合数据的某些有状态转换中是必需的   跨多个批次。在这种转换中,生成的RDD   依赖于先前批次的RDD,这导致了长度   依赖链随着时间的推移而不断增加。避免这种无限制   恢复时间增加(与依赖链成比例),   有状态变换的中间RDD是周期性的   检查点到可靠的存储(例如HDFS)以切断依赖性   链。