Flink实战-基础概念
大数据计算一般需要经历输入→处理→输出三个步骤:

Flink也是如此,我们先看一个例子,假设我们有一个文件(log.txt)用来记录用户发言数据(MsgInfo),每笔信息一行,现在我们通过Flink来统计每个用户的发言次数:
/**
* Flink处理流程。
* <br/>
* 注:Flink DataSet API在Flink1.18后被弃用,并将在未来的Flink主版本中删除,请使用DataStream或Table API。
* <p>
* 离线:结果是一次性出来的
* 实时:来一个数据处理一次,数据是带状态的
* 大数据处理三段论:输入---→处理---→输出
*/
public class FlinkDemo {
/**
* 使用Flink进行批处理(离线处理)。
*
* @throws Exception
*/
public static void postCountByFile() throws Exception {
//Step1:获取执行上下文
ExecutionEnvironment env = ExecutionEnvironment.createLocalEnvironment();
//Step2:一行一行的读取字符串
DataSource<String> source = env.readTextFile("D:\\log.txt");
//Step3:每一行的内容按照指定的分隔符进行拆分
source.flatMap(new RichFlatMapFunction<String, MsgInfo>() {
/**
*
* @param line 读取到的每一行数据
* @param collector 输出的集合
* @throws Exception 抛出的异常
*/
@Override
public void flatMap(String line, Collector<MsgInfo> collector) throws Exception {
MsgInfo info = JsonUtil.parseJson(line, MsgInfo.class);
System.out.println(info.getUid());
collector.collect(info);
}
}).map(new MapFunction<MsgInfo, Tuple2<String, Integer>>() {
/**
*
* @param msgInfo 上一步的输出源
* @return 输出结果。
* @throws Exception 异常。
*/
@Override
public Tuple2<String, Integer> map(MsgInfo msgInfo) throws Exception {
return Tuple2.of(msgInfo.getUid(), 1);
}
})
.groupBy(0)
.sum(1)
.print();
}
}
从示例中我们看到,Flink程序执行大体需要五个步骤:
- 获取执行环境(Environment),即和Flink框架建立联系,一般批处理我们使用
ExecutionEnvironment,流处理则使用StreamExecutionEnvironment。 - 接入数据源(Source),如常见的文件、数据库、队列等,示例中的
readTextFile()就是读取文件源。 - 数据转换操作(Transform),Flink提供了丰富的数据处理函数(算子),如:map、flatMap、filter、keyBy、aggregate、join、connect等。
- 数据输出(Sink),存储计算结果,示例中是直接
print()到了控制台。 - 执行任务(execute),但上面示例中并没有直接调用
execute(),这个是因为ExecutionEnvironment用于批处理(有界流),Flink会在程序结束时自动触发作业的执行,而StreamExecutionEnvironment用于流处理(无界流),需要显式调用execute()。
基本概念
批处理和流处理
批处理(Batch Processing)和流处理(Stream Processing)是大数据的两种主要的处理概念,如果数据看作水流的话,二者就是水龙头和水桶的区别。
批处理
- 定义:批处理并不会立即处理新到达的数据,而是先将其预先收集到一个组中,然后再按照固定的大小或时间间隔进行处理。
- 特点:
- 需要等待数据收集完成后才开始执行,因此存在一定的处理延迟。
- 按批处理数据,可以进行大规模的数据分析和处理。
- 可以在系统负载较低的时段进行处理。
- 适用场景:
- 历史数据挖掘。
- 定期报表业务。
- 机器学习训练。
流处理
- 定义:流处理将每笔数据都视为一个独立的个体,数据到达即处理,特别适合对响应时间要求很高的数据。
- 特点:
- 能够实时或近实时的处理数据。
- 需要持续运行以处理新到大的数据。
- 适用场景:
- 实时监控和报警。
- 社交媒体分析。
- 股票交易分析。
Flink和Spark算是瑜亮之交了,虽然二者均支持批处理和流处理,但在理念上却是本质上不同,Flink天然支持流处理,认为“批”只是一段时间窗口的“流”,而Spark则天然支持批处理,认为“流”只是连续的微小的“批”,这就导致了Spark无法在时效性上与Flink一较高下,这也许就是当下Flink越来越流行的原因吧。
有边界和无边界
有边界和无边界通常用于描述数据流的特征。
有边界
- 定义:有边界的数据大小是固定的,有明确的开始和结束,比如昨天的股票交易数据。
- 特点:数据集大小已知,可以预先分配资源,预估处理时间,易于管理,出错也容易校正和恢复。
无边界
- 定义:无边界的数据大小不固定,没有明确的结束点,比如交易数据,只要交易未停止,数据就会源源不断的产生。
- 特点:数据集的大小未知,可能是无限的,需要持续运行。
通常来说,流处理系统更适合处理无边界数据,有边界数据更适合用批处理来处理。
处理机制
在分布式数据处理时,数据一致性和准确性至关重要,业内有三种数据交付保证:
- At-Most-Once:每条数据最多处理一次,有丢失数据的可能
- At-Least-Once:每条数据至少被处理一次,保证数据不会丢失,但数据可能会被重复处理
- Exactly-Once:每条数据仅被处理一次,不会丢失数据,也不会重复处理

浙公网安备 33010602011771号