近年来,随着大数据技术的迅速发展,出现了许多热门的开源社区,其中包括著名的Hadoop、Storm以及后来的Spark。这些项目各有专长,分别适用于不同的应用场景。Spark凭借其内存计算的优势,引领了大数据处理的新潮流,同时也掩盖了一些其他分布式计算系统的光芒,比如Flink。尽管如此,Flink仍然在默默发展中不断进步。
国外的一些社区将大数据计算引擎分为四代,虽然这一划分方式存在争议,但我们可以暂且参考这种观点。第一代计算引擎是Hadoop的MapReduce,它将计算分为Map和Reduce两个阶段。第二代计算引擎则支持DAG(有向无环图)框架,例如Tez和Oozie。第三代计算引擎以Spark为代表,强调内存计算和实时处理。而Flink作为第四代计算引擎,主要特点在于其流处理性能和更高的实时性。
Flink起源于Stratosphere项目,该项目由柏林的大学和欧洲其他一些大学联合开展研究。2014年4月,Stratosphere项目被捐赠给Apache软件基金会,并在同年12月成为顶级项目。
Flink在德语中意为“快速和灵巧”。项目Logo采用了一只色彩斑斓的松鼠,其尾巴颜色与Apache软件基金会的Logo颜色相呼应,象征着这只松鼠属于Apache大家庭。
官网地址为:https://flink.apache.org/
Flink是一个分布式计算框架,主要用于流处理和批处理。其主页上的标语是:“Apache Flink 是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架”。
许多公司都在使用Flink,包括阿里巴巴等。
随着人工智能时代的到来,数据量呈爆发式增长。在大数据业务场景中,数据处理通常分为批处理和流处理两种方式。用户通常需要为这两种方式分别编写代码,这增加了额外的负担和成本。阿里巴巴在处理商品数据时遇到了同样的问题,于是他们选择了Flink,希望用一套统一的计算引擎来支持批处理和流处理。2015年,阿里巴巴开始使用Flink,并逐渐贡献社区。2019年,阿里巴巴收购了Data Artisans公司,进一步推动了Flink的发展。
接下来,我们将从零开始,教你如何构建第一个Flink应用程序。
Flink可以在Linux、Mac OS X或Windows上运行。为了开发Flink应用程序,需要在本地机器上安装Java 8.x和Maven环境。我们推荐使用IntelliJ IDEA作为开发IDE,因为它支持Scala和Java混合项目。
使用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
启动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");
}
} ```
首先在终端启动netcat以获得输入流:
bash
nc -lk 9000
如果是Windows平台,可以通过https://nmap.org/ncat/安装ncat并运行:
bash
ncat -lk 9000
然后直接运行SocketWindowWordCount
的main方法。在netcat控制台输入单词,可以在SocketWindowWordCount
的输出控制台看到每个单词的词频统计。
祝你编程愉快!