「大数据」大数据第四代 Flink 从概念到实战

图灵汇官网

一、Flink 的引入

近年来,随着大数据技术的迅速发展,出现了许多热门的开源社区,其中包括著名的Hadoop、Storm以及后来的Spark。这些项目各有专长,分别适用于不同的应用场景。Spark凭借其内存计算的优势,引领了大数据处理的新潮流,同时也掩盖了一些其他分布式计算系统的光芒,比如Flink。尽管如此,Flink仍然在默默发展中不断进步。

国外的一些社区将大数据计算引擎分为四代,虽然这一划分方式存在争议,但我们可以暂且参考这种观点。第一代计算引擎是Hadoop的MapReduce,它将计算分为Map和Reduce两个阶段。第二代计算引擎则支持DAG(有向无环图)框架,例如Tez和Oozie。第三代计算引擎以Spark为代表,强调内存计算和实时处理。而Flink作为第四代计算引擎,主要特点在于其流处理性能和更高的实时性。

二、Flink 是什么

2.1 Flink 的诞生背景

Flink起源于Stratosphere项目,该项目由柏林的大学和欧洲其他一些大学联合开展研究。2014年4月,Stratosphere项目被捐赠给Apache软件基金会,并在同年12月成为顶级项目。

2.2 LOGO 介绍

Flink在德语中意为“快速和灵巧”。项目Logo采用了一只色彩斑斓的松鼠,其尾巴颜色与Apache软件基金会的Logo颜色相呼应,象征着这只松鼠属于Apache大家庭。

2.3 官网地址

官网地址为:https://flink.apache.org/

2.4 Flink 概述

Flink是一个分布式计算框架,主要用于流处理和批处理。其主页上的标语是:“Apache Flink 是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架”。

2.5 使用 Flink 的公司

许多公司都在使用Flink,包括阿里巴巴等。

三、Flink 的优势

随着人工智能时代的到来,数据量呈爆发式增长。在大数据业务场景中,数据处理通常分为批处理和流处理两种方式。用户通常需要为这两种方式分别编写代码,这增加了额外的负担和成本。阿里巴巴在处理商品数据时遇到了同样的问题,于是他们选择了Flink,希望用一套统一的计算引擎来支持批处理和流处理。2015年,阿里巴巴开始使用Flink,并逐渐贡献社区。2019年,阿里巴巴收购了Data Artisans公司,进一步推动了Flink的发展。

四、入门实战

接下来,我们将从零开始,教你如何构建第一个Flink应用程序。

4.1 开发环境准备

Flink可以在Linux、Mac OS X或Windows上运行。为了开发Flink应用程序,需要在本地机器上安装Java 8.x和Maven环境。我们推荐使用IntelliJ IDEA作为开发IDE,因为它支持Scala和Java混合项目。

4.2 创建 Maven 项目

使用Flink Maven Archetype创建项目结构和初始依赖。在工作目录下运行以下命令:

bash mvn archetype:generate -DarchetypeGroupId=org.apache.flink -DarchetypeArtifactId=flink-quickstart-java -DarchetypeVersion=1.6.1 -DgroupId=my-flink-project -DartifactId=my-flink-project -Dversion=0.1 -Dpackage=myflink -DinteractiveMode=false

4.3 编写 Flink 程序

启动IntelliJ IDEA,选择“Import Project”,导入my-flink-project根目录下的pom.xml。在src/main/java/myflink目录下创建SocketWindowWordCount.java文件,并逐步添加代码。

```java package myflink;

import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.windowing.time.Time; import org.apache.flink.util.Collector;

public class SocketWindowWordCount { public static void main(String[] args) throws Exception { // 创建 execution environment final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

    // 通过连接socket获取输入数据
    DataStream<String> text = env.socketTextStream("localhost", 9000, "n");

    // 解析数据,按word分组,开窗,聚合
    DataStream<Tuple2<String, Integer>> windowCounts = text
        .flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public void flatMap(String value, Collector<Tuple2<String, Integer>> out) {
                for (String word : value.split("\s")) {
                    out.collect(Tuple2.of(word, 1));
                }
            }
        })
        .keyBy(0)
        .timeWindow(Time.seconds(5))
        .sum(1);

    // 将结果打印到控制台
    windowCounts.print().setParallelism(1);

    // 启动Flink作业
    env.execute("Socket Window WordCount");
}

} ```

4.4 运行程序

首先在终端启动netcat以获得输入流:

bash nc -lk 9000

如果是Windows平台,可以通过https://nmap.org/ncat/安装ncat并运行:

bash ncat -lk 9000

然后直接运行SocketWindowWordCount的main方法。在netcat控制台输入单词,可以在SocketWindowWordCount的输出控制台看到每个单词的词频统计。

祝你编程愉快!

本文来源: 图灵汇 文章作者: 陈克芳