0. StreamingContext 的创建过程解析
1.直接上代码
1 | 1> 典型的创建方法 |
一. DStream 源码解析
1 | // RDDs generated, marked as private[streaming] so that testsuites can access it |
总结:
- Spark Streaming是一个基于Spark Core之上的实时计算框架,可以从很多数据源消费数据并对数据进行处理
- 在Spark Streaing中有一个最基本的抽象叫DStream(代理),本质上就是一系列连续的RDD,DStream其实就是对RDD的封装
- DStream可以认为是一个RDD的工厂,该DStream里面生产都是相同业务逻辑的RDD,只不过是RDD里面要读取数据的不相同
- 深入理解DStream: 他是sparkStreaming中的一个最基本的抽象,代表了一下列连续的数据流,本质上是一系列连续的RDD,你对DStream进行操作,就是对RDD进行操作
- DStream每隔一段时间生成一个RDD,你对DStream进行操作,本质上是对里面的对应时间的RDD进行操作
- DSteam和DStream之间存在依赖关系,在一个固定的时间点,对个存在依赖关系的DSrteam对应的RDD也存在依赖关系,
- 每个一个固定的时间,其实生产了一个小的DAG,周期性的将生成的小DAG提交到集群中运行
二. Spark Streaming & Kafka 连接的2种方式
Receiver-based
基于 Receiver 的wordcount 代码
主要是 直接使用 高级 api KafkaUtils.createStream
1 | package com.rox.spark.scala |
Direct Approach 直连
区别
- Receiver 接收固定时间间隔的数据(放在内存中的), 使用 Kafka 高级 API, 自动维护偏移量, 数据达到固定时间才进行处理, 效率低并且 容易丢失数据
- 直接把偏移量记录到了 zk 当中, 但是效率低, 先拉数据, 拉到一定的时间再处理, 这样就有可能数据溢出, 为了保证数据不溢出, 就有一个 WALS 的机制(write ahead logs), 会把溢出的数据写入到 hdfs 中 , 效率低
Direct 直连方式, 相当于直接链接到 Kafka 的分区上, 使用 Kafka 底层的 API, 效率高, 需要自己维护偏移量
- 直连方式, 就是一个迭代器, 变读边计算, 使用了 kafka 底层的 api, 直接连到了kafka 的分区文件上, 效率更高
receiver 接受数据是在Executor端 cache
- 如果使用的窗口函数的话,没必要进行cache, 默认就是cache, WAL ;
- 如果采用的不是窗口函数操作的话,你可以cache, 数据会放做一个副本放到另外一台节点上做容错
- direct直连方式, 接受数据是在Driver端
SparkStreaming 直连 kafka 代码
另外一版本见, 主要是有个地方用的transform
, 区别不大
1 | package com.rox.spark.scala |
注意点:
RDD 的分区 & Kafka 的分区
- Kafka 的分区是物理的
- Rdd 的分区是抽象的
- Rdd 的分区 与 Kafka 的分区是 一一对应的
updateByKey 代码
1 | package com.rox.spark.scala |
三. 数据累加的方式
1.. 使用 updateByKey
见上面代码, 需要设置一个处理的函数, 需要设置 checkPoint
, 不如直接在数据库中累加 和查询的方便