2015-11-21 16 views
0

将RDD内容批量处理成大约100MB的文本文件的最佳方法是什么? dstream.foreachRDD似乎只允许按RDD进行处理,并且不让我累积RDD直到达到一定的大小。将DStreams批量输出到外部系统

也许我错过了一些东西。 Apache火花流概念对我来说还是很新颖和陌生的。我想制作一个流媒体应用程序,将来自kafka的数据,批量消息转换为大文件,然后在线上传。

相关问题:dstream.foreachRDD运行在驱动器应用FUNC,根据文档。这是否意味着我只能在火花集群中有一个节点执行所有上传?这并不意味着我会严重网络I/O上限?

foreachRDDFUNC

到每个RDD从流生成应用一个函数,FUNC,最通用的输出操作。此功能应将每个RDD中的数据推送到外部系统,例如将RDD保存到文件,或通过网络将其写入数据库。请注意,函数func在运行流应用程序的驱动程序进程中执行,并且通常会在其中执行RDD操作,这将强制计算流式RDD。

来源:http://spark.apache.org/docs/latest/streaming-programming-guide.html

回答

0

有关使用RDD.union收集每个RDD为基本RDD什么?像这样:

var baseRdd: RDD[String] = sc.emptyRDD 
var chunkSize = 0 
val threshold = 1000000 

dstream.foreachRDD { newRdd => 
    baseRdd = baseRdd.union(newRdd) 
    chunkSize = chunkSize + calculateBatchSize(newRdd) 
    if (chunkSize > threshold) { 
    writeOutRdd(baseRdd) 
    baseRdd = sc.emptyRDD 
    chunkSize = 0 
    } 
} 
+0

谢谢。 writeOutRdd函数是否会在驱动程序进程或工作进程中执行? – user3385082