[Spark]-Streaming-输出

 

  输出操作允许将 DStream 的数据推送到外部系统, 如数据库或文件系统. 由于输出操作实际上允许外部系统使用变换后的数据, 所以它们触发所有 DStream 变换的实际执行(类似于RDD的Action)

  Spark Streaming 定义了如下输出操作

  print() 在运行流应用程序的 driver 节点上的DStream中打印每批数据的前十个元素

  saveAsTextFiles(prefix, [suffix]) 将此 DStream 的内容另存为文本文件. 每个批处理间隔的文件名是根据 前缀 和 后缀 生成: "prefix-TIME_IN_MS[.suffix]" 

  saveAsObjectFiles(prefix, [suffix])  将此 DStream 的内容另存为序列化 Java 对象的 SequenceFiles.文件名规则同saveAsTextFiles.

  saveAsHadoopFiles(prefix, [suffix]) 将此 DStream 的内容另存为 Hadoop 文件.文件名规则同saveAsTextFiles.

  foreachRDD(func)  对从流中生成的每个 RDD 使用函数 func 的输出. 此功能应将每个 RDD 中的数据推送到外部系统,

 

  foreachRDD(func)详解:

    dstream.foreachRDD 是一个强大的函数,依靠foreachRDD 可以将计算结果按自定义的方式输出.如输出到RDBMS等等.

    注意:

      函数 func 在运行流应用程序的 driver 进程中执行.

         i).这代表foreachRDD 将强制流式传输 RDD 的计算

        ii).这代表foreachRDD 不能使用闭包之外的变量.因为executor不是foreachRDD 真正的执行者

        iii).这代表foreachRDD 里的执行是有一定lazy性质的.因为是传输到driver 之后,才会真正执行

        iv).默认情况下,输出执行是一次一个(one-at-a-time),将按照应用程序定义的顺序执行  

        一个将dstream保存到外部数据库的Demo   

      dstream.foreachRDD { rdd =>
        rdd.foreachPartition { partitionOfRecords =>
           val connection = createNewConnection()
           partitionOfRecords.foreach(record => connection.send(record))
           connection.close()
         }
      }

 

posted @ 2018-07-10 23:22  NightPxy  阅读(503)  评论(0编辑  收藏  举报