将RDD内容批量处理为大约100MB的文本文件之后,将上传到S3的最佳方法是什么? dstream.foreachRDD 似乎只允许每个RDD处理,并且不允许我累积RDD直到一定大小。
也许我错过了什么。 Apache火花流概念对我来说仍然是一个新的和不熟悉的。我想制作一个流媒体应用程序,将来自kafka的数据,批处理消息转换为大文件,然后在线上传。
相关问题:根据文档, dstream.foreachRDD 在驱动程序应用程序上运行 func 。这是否意味着我只能在spark集群中有一个节点执行所有上传?这是不是意味着我将成为网络I / O上限?
foreachRDD ( FUNC )
最通用的输出运算符,它将函数func应用于从流生成的每个RDD。此函数应将每个RDD中的数据推送到外部系统,例如将RDD保存到文件,或通过网络将其写入数据库。请注意,函数func在运行流应用程序的驱动程序进程中执行,并且通常会在其中执行RDD操作,这将强制计算流式RDD。
来源:http://spark.apache.org/docs/latest/streaming-programming-guide.html
答案 0 :(得分: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
}
}