目录
一、流处理相关概念
1.数据的时效性
2.流处理和批处理
1)批处理
2)流处理
3)流处理与批处理对比
3.流批一体API
二、流批一体编程模型
三、Data-Source
1.预定义的source
1)基于集合的source
2)基于文件的source
3)基于socket的source
2.自定义的source
1)随机生成数据
2)mysql
四、Transformations
1.整体分类
1)对单条记录的操作
2)对多条记录的操作
3)对多个流进行操作并转换为单个流(合并)
4)把一个流拆分成多个流(拆分)
2.基本操作
1)Map
2)flatMap
3)KeyBy
4)filter
5)sum
6)reduce
3.合并拆分
1)union和connect
2)需求
3)代码实现
4)结果展示
5)Select和SideOutputs
6)需求
7)代码实现
8)结果展示
4.分区
1)rebalance重平衡分区
2)代码实现
3)结果展示
4)其他分区
五、Data Sink
1.预定Sink
1)基于控制台和文件的Sink
2.自定义Sink
1)MySQL:可以把经过Flink处理的数据保存到MySQL中
2)代码实现
3)结果展示
六、Connector
1.JDBCConnector
日常工作中,我们一般会先把数据存放在表中,然后对数据进行加工和分析。这就有时效性
的问题。
如果以年、月、天为单位的级别的数据处理,进行统计分析,个性化推荐,这样的数据一般
称之为批数据。如果以小时、分钟、秒这样的单位进行处理,这样的数据一般称之为流数据。
比如对网站的实时监控、日志的处理等。在这样的场景下,如果还要收集数据存储到数据库
中,再取出来统一进行处理,就无法满足高时效性的需求
BatchAnalytics,统一收集数据->存储到数据库->对数据进行批量处理,例如MP、Hive、
FlinkDataSet、SparkBatch等,生成离线报表
StreamingAnalytics,就是对数据流进行处理,例如Storm、FlinkStream、SparkStreaming
实时处理分析数据,应用场景如实时大屏、实时报表等
的
Flink的DataStreamAPI既支持批处理模式,又支持流处理模式,可以认为批处理是流处理
的一种特例。
流批一体的好处:
API
演示
API
env.readTextFile(本地/HDFS/文件夹/压缩文件)
演示
准备gz压缩文件
查看结果
socket是指网络通讯,需要有一个发送端一个接送端,类似于插头和插座(socket),用于
和一些智能硬件的对接。比如门禁的人脸机就是一个智能设备,每个人脸机都有一个ip地
址,也有一个端口,根据ip地址和端口号就可以和这个人脸机进行通讯
a.模拟socket通讯,安装nc
nc是netcat的简称,可以利用它向某台主机的某个端口发送数据,模拟socket通讯的发送
端,也就是作为source
b.启动nc,发送数据,相当于socket通讯的发送端
c.使用telnet来接收数据,测试socket是否工作正常
在windows主机安装telnet
d.linux主机下,也可以安装telnet进行
e.找到端口进程杀死
[root@hadoop001 ~]# netstat -nap | grep 9999
f.编写flink代码,作为socket通讯的接收端,接收发送的数据进行处理
g.案例-利用基于socket的source实时统计单词数量
API
SourceFunction:非并行的随机数据源(并行度为1)
RichSourceFunction:丰富的非并行的随机数据源(并行度为1)
ParallelSourceFunction:并行的随机数据源(并行度可以大于等于1)
RichParallelSourceFunction:丰富的并行的随机数据源(并行度可以大于等于1)
需求
每隔1秒随机生成一条订单信息(订单ID,用户ID,订单金额,时间戳)
要求:
随机生成订单ID(UUID):UUID是通用唯一识别码(UniversallyUniqueIdentifier)的缩写
随机生成用户ID(0-2)
随机生成订单金额(0-100)
时间戳为当前系统时间
编程实现
引入lombok依赖,使用注解@Data自动生成getter和setter
启动并查看结果
从mysql中提取数据进行处理
Sqoop数据迁移:可以把mysql中的数据迁移到hdfs、hive、hbase中
Kettle:ETL工具,也可以将mysql中的数据抽取到hdfs、hive中,并进行处理
Flink:api方式读取mysql中的数据,并进行处理
a.需求
从mysql中实时加载数据
b.启动mysql
本地MySQL
远程MySQL
c.准备睡觉
准备表
设置字段
添加记录
d.代码实现
e.在pom文件中添加java连接mysql的依赖
f.运行查看结果
官网api地址
Apache Flink 1.12 Documentation: Operators
filter过滤,map映射
统计一个小时内的订单的总成交量,需要使用window将需要的记录关联到一起进行处理
union联合、join连接、connection连接
split拆分,拆分后的每个流是原来流的有一个子集,可以对每个子集进行不同的操作
映射,将操作作用在集合中的每一个元素上,并返回作用后的结果y=f(x)
扁平化映射,将集合中的每个元素转换为一个或多个元素,并返回扁平化之后的结果
分组,安装指定的key来对流中的数据进行分组,注意在流处理中没有groupBy,而是keyBy
过滤,按照指定的条件对集合中的元素进行过滤,过滤出返回true/符合条件的元素
求和,按照指定的字段对集合中的元素进行求和
聚合,对集合中的元素进行聚合
union算子可以合并多个同类型的数据流,并生成一个同类型的数据流,数据按照先进先出(FirstInFirstout)的模式合并,并且不去重。
connect提供了和union类似的功能,用来连接两个数据流,,但是与union区别:
connect只能连接两个数据流,而union可以连接多个数据流
connect连接的两个数据流的数据类型可以不一致,union所连接的数据流的数据类型必须一致
两个DataStream经过connect之后被转换为一个ConnectedStreams,并且会对两个流的数据应用不同的处理方法,而且双流之间可以共享状态。
将两个String类型的流进行union
将一个String类型的流和一个Long类型的流信息connect
Select就是获取分流后对应的数据
SideOutputs可以使用process方法对流中的数据进行处理,并针对不同的处理结果将数据
收集到不同OutputTag中
对流中的数据按照奇数和偶数进行分流,并获取分流后的数据
类似与spark中的repartition,但是功能更强大,可以直接解决数据倾斜问题。
global:全部发往第一个task
broadcast:广播
forward:上下游并发度一样时一对一发送
suffle:随机均匀分配
recale:本地轮流分配
partitionCustom:自定义分区
print:直接输出到控制台
printToErr:直接输出到控制台,用红色
writeAsText(本地/HDFS):输出到本地或者hdfs上,说明:如果并行度为1输出为文件,
如果并行度>1,输出为文件夹,如果不加并行度,则使用默认的并行度8,输出也为文
件夹
主程序
自定义数据下沉类
官网api
Apache Flink 1.12 Documentation: JDBC Connector
Exampleusage: