这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战
Flink的特点
- 事件驱动(Event-driven)
- 基于流处理
一切皆由流组成,离线数据是有界的流;实时数据是一个没有界限的流。(有界流、无界流)
- 分层API
+ 越顶层越抽象,表达含义越简明,使用越方便
+ 越底层越具体,表达能力越丰富,使用越灵活
Flink vs Spark Streaming
- 数据模型
- Spark采用RDD模型,spark streaming的DStream实际上也就是一组组小批数据RDD的集合
- flink基本数据模型是数据流,以及事件(Event)序列
- 运行时架构
- spark是批计算,将DAG划分为不同的stage,一个完成后才可以计算下一个
- flink是标准的流执行模式,一个事件在一个节点处理完后可以直接发往下一个节点处理
快速上手
批处理实现WordCount
flink-streaming-java_2.12:1.12.1 => org.apache.flink:flink-runtime_2.12:1.12.1 => com.typesafe.akka:akka-actor_2.12:2.5.21,akka就是用scala实现的。即使这里我们用java语言,还是用到了scala实现的包
pom依赖
1 | xml复制代码<?xml version="1.0" encoding="UTF-8"?> |
准备工作
首先准备一个文件,存放一些简单的数据,以便后续Flink计算分析。在
resources
目录下新建一个hello.txt
文件,并存入一些数据
1 | txt复制代码hello java |
代码实现
1 | java复制代码package com.caicai; |
输出
1 | txt复制代码(thank,1) |
解决 Flink 升级1.12 报错 No ExecutorFactory found to execute the application
流处理实现
在2.1批处理的基础上,新建一个类进行改动。
- 批处理=>几组或所有数据到达后才处理;流处理=>有数据来就直接处理,不等数据堆叠到一定数量级
- 这里不像批处理有groupBy => 所有数据统一处理,而是用流处理的keyBy => 每一个数据都对key进行hash计算,进行类似分区的操作,来一个数据就处理一次,所有中间过程都有输出!
- 并行度:开发环境的并行度默认就是计算机的CPU逻辑核数
代码实现
1 | java复制代码package com.caicai; |
输出:
这里因为是流处理,所以所有中间过程都会被输出,前面的序号就是并行执行任务的线程编号。
1 | txt复制代码9> (how,1) |
流式数据源测试
- 通过
nc -lk <port>
打开一个socket服务,用于模拟实时的流数据
1 | shell复制代码nc -lk 7777 |
- 代码修改inputStream的部分
1 | java复制代码package com.caicai; |
- 在本地开启的socket中输入数据,观察IDEA的console输出。
本人测试后发现,同一个字符串,前面输出的编号是一样的,因为key => hashcode,同一个key的hash值固定,分配给相对应的线程处理。
优化修改
上面的代码,我们是把host
和port
写死在代码中的,这样其实不太好,我们可以设置在参数(args
)中,借助parameter tool
工具提取这些配置项
1 | java复制代码//改动部分 |
将配置项设置在args
参数中
输入
1 | shell复制代码--host 192.168.200.130 --port 7777 |
然后点击右下角的apply
,再次运行程序就可以了
本文转载自: 掘金