Spark从入门到精通(六)--SparkStreaming

SparkStreaming

SparkStreaming是流式处理框架,是Spark API的扩展,支持可扩展、高吞吐量、容错的实时数据流处理,实时数据的来源可以是:Kafka, Flume, Twitter, ZeroMQ或者TCP sockets,并且可以使用高级功能的复杂算子来处理流数据。

Flink & Storm & SparkStreaming 区别:

Strom:纯实时处理数据,吞吐量小 --水龙头滴水
SparkStreaming : 准实时处理数据,微批处理数据,吞吐量大 --河道中开闸关闸
Flink:纯实时处理数据,吞吐量大 --河流远远不断
在这里插入图片描述

val session = SparkSession.builder.appName("sparkstreaming").master("local[3]").getOrCreate()
    val streamingContext = new StreamingContext(session.sparkContext, Durations.seconds(5))
    val ds1: ReceiverInputDStream[String] = streamingContext.socketTextStream("node14", 9999)
    val dStream: DStream[(String, Int)] = ds1.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_)
    dStream.print()
    streamingContext.start()
    streamingContext.awaitTermination()
    streamingContext.stop()
foreachRDD 注意事项

1.foreachRDD中可以拿到DStream中的RDD,对RDD进行操作,但是一点要使用RDD的action算子触发执行,不然DStream的逻辑也不会执行
2.froeachRDD算子内,拿到的RDD算子操作外,这段代码是在Driver端执行的,可以利用这点做到动态的改变广播变量

result.foreachRDD(wordCountRDD=>{
  println("******* produce in Driver *******")
  val sortRDD: RDD[(String, Int)] = wordCountRDD.sortByKey(false)
  val result: RDD[(String, Int)] = sortRDD.filter(tp => {
    println("******* produce in Executor *******")
    true
  result.foreach(println)
})     

updateStateByKey:对之前的数据进行汇总统计

streamingContext.checkpoint("./data/ck")
val ds1: ReceiverInputDStream[String] = streamingContext.socketTextStream("node14", 9999)
val pairWords: DStream[(String, Int)] = ds1.flatMap(_.split(" ")).map((_, 1))
/**
  * currentValue :当前批次某个 key 对应所有的value 组成的一个集合
  * preValue : 以往批次当前key 对应的总状态值
  */
val result: DStream[(String, Int)] = pairWords.updateStateByKey((currentValue: Seq[Int], preValue: Option[Int]) => {
  var totalValue = preValue.getOrElse(0)
  for (v <- currentValue) {
    totalValue += v
  }
  Option(totalValue)
})
result.print()
streamingContext.start()
streamingContext.awaitTermination()

reduceByKeyAndWindow:窗口函数

//没有优化的窗口函数
//第一个参数:处理的函数(v1:Int,v2:Int)=>{v1+v2}
//第二个参数:窗口长度
//第三个阐述:滑动间隔
val result: DStream[(String, Int)] = pairWords.reduceByKeyAndWindow(
      (v1:Int, v2:Int)=>{v1+v2}, Durations.seconds(15), Durations.seconds(5))
    result.print()
//优化的窗口函数(会将状态保存)
//第一个参数:加上新增的(v1:Int,v2:Int)=>{v1+v2}
//第二个参数:减去过期的(v1:Int,v2:Int)=>{v1-v2}
//第三个参数:窗口长度
//第四个阐述:滑动间隔
val result2: DStream[(String, Int)] = pairWords.reduceByKeyAndWindow(
  (v1:Int, v2:Int)=>{v1+v2}, (v1:Int, v2:Int)=>{v1-v2},
  Durations.seconds(15), Durations.seconds(5))
result2.print()

transform:进入一个RDD,返回一个RDD

val transformRDD = lines.transform(rdd => {
  println("------------即将执行filter-----------")
  val transformRDD: RDD[String] = rdd.filter(line => {
    println("####执行filter####")
    !"zhangsan".equals(line.split(" ")(1))
  })
  transformRDD.map(line => {
    (line.split(" ")(1), 1)
  })
})
SparkStreaming监控目录
val streamingContext: StreamingContext = new StreamingContext(conf, Durations.seconds(5))
streamingContext.sparkContext.setLogLevel("error")
streamingContext.checkpoint("./data/ck")
val lines: DStream[String] = streamingContext.textFileStream("./data/copyStreamingFile")
val pairRDD = lines.flatMap(line => {
  line.trim.split(" ")
}).map((_, 1))
val result: DStream[(String, Int)] = pairRDD.reduceByKeyAndWindow((v1: Int, v2: Int) => {
  v1 + v2
}, (v1: Int, v2: Int) => {
  v1 - v2
},
  Durations.seconds(15), Durations.seconds(5))
result.print()
Driver HA

第一:提交任务层面,在提交任务的时候加上选项 --supervise,当Driver挂掉的时候会自动重启Driver。
第二:代码层面

//若能获取回来StreamingContext,就不会执行CreateStreamingContext这个方法创建,否则就会创建
//这个方法首先会从ckDir目录中获取StreamingContext【 因为StreamingContext是序列化存储在Checkpoint目录中,恢复时会尝试反序列化这些objects。
//如果用修改过的class可能会导致错误,此时需要更换checkpoint目录或者删除checkpoint目录中的数据,程序才能起来
val streamingContext = StreamingContext.getOrCreate(ckDir, createStreamingContext)
streamingContext.start()
streamingContext.awaitTermination()
streamingContext.stop()
def createStreamingContext()={
  println("=======Create new StreamingContext =======")
  val conf = new SparkConf()
  conf.setMaster("local")
  conf.setAppName("DriverHA")
  val streamingContext: StreamingContext = new StreamingContext(conf,Durations.seconds(5))
  streamingContext.sparkContext.setLogLevel("Error")
  /**
    *   默认checkpoint 存储:
    *     1.配置信息
    *    2.DStream操作逻辑
    *    3.job的执行进度
    *     4.offset
    */
  streamingContext.checkpoint(ckDir)

Spark优化: https://blog.csdn.net/happiless/article/details/107308772

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值