SparkStreaming保存数据至MySQL

import java.sql.{Connection, DriverManager, PreparedStatement}

import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}

/**
  * @ClassName: DStreamOutput
  * @Description:
  * @Author: kele
  * @Date: 2021/2/19 9:40
  **/
object DStreamOutput {

  def main(args: Array[String]): Unit = {

    //1、创建StreamingContext
    val ssc = new StreamingContext(new SparkConf().setAppName("output").setMaster("local[4]"),Seconds(5))
    ssc.sparkContext.setLogLevel("error")

    //2、通过socket读取数据
    val ds = ssc.socketTextStream("hadoop102",9999)

    val ds2 = ds.flatMap(_.split(" "))
      .map((_,1))
      .reduceByKey(_+_)

    //3、保存数据
    //本身API
    //ds2.saveAsTextFiles("output/streamoutput")

    ds2.print()
    //数据存储在mysql上
    ds2.foreachRDD(rdd=>{

      //对该rdd的整个批次进行处理,不是对单个元素进行处理
      rdd.foreachPartition(x=>{
 		//连接的相关配置不能在Partitions之外,
        //由于每个executor都要执行该程序,所以连接不能写在Driver层面(序列化)
        var connect:Connection = null
        var statement:PreparedStatement = null

        try{
        //配置连接
          connect = DriverManager.getConnection("jdbc:mysql://hadoop102:3306/test","root","root123")
          //使用preparestatement  1、参数可调,2、可以防止sql注入,3、编译缓存,执行快
          statement = connect.prepareStatement("insert into wordcount values(?,?)")

          //遍历rdd中的数据,将数据保存在mysql上
          x.foreach(y=>{
            statement.setString(1,y._1)
            statement.setInt(2,y._2)

            //提交数据
            statement.executeUpdate()
          })
        }catch{
          case e :Exception=>{
			//此处可以回滚数据
          }
        }finally{
        //关流
          if(connect != null)
            connect.close()
          if(statement != null)
            statement.close()
        }
      })
    })

    //停止
    ssc.start()

    //阻塞
    ssc.awaitTermination()
  }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark Streaming可以通过将数据保存MySQL来持久化处理结果。具体实现可以使用JDBC连接器将结果写入MySQL数据库。示例代码如下: ```scala import java.util.Properties import org.apache.spark._ import org.apache.spark.streaming._ import org.apache.spark.streaming.StreamingContext._ import org.apache.spark.streaming.kafka._ import org.apache.kafka.clients.producer.{KafkaProducer, ProducerRecord} import java.util.Date import java.text.SimpleDateFormat //数据库连接信息 val url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8" val username = "root" val password = "password" val driver = "com.mysql.cj.jdbc.Driver" //连接数据库 val prop = new Properties() prop.setProperty("user", username) prop.setProperty("password", password) prop.setProperty("driver", driver) //动态生成一个连接MySQL的对象 def createConnection() = { Class.forName(driver) DriverManager.getConnection(url, username, password) } //将结果写入MySQL数据库 def saveToMySQL(iterator: Iterator[(String, Long)]) = { val conn = createConnection() val sql = "insert into wordcount(word, count) values (?, ?)" val pstmt = conn.prepareStatement(sql) iterator.foreach { case (word, count) => pstmt.setString(1, word) pstmt.setLong(2, count) pstmt.executeUpdate() } pstmt.close() conn.close() } //创建SparkStreamingContext val conf = new SparkConf().setMaster("local[2]").setAppName("KafkaSparkStreaming") val ssc = new StreamingContext(conf, Seconds(5)) //创建Kafka连接信息 val topics = Set("test") val brokers = "localhost:9092" val kafkaParams = Map[String, String]("metadata.broker.list" -> brokers) //读取Kafka中的数据 val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topics) //进行计算 val lines = messages.map(_._2) val words = lines.flatMap(_.split(" ")) val wordCounts = words.map(x => (x, 1L)).reduceByKey(_ + _) wordCounts.foreachRDD(rdd => { rdd.foreachPartition(iter => saveToMySQL(iter)) }) ssc.start() ssc.awaitTermination() ``` 这是一个Spark Streaming处理Kafka数据并将结果写入MySQL的示例代码。其中,saveToMySQL函数用于将结果写入MySQL,将结果写入MySQL的语句需要根据具体情况而定。注意,此处省略了数据库连接的异常处理,实际应用中应该加入相关的处理逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值