将DStreams批量输出到外部系统

时间:2015-11-21 08:34:23

标签: apache-spark spark-streaming

将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

1 个答案:

答案 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
  }
}