Spark Streaming
StreamingContext: scc
-a. 实时处理流式数据框架
Apache Spark框架中一个模块
-b. 按照时间间隔将流式数据划分为很多批次batch
每批次数据进行处理,底层属于SparkCore中RDD处理
batchInterval
-c. 数据结构
DStream:
离散的流、分离的流
DStream = List<RDD>
-d. 处理数据流程:
-i. 数据源
从哪里接收实时流式数据
kafka/Flume/Tcp Socket
-ii. 数据处理
业务并不复杂:
- 统计类型的数据分析
- 在线机器学习
D -> A -> M, 依据模型实时预测推荐
transformation 转换函数
将DStream转换为另为一个DStream
大部分函数与RDD中转换函数一样
尽量使用transform函数进行数据处理操作:针对每批次RDD操作的
-iii. 存储结果
针对每批次处理RDD的结果进行输出操作
DStream#output
输出函数: foreachRDD(rdd => {
// .....
})
输出地方:
Console(测试)、Redis、HBase、RDBMS
1、 Streaming运行在Driver端(底层是SparkContext)
2、 Receive运行在Excutor上面
3、 SparkContext让Receiver 以task的形式运行在Excutor上面
4、 每个接收输入流然后将它们划分(按照时间间隔 默认200ms)为很多块
比如:1s可以划分为5个block,相当于rdd中的五个分区
5、 Excutor讲block放到内存中去
注意:为什么要设置3个线程
针对SparkStreaming开发测的时候,设置本地模式运行
--master local[3]
最好设置为3个线程运行,
从Socket 接收数据,需要一个Task运行一个Receiver接收源端数据,占用一个Thread
线程使用。剩余2个Thread,可以并行处理数据Task,分布式计算
blockInterval
Streaming 统计信息
每5秒一个批次,运行了1分2秒,从2018/07/28 09:44:57开始运行(完成了12个批次,接收了
444条数据)
输入流:
接收器:1个接收器
平均接收数据:6.15条/秒
调度延迟时间 + 处理时间 = 总的时间
横向:时间 纵向:接收数据数
调度时间越平就说明性能越好,延迟越低
Scheduling Delay:上一批次没有处理完,处理下一批次数据就得等这时候就产生的延迟
Processing Time:每一批次处理数据的时间
Total Dealy = Scheduling Delay + Processing Time
企业中的性能调优:
Scheduling Delay这条线接越平越好,说明流式计算是实时处理的。
Processing Time < = batchInterval
blockInterval
默认值为200ms, 官方建议最小推荐值为50ms,依据实际情况调整
优化项:
Total Delay(Processing Time) > batchInterval (需要处理)
每批次数据处理的时间 大于 batchInterval时间:
每批次的数据是RDD进行执行计算的,可以增加RDD的分区数,相当于增加Task数目,在资源充分的情况下,增加并行执行的Task数目。
减少blockInterval的值,比如设置为100ms(默认200ms,每一批次1s的话,blockInterval就是分成了10个block也就是10个分区)
总的延迟=调度延迟+处理时间
处理时间<=批处理时间 才不会出现延迟
在大数据集群中会有个别高峰期,这时处理时间会大于批处理时间造成调度延迟(由于资源不足导致的
个别时期数据延迟),
但是这时是可以接受的
注意:在实际开发中业务很简单的,主要是性能的调优,程序出问题能不能快速恢复
Kafka
Kafka 高吞吐量的分布式消息系统,发布订阅的消息系统
消息系统Kafka
- 分布式消息队列(Message Queue)系统
topic: 主题/类别
分区partition -> 设置副本数
- 发布订阅的功能
比喻:
发布者 -> 推送文章
微信公众号:
订阅者1
订阅者2
订阅者3
.....
Kafka官网的三种功能
注意:我们只要了解消息队列系统使用,其他功能不需要掌握
消息队列系统类似于flume的架构模型
点到点的消息队列
一个发布多个订阅的过程(类似于公众号订阅的过程)
一份数据可以给多种接收器订阅:
然后做不的功能(比如推荐系统,机器学习,精准营销…)
1、读写流的数据像消息系统一样
2、0.0.1版以后,通过自带的api可以自己编写一些扩展的流处理应用,接受实时的时间数据
3、存储数据发布订阅的功能
Kafka如何进行数据分区以及存储数据
1、Topic &Partition
存储有三个部分:
1、 偏移量(偏移量越小数据就越老)
2、 Key说的是放到哪个partitions(partition分区器默认hashcode取模进行分区的)
3、 Value消息的值
注意:偏移量越小数据就越旧,偏移量越大数据越新
2 、副本数
不同类型放到不同的Topic中去(下图设置了两个Topic: Topic Click Topic Upload)
三个分区两个副本
3、Kafka原理
分布式的提交日志,将接收日志顺序写到磁盘
1、在kafka中Topic就是用户定义的类别,将消息发布到Topic去
2、Kafka生产者发布信息到一个或多个消费者,消费者订阅者这些数据处理这些发布的数据
3、kafka集群包含一个或多个服务器,称为broker用来管理Topic的分区数据已经持久化数据.
zookeeper 保存的集群配置信息、元数据、多少个Broker、Broker中分区数
比如三台机器选取一个当leader(主节点),其他都是从节点
Zookeeper存放的是Kafka的配置信息和元数据
4、Kafka的安装
1、Kafaka是Scala编写的,所以安装Scala
2、Scala是基于Java虚拟机,所以安装java
3、配置信息和元数据都是放在Zookeper中
Kafka是一个发布订阅的消息系统,作为一个分布式、分区、副本提交日志服务
5、消息队列
消息队列系统代表的就是将转换数据从这个程序发送到另一个程序,
因此程序注重的是数据,而不用担心如何分享它.
点到点的消息队列(一对多) –> 发布订阅的消息队列(一对多)
以前是单机运行系统点对点的系统就可以完成
现在需要一对多的使用,一个数据发布多个Receiver接收(实时统计,推荐系统,算法分析)
6、kafka安装
kafka 下载:
http://archive.apache.org/dist/kafka/
针对SCALA 2.11编译包:
http://archive.apache.org/dist/kafka/0.8.2.1/kafka_2.11-0.8.2.1.tgz
API文档;
http://kafka.apache.org/082/documentation.html
快速安装:
http://kafka.apache.org/082/documentation.html#quickstart
安装java和scale:
安装zookeeper:
安装Kafka伪分布式集群环境:
类似Zookeeper框架分布式安装部署
- 单机模式:standalone
在一台机器上启动有一个JVM进程服务
- 伪分布式模式
在一台机器上启动多个JVM进程服务
启动服务:kafka-server-start.sh
停止服务:kafka-server-stop.sh
查看topic相关信息:kafka-topics.sh
消费者:kafaka-console-consumer.sh
生产者:kafaka-console-producer.sh
Kafka依赖的jar包:可以看出依赖zookeeper和scala中的jar包
Kafka的配置文件:
7、配置server9092、server9093、server9094
broker.id 唯一的标识符
port 端口号
host.name 运行的主机名称
Broker.id = 9092 表示:Broker机器唯一标识符
host.name 如果不设置就绑定到所有的接口上
在kafka中创建三个临时目录用于配置
按照同样的方式配置9093、9094
启动kafka 9092、9093、9094:
启动三个kafka:
创建Topic
zookeeper: 配置信息存放在zookeeper的那台机器上
replication-factor:副本数
partitions:分区数
topic:topic名称
创建后zookeeper中存储的信息
partitions中三个分区两个副本
0:第1分区 两个副本 存放9092 9093
1:第2分区 两个副本 存放9093 9094
2:第3分区 两个副本 存放9094 9092

8、发送数据到Topic
生产数据:
消费数据:
类似于微信公众号,一个发布,多个订阅
zookeeper中存入了每条数据偏移量