如果我们使用Flink和FlinkCDC实现同步,就需要先了解些基础知识,但是大数据这堆常用中间件并没学过。所以可以一起学习下Flink!
我们可以先启动一个 统计单词出现次数 的Demo来了解。
批处理模式
我们首先使用IDEA构建一个maven管理的Java空白项目。
导入下面依赖:
(自己的话可以用最新的,跟着b站看课用相同版本比较方便)
<?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>FlinkTest1</artifactId>
<version>1.0-SNAPSHOT</version>
<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>
在resources目录下创建 hello.txt 文件,其中可以随便写一些英语短语:
hello world
hello flink
hello java
新建一个Class,添加main主函数,编写代码:
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;
/**
* 批处理word count
**/
public class WordCount {
public static void main(String[] args) throws Exception {
//创建执行环境
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
//从文件中读取数据
String path = "右键复制hello.txt全路径粘贴在这";
DataSource<String> dataSource = env.readTextFile(path);
//对数据集进行处理,按照空格分词,之后按照 word, 1 这种形式进行分组
DataSet<Tuple2<String, Integer>> dataSet = dataSource.flatMap(new MyFlatMapFunction())
//按照第一个位置进行分组
.groupBy(0)
//将第二个位置的值进行求和
.sum(1);
dataSet.print();
}
public static class MyFlatMapFunction implements FlatMapFunction<String, Tuple2<String, Integer>> {
public void flatMap(String s, Collector<Tuple2<String, Integer>> out) throws Exception {
String[] words = s.split(" ");
for (String word : words) {
out.collect(new Tuple2<String, Integer>(word, 1));
}
}
}
}
经过运行可以得到:
(运行启动较慢,不要急)
(java,1)
(flink,1)
(world,1)
(hello,3)
流处理模式
新建一个Class编写流处理模式,整体的流程差不多,只不过构建的类有不同:
import org.apache.flink.api.java.operators.DataSource;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
public class StreamCount {
public static void main(String[] args) throws Exception {
//创建流
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//读取
String path = "文件全路径粘贴在这/resources/hello.txt";
DataStreamSource<String> source = env.readTextFile(path);
//基于数据流进行转换
SingleOutputStreamOperator<Tuple2<String, Integer>> sum = source.flatMap(new WordCount.MyFlatMapFunction()).keyBy(0).sum(1);
sum.print();
//执行任务
env.execute();
}
}
运行可以得到:
2> (hello,1)
3> (world,1)
2> (hello,2)
1> (java,1)
2> (hello,3)
4> (flink,1)
可以看到其中hello从1变化为3的过程,整体是使用流处理所以是一点一点的处理,会显示中间的过程。
前面的 2> 是内部的线程标识。