1.什么是flink
flink官网的解释是:Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams. Flink has been designed to run in all common cluster environments, perform computations at in-memory speed and at any scale。
即:flink是一个分布式的处理无限(无边界)或者有限(有边界)流数据的有状态的框架。它可以在任何规模的集群环境中运行,工作状态优先存在内存中,当内存空间不够时,继续往磁盘存储,所以计算速度非常快,是一个实时的流计算框架。
我们的现实生活中几乎所有的数据都可以成为是流数据,比如信用卡交易数据、传感器测量数据、机器日志数据或者用户在网页上的交互数据。无边界数据是指有起点而没有终点的数据,它们必须被连续的处理。有边界的数据有终点,它们可以被存储下来集中处理,对有边界数据的处理成为“批处理”。下图可以清晰的展示有边界数据和无边界数据的区别。
Flink既可以处理有边界数据也可以处理无边界数据。并且flink使用同一个引擎处理这两种数据。
2.flink的安装与运行
2.1 提前需求:Java1.8及以上版本
2.2 安装:brew install apache-flink
2.3 检查是否安装成功:flink --version
2.4 启动一个本地flink集群:./bin/start-cluster.sh(/usr/local/Cellar/apache-flink/1.7.1/libexec目录下)
2.5 浏览器输入:http://localhost:8081检查集群是否启动成功
3.第一个flink程序(WordCount)
3.1 Idea中创建一个maven项目
3.2 pom文件中加入flink的依赖:
</dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.12</artifactId>
<version>1.7.1</version>
<scope>provided</scope>
</dependency>
3.3 复制 flink git项目中wordcount代码(该代码逻辑请自行学习,此处不再详述)
代码地址:https://github.com/apache/flink/blob/master/flink-examples/flink-examples-streaming/src/main/java/org/apache/flink/streaming/examples/socket/SocketWindowWordCount.java
3.4 进入项目目录下打包:maven package
3.5 在flink集群上运行程序
3.5.1 使用netcat监听9000端口:$ nc -l 9000
3.5.2 运行项目:(注:启动时,一定要写全主类的全路径,否则会出现报错,详见后面)
$ flink run --class com.hui.learn.SocketWindowWordCount /Users/didi/IdeaProjects/flinklearn/target/flink-learn-1.0-SNAPSHOT.jar --port 9000
此时,会在flink的监控页面出现任务信息:
3.5.3 在9000端口下输入以下信息:
$ nc -l 9000
what is is you r name
此时,flink监控界面每5s钟读取页面的输入流,并对单词进行计数,结果将输出到:log/flink-*-taskexecutor-*.out文件中,查看结果:
3.6 停止集群:$ ./bin/stop-cluster.sh
4.异常分析:
4.1 $ flink run /Users/didi/IdeaProjects/flinklearn/target/flink-learn-1.0-SNAPSHOT.jar --port 9000
异常:org.apache.flink.client.program.ProgramInvocationException: Neither a 'Main-Class', nor a 'program-class' entry was found in the jar file.未指定主类异常,将主类加上:
4.2 $ flink run --class SocketWindowWordCount /Users/didi/IdeaProjects/flinklearn/target/flink-learn-1.0-SNAPSHOT.jar --port 900
异常:org.apache.flink.client.program.ProgramInvocationException: The program's entry point class 'SocketWindowWordCount' was not found in the jar file.提示找不到该主类,将主类全路径写上:
4.3 $ flink run --class com.hui.learn.SocketWindowWordCount /Users/didi/IdeaProjects/flinklearn/target/flink-learn-1.0-SNAPSHOT.jar --port 9000
Bingo!!!启动成功!!!!
5.查看任务列表
6.取消任务(根据任务ID)