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程序执行大体需要五个步骤:

  1. 获取执行环境(Environment),即和Flink框架建立联系,一般批处理我们使用ExecutionEnvironment,流处理则使用StreamExecutionEnvironment
  2. 接入数据源(Source),如常见的文件、数据库、队列等,示例中的readTextFile()就是读取文件源。
  3. 数据转换操作(Transform),Flink提供了丰富的数据处理函数(算子),如:map、flatMap、filter、keyBy、aggregate、join、connect等。
  4. 数据输出(Sink),存储计算结果,示例中是直接print()到了控制台。
  5. 执行任务(execute),但上面示例中并没有直接调用execute(),这个是因为ExecutionEnvironment用于批处理(有界流),Flink会在程序结束时自动触发作业的执行,而StreamExecutionEnvironment用于流处理(无界流),需要显式调用execute()

基本概念

批处理和流处理

批处理(Batch Processing)和流处理(Stream Processing)是大数据的两种主要的处理概念,如果数据看作水流的话,二者就是水龙头和水桶的区别。

批处理

  1. 定义:批处理并不会立即处理新到达的数据,而是先将其预先收集到一个组中,然后再按照固定的大小或时间间隔进行处理。
  2. 特点:
    • 需要等待数据收集完成后才开始执行,因此存在一定的处理延迟。
    • 按批处理数据,可以进行大规模的数据分析和处理。
    • 可以在系统负载较低的时段进行处理。
  3. 适用场景:
    • 历史数据挖掘。
    • 定期报表业务。
    • 机器学习训练。

流处理

  1. 定义:流处理将每笔数据都视为一个独立的个体,数据到达即处理,特别适合对响应时间要求很高的数据。
  2. 特点:
    • 能够实时或近实时的处理数据。
    • 需要持续运行以处理新到大的数据。
  3. 适用场景:
    • 实时监控和报警。
    • 社交媒体分析。
    • 股票交易分析。

Flink和Spark算是瑜亮之交了,虽然二者均支持批处理和流处理,但在理念上却是本质上不同,Flink天然支持流处理,认为“批”只是一段时间窗口的“流”,而Spark则天然支持批处理,认为“流”只是连续的微小的“批”,这就导致了Spark无法在时效性上与Flink一较高下,这也许就是当下Flink越来越流行的原因吧。

有边界和无边界

有边界和无边界通常用于描述数据流的特征。

有边界

  1. 定义:有边界的数据大小是固定的,有明确的开始和结束,比如昨天的股票交易数据。
  2. 特点:数据集大小已知,可以预先分配资源,预估处理时间,易于管理,出错也容易校正和恢复。

无边界

  1. 定义:无边界的数据大小不固定,没有明确的结束点,比如交易数据,只要交易未停止,数据就会源源不断的产生。
  2. 特点:数据集的大小未知,可能是无限的,需要持续运行。

通常来说,流处理系统更适合处理无边界数据,有边界数据更适合用批处理来处理。

处理机制

在分布式数据处理时,数据一致性和准确性至关重要,业内有三种数据交付保证:

  • At-Most-Once:每条数据最多处理一次,有丢失数据的可能
  • At-Least-Once:每条数据至少被处理一次,保证数据不会丢失,但数据可能会被重复处理
  • Exactly-Once:每条数据仅被处理一次,不会丢失数据,也不会重复处理
posted @ 2024-07-08 09:03  破落户儿  阅读(31)  评论(0)    收藏  举报