【问题标题】:Batching DStreams Out to External Systems将 DStreams 批量输出到外部系统
【发布时间】:2016-02-23 19:23:05
【问题描述】:

将 RDD 内容批处理为大约 100MB 的文本文件然后上传到 S3 的最佳方法是什么? dstream.foreachRDD 似乎只允许处理每个 RDD,并且不允许我累积 RDD 直到一定大小。

也许我错过了什么。 Apache spark-streaming 概念对我来说仍然很新和不熟悉。我想制作一个流式应用程序,从 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

【问题讨论】:

    标签: apache-spark spark-streaming


    【解决方案1】:

    如何使用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
      }
    }
    

    【讨论】:

    • 谢谢。 writeOutRdd 函数是在驱动进程中执行还是在工作进程中执行?
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2012-10-17
    • 2017-11-06
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多