hadoop-Spark流:如何使用多个 job输入进行处理?


0

输入1:KV数据流。

2 答案


0

如果我理解正确:

    K是你通过 streaming job从***DStream获得的RDD。我不知道你的数据来源。这个数据基本上是一个 array/seq/ key列表。

为此,最好的策略是对传入RDD和静态RDD使用 join操作,两个RDD使用相同的分区器进行分区。如果其中一个数据RDD比另一个小得多,您可以探索广播较小的数据RDD。我最近在我的项目中尝试了这一点,并在post中分享了经验:加入RDD的随机分区行为

Edit:由于您希望处理 keyK(假设K=Set{K1,K2…Kn}),在分区中使用StaticRDD,因此我建议采用如下方法。我还没有检查语法和正确性,但你会明白的。

val kRddBroadcastVar = .... // broadcasted variable 
val keyValRDD = staticRDD.mapPartitions {   
       iter => transformKRddToTuple2Events(iter, kRddBroadcastVar )
     }

def transformKRddToTuple2Events( iter: Iterator[Object], kRddBroadcastVar: List[KeyObjectType] ) : Iterator[(keyObjectType, valueObjectType )] {
val staticList = iter.toList
val toReturn = kRddBroadcastVar.map ( k => getKeyValue(k, staticList) )
toReturn.iterator
}

val outRdd = keyValRDD.reduceByKey( _ + _ )

如果这是有意义的,标记这个答案接受。


0

静态RDD是否足够小,可以缓存。在这种情况下,Spark将尝试在这些节点上运行流任务。但这并不能保证。

如果参考数据很小,为什么不广播 DataSet 呢。

我们一直在尝试解决数据存储SnappyData(http://www.snappydata.io/),其中数据位置为一等公民。


我来回答

写文章

提问题

面试题