(我对批量火花知之甚少,但没有关于火花流的知识)
我有一个kafka主题Kafka[(A,B)->X]
,其中(A,B)
是关键(A和B是简单的数字类型),X是消息类型,相对较大(Mb的几个)。抛开输入失败的问题,数据是网格:对于a
中的每个A
,(a,b)
中的所有b
都会显示消息B
}。此外,b是有序的,我认为我们可以假设一个a
的所有消息都将按照b的顺序到达(我知道主题是按此顺序填充的。)
然后我需要处理以下消息:
(a,b)->x
,输出(a,b)->y
aB->Seq[y]
aB = {(a,b) for all b in B}
上应用一项功能
醇>
(后来有一个传递,其中消息需要“转置”以在所有a上进行处理,但这不是问题)
如何从步骤1到步骤2实现这样的消息合并?
它看起来像是子键a
上的一个组,但根据我的理解,方法groupby将按照微批量应用。我需要的是,对于每个a
,等待收到所有b
(假设一个简单的计数系统可以工作)。再次将丢失的b和输入数据中的错误放在一边。
如果没有知识,我会尝试通过附加到hdfs文件(每个文件一个)来查看是否可以实现这种合并。并尝试在完成后对这些文件触发第二个流处理。即当它包含所有b时,将文件移动到第2步的输入目录。但是:
答案 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)以切断依赖性 链。