spark 学习3

spark2.0 入口改为 sparkSession  val spark=SparkSession.builder().appNmae().master().getOrCreate()

val context=spark.SparkCOntext

struct streaming 是spark 2.3新引入的一个概念用来对标flink,看了两天flink,感觉没有saprk的api用这爽,可能因为我比较菜吧,领会不到阿里大佬们的精髓,一个低延时 exactly once end-end 的概念continues processing 对标flink的continue query,保证1 millsecond的延时还是看好spark ,spark大法好,

val sc=spark.SparkContext
val ssc=StreamingContext(sc,seconds(5))

val spark=SparkSession.builder.appName("xxx").getOrCreate()

import saprk.implicits._

val lines=spark.readStream.format("socket").option("host","localhost").option("port",9999).load()

val words=lines.as[String].flatMap()_.split(" ")

val wordCounts=words.groupBy("value").count()

val query=wordCounts.writeStream.outputMode("complete").format("console").start()

query.awaitTermination()

struct streaming的核心观念是将 实时数据看作是一张不断增加数据的表,和flink的table&sql api观念一样,flink采用的是calcite ,flink底层采用的saprk sql引擎

Stream as a Table

意思就是新加入每条数据都是无界表的新的一行,这个概念不错

感觉和flink非常相似 输入 处理 sink structstreaming有三种模式

complete mode将结果完全输出出去

append mode

update mode

spark处理事件时间:将时间event-time作为dynamic table的value,对于late data spark会update result table spark2.1也引入了和 flink一样的watermarks来处理late data 可以指定清理 old data time

struct streaming 容错保证:假设每一个流有类似与kafka offest偏移量的东西,用来查看消费记录,ss engine用checkpoint和wal来记录每一次每一次消费的记录,

structStreaming 先在这里简称 SSing

rdd是不可变的,可以用 transformation 修改rdd,但是这个返回的是一个全新的rdd,而原来rdd仍然保持不变

对于late data SSing  结构化流可以在很长一段时间内维护部分聚合的中间状态,以便后期数据可以正确更新旧窗口的聚合

而flink采用watermarks来触发计算乱续数据

在SSing中采用watermarks来处理老旧的中间状态,因为这个状态存储在内存中,不能一直无限变大,

import spark.implicits._

val words = ... // streaming DataFrame of schema { timestamp: Timestamp, word: String }

val windowCounts=words.withWatermark("timestamp","10 minutes") .groupBy(window($"timestamp","10 minutes","5 minutes"),$"word").count() //根据window和word字段进行分组再求和

10 minutes后更新 SSing的内部状态,删除老旧的内部状态,类似于flink watermarks中的容错值,但我感觉spark设计的比较好,在内存中随时更新,等很长时间都无所谓,前提内存足够大,而flink 的watermarks 容错时间默认为3.5秒,如果有数据延迟很久,都没有到那么flink将会把其抛弃,

 private final long maxOutOfOrderness = 3500; // 3.5 seconds

如果提交集群任务,但读取的是本地文件,则要求在每个节点上的相同位置都要有此文件

或者将文件上传到hdfs上 sc.textFile("hdfs://host:9000/xxx") 

spark读取csv文件,其实是sparksql读取,会自动转换成dataframe</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值