Spark Streaming 快速入门系列(6) | DStream的几种保存方式(转载)

大家好,我是不温卜火,是一名计算机学院大数据专业大二的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只有csdn这一个平台,博客主页:https://buwenbuhuo.blog.csdn.net/

本片博文为大家带来的是DStream的几种保存方式。
1
目录

  1. 保存到文本文件
  2. 保存到Mysql (第一种写法)
  3. 保存到Mysql (第二种写法)
    2
    关于这部分我们还可以通过查看官方文档实现:
    http://spark.apache.org/docs/2.1.1/streaming-programming-guide.html#transformations-on-dstreams

输出操作指定了对流数据经转化操作得到的数据所要执行的操作(例如把结果推入外部数据库或输出到屏幕上)。

与RDD中的惰性求值类似,如果一个DStream及其派生出的DStream都没有被执行输出操作,那么这些DStream就都不会被求值。如果StreamingContext中没有设定输出操作,整个context就都不会启动。

下列为输出操作的方法与解释
3
注意:

连接不能写在driver层面(序列化);
如果写在foreach则每个RDD中的每一条数据都创建,得不偿失;
增加foreachPartition,在分区创建(获取)。

  1. 保存到文本文件
  2. 源码
    package com.buwenbuhuo.spark.streaming.day02.output

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

/**
*

  • @author 不温卜火
  • @create 2020-08-12 20:45
  • MyCSDN : https://buwenbuhuo.blog.csdn.net/

*/
object OutDemo1 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName(“OutDemo1”).setMaster(“local[2]”)
val ssc = new StreamingContext(conf, Seconds(3))

ssc.checkpoint("ck1")
ssc
  .socketTextStream("hadoop002",9999)
  .flatMap(_.split("\\W+"))
  .map((_,1))
  .reduceByKey(_+_)
    .saveAsTextFiles("world","log")

ssc.start()
ssc.awaitTermination()

}
}

  1. 打开端口进行测试
    nc -lk 9999
    1
    4

  2. 运行结果
    5
    6

  3. 保存到Mysql (第一种写法)

  4. 源码
    package com.buwenbuhuo.spark.streaming.day02.output

import java.util.Properties

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

/**
*

  • @author 不温卜火
  • @create 2020-08-12 21:45
  • MyCSDN : https://buwenbuhuo.blog.csdn.net/

*/
object OutDemo2 {
val props: Properties = new Properties()
props.setProperty(“user”,“root”)
props.setProperty(“password”,“199712”)

def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName(“OutDemo2”).setMaster(“local[2]”)
val ssc = new StreamingContext(conf, Seconds(3))

ssc.checkpoint("ck3")
ssc
  .socketTextStream("hadoop002",9999)
  .flatMap(_.split("\\W+"))
  .map((_,1))
  .reduceByKey(_+_)
    .foreachRDD(rdd =>{
      // 把rdd转成df
      // 1. 先创建sparkSession
      val spark: SparkSession = SparkSession.builder()
        .config(rdd.sparkContext.getConf)
        .getOrCreate()
      import spark.implicits._
      // 2. 转换
      val df: DataFrame = rdd.toDF("word","count")

      // 3. 写
      df.write.mode("append").jdbc("jdbc:mysql://hadoop002:3306/rdd","window0812",props)

    })

ssc.start()
ssc.awaitTermination()

}
}

  1. 运行与写入数据

  2. 查看结果

  3. 保存到Mysql (第二种写法)

  4. 源码
    package com.buwenbuhuo.spark.streaming.day02.output

import java.util.Properties

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

/**
*

  • @author 不温卜火
  • @create 2020-08-12 22:45
  • MyCSDN : https://buwenbuhuo.blog.csdn.net/

*/
object OutDemo3 {
val props: Properties = new Properties()
props.setProperty(“user”,“root”)
props.setProperty(“password”,“199712”)

def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName(“OutDemo3”).setMaster(“local[2]”)
val ssc = new StreamingContext(conf, Seconds(3))

ssc.checkpoint("ck3")
ssc
  .socketTextStream("hadoop002",9999)
  .flatMap(_.split("\\W+"))
  .map((_,1))
  .updateStateByKey((seq:Seq[Int],opt:Option[Int]) => Some(seq.sum + opt.getOrElse(0)))
    .foreachRDD(rdd =>{
      // 把rdd转成df
      // 1. 先创建sparkSession
      val spark: SparkSession = SparkSession.builder()
        .config(rdd.sparkContext.getConf)
        .getOrCreate()
      import spark.implicits._
      // 2. 转换
      val df: DataFrame = rdd.toDF("word","count")

      // 3. 写
      df.write.mode("overwrite").jdbc("jdbc:mysql://hadoop002:3306/rdd","window0813",props)

    })

ssc.start()
ssc.awaitTermination()

}
}

  1. 运行

  2. 运行结果、

原文链接:https://blog.csdn.net/qq_16146103/article/details/107975540?utm_medium=distribute.pc_feed.none-task-blog-vip_agree_hot-1.nonecase&depth_1-utm_source=distribute.pc_feed.none-task-blog-vip_agree_hot-1.nonecase

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值