输出操作允许将 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() } }