- Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。
-
Flink的主要特点
事件驱动
基于流的世界观:在 Flink 的世界观中,一切都是由流组成的,离线数据是有界的流;实时数据是一个没有界限的流:这就是所谓的有界流和无界流
分层API:➢越顶层越抽象,表达含义越简明,使用越方便,越底层越具体,表达能力越丰富,使用越灵活
- 修改pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>FlinkTest</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>1.10.1</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.12</artifactId>
<version>1.10.1</version>
</dependency>
</dependencies>
</project>
编写代码
批处理
- 数据展示
hadoop spark scala
flink hadoop scala
flink hadoop
- 具体代码
package WordCount;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.DataSource;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;
//批处理的WordCount程序
public class WordCountTest01 {
public static void main(String[] args) throws Exception {
//创建执行环境
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
//从文件中读取数据
String inputPath = "E:\\IDEA\\IntelliJ IDEA 2019.1\\bm\\FlinkTest\\src\\main\\resources\\WordCount.txt";
//dataSource其实就是一个dataSet
DataSource<String> stringDataSource = env.readTextFile(inputPath);
//对数据集来进行处理
DataSet<Tuple2<String, Integer>> result = stringDataSource.flatMap(new MyFlatMapper())//按照空格来进行分词
.groupBy(0)//按照第一个位置来进行分组
.sum(1);//按照第二个位置的元素来进行聚合
result.print();
}
//自定义类来实现FlatMapFunction接口
//第一个String是输入的数据类型
//第二个就是输出的数据类型
public static class MyFlatMapper implements FlatMapFunction<String, Tuple2<String, Integer>> {
@Override
public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception {
//按照空格来进行分词
String[] words = s.split(" ");
//遍历所有word包装成二元组输出
for (String word : words) {
collector.collect(new Tuple2<>(word, 1));
}
}
}
}
-
结果展示
流处理
- 具体代码
package WordCount;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.api.java.utils.ParameterTool;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
//流处理
public class WordCountStream {
public static void main(String[] args) throws Exception {
//创建流处理的执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(8);//设置线程数
//使用parameter tool工具从程序启动参数中提取配置
ParameterTool parameterTool = ParameterTool.fromArgs(args);
String host = parameterTool.get("host");
int port = parameterTool.getInt("port");
//从socket文本流读取数据
DataStream<String> inputStream = env.socketTextStream(host, port);
//基于数据流集训转换操作
SingleOutputStreamOperator<Tuple2<String, Integer>> result = inputStream.flatMap(new WordCountTest01.MyFlatMapper())
.keyBy(0)//与groupBy相似,按照key的hashCode
.sum(1).setParallelism(3);
result.print().setParallelism(1);
//启动任务,否则不会执行
env.execute();
}
}
-
修改启动项
-
运行测试
先运行代码,然后在虚拟机中运行如下内容 - 在窗口输出内容,然后在控制台窗口结果
打包运行
图形界面画的运行
- 登录上WEBUI
-
将jar包提交
-
填上参数
-
点击show plan可以看到每步的分区数
-
点击提交,如果一直是转圈,说明是词到不够,我们可以增加后再次运行
-
运行成功的样子,这是就可以通过Linux来输入流数据了
-
发现当我们输入时数据是在变化的
-
如何查看结果?
命令行运行
-
运行命令:
bin/flink run -c WordCount.WordCountStream -p 2 /home/data/FlinkTest.jar --host 192.168.0.149 --port 7777
-
查看所有正在运行的job:
bin/flink list
-
杀死job:``
-
查看已经杀死的job:``