DStream输出之使用foreachRDD()将数据写入诸如Mysql的外部数据库中

前言

输出操作指定了对流数据经转化操作得到的数据所要执行的操作(例如把结果推入外部数据库或输出到屏幕上)。与RDD中的惰性求值类似,如果一个DStream及其派生出的DStream都没有被执行输出操作,那么这些DStream就都不会被求值。如果StreamingContext中没有设定输出操作,整个context就都不会启动。

常用输出操作

当前,定义了以下输出操作:

输出操作 含义
print() 在运行流程序的驱动结点上打印DStream中每一批次数据的最开始10个元素。这用于开发和调试。在Python API中,同样的操作叫print()。
saveAsTextFiles(prefix, [suffix]) 以text文件形式存储这个DStream的内容。每一批次的存储文件名基于参数中的prefix和suffix。”prefix-Time_IN_MS[.suffix]”。
saveAsObjectFiles(prefix, [suffix]) 以Java对象序列化的方式将Stream中的数据保存为 SequenceFiles . 每一批次的存储文件名基于参数中的为"prefix-TIME_IN_MS[.suffix]". Python中目前不可用。
saveAsHadoopFiles(prefix, [suffix]) 将Stream中的数据保存为 Hadoop files. 每一批次的存储文件名基于参数中的为"prefix-TIME_IN_MS[.suffix]"。
foreachRDD(func) 这是最通用的输出操作,即将函数 func 用于产生于 stream的每一个RDD。其中参数传入的函数func应该实现将每一个RDD中数据推送到外部系统,如将RDD存入文件或者通过网络将其写入数据库。注意:函数func在运行流应用的驱动中被执行,同时其中一般函数RDD操作从而强制其对于流RDD的运算。

本篇文章主要讲通用的输出操作foreachRDD(func),dstream.foreachRDD()是一个强大的原语,可以将数据发送到外部系统。它用来对DStream中的RDD运行任意计算。这和transform() 有些类似,都可以让我们访问任意RDD。在foreachRDD()中,可以重用我们在Spark中实现的所有行动操作。

比如,常见的用例之一是把数据写到诸如MySQL的外部数据库中。(注意连接不能写在driver层面,在driver层面则只随main函数执行一次,不能实现数据的实时处理保存);

案例

本人使用的是IDEA工具来创建Maven项目完成代码操作

准备工作

  1. linux系统已导入mysql-connector-java-5.1.47-bin.jar包
  2. 本地mysql对应的数据库sparksqltest及表格data已经建好
  3. 采集数据的指定端口为linux,对应IP和端口号9999
  4. netcat工具已经下载并打开nc -l -p 9999

以下为具体代码实现:

package com.spark.streaming

import java.sql.{
   Connection, DriverManager
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据写入MySQL是常见的Spark Streaming数据处理过程之一。下面是一个简单的示例,演示如何将Spark Streaming处理后的数据写入MySQL数据库。 ```scala import java.sql.{Connection, DriverManager, PreparedStatement} // 定义一个函数,用于将数据写入MySQL def writeToMySQL(iter: Iterator[(String, Int)]): Unit = { var conn: Connection = null var ps: PreparedStatement = null val sql = "insert into wordcount(word, count) values (?, ?)" try { // 获取MySQL连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password") iter.foreach(data => { // 每个分区创建PreparedStatement对象 ps = conn.prepareStatement(sql) ps.setString(1, data._1) ps.setInt(2, data._2) ps.executeUpdate() }) } catch { case e: Exception => e.printStackTrace() } finally { // 关闭连接和PreparedStatement对象 if (ps != null) { ps.close() } if (conn != null) { conn.close() } } } // 创建StreamingContext对象 val ssc = new StreamingContext(sparkConf, Seconds(2)) // 创建DStream对象,从文本文件读取数据 val lines = ssc.textFileStream("hdfs://localhost:9000/data") // 对DStream进行处理 val wordCounts = lines.flatMap(_.split(" ")).map(x => (x, 1)).reduceByKey(_ + _) // 将结果写入MySQL wordCounts.foreachRDD(rdd => { rdd.foreachPartition(iter => { // 每个分区的数据写入MySQL writeToMySQL(iter) }) }) // 启动StreamingContext ssc.start() ssc.awaitTermination() ``` 代码解释: 1. `writeToMySQL` 函数用于将数据写入MySQL。首先获取MySQL连接,然后遍历每个分区的数据,创建 `PreparedStatement` 对象并执行插入操作,最后关闭连接和 `PreparedStatement` 对象。 2. 创建 `StreamingContext` 对象,指定批处理时间间隔为 2 秒。 3. 创建 `DStream` 对象,从文本文件读取数据。 4. 对 `DStream` 进行处理,使用 `flatMap` 和 `map` 函数将每行数据分割成单词并计数。 5. 将结果写入MySQL使用 `foreachRDD` 函数遍历每个RDD,对每个分区的数据调用 `writeToMySQL` 函数进行写入。 6. 启动 `StreamingContext` 并等待处理完成。 希望这个示例能够帮助您了解如何将数据写入MySQL,以及Spark Streaming的基本用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值