我正在参与掘金创作者训练营第4期,点击了解活动详情,一起学习吧!
前言
flink是设计来快速处理数据流的一种大数据组件,在新的大数据处理大环境下,分布式以及流处理是无法绕过的重中之重。本系列旨在简单的讨论和研究一下flink的使用和源码原理。
环境
首先flink 需要java环境,因为flink是由java和scala两种语言来支持完成的。在电脑上可以使用命令查看一下java的环境
$ java -version
看到这样的回复就表示环境是准备好的。
最新版本的flink官网上提示需要java版本 jdk11 。
然后可以上官网下载flink的jar包 下载地址, 然后解压缩这个软件包。可以看见目录如下
直接使用命令bash启动flink或者直接点击运行sh
$ bash start-cluster.sh
注意如果使用sh 可能会导致这种异常
flink-1.14.3/bin/config.sh: line 32: ` done < <(find "$FLINK_LIB_DIR" ! -type d -name '*.jar' -print0 | sort -z)'
这种异常的原因是因为 这个文件不支持sh的文本格式有语法错误。
简单点击localhost:8081地址就可以访问flink的web ui
第一个jar
在刚刚的下载文件地址可以找到一个example文件夹,点击 add new 按钮 上传到服务器
直接submit,参数都可以不填,然后查看一下结果
这样就执行成功了。
具体的执行结果和日志可以在log里面查看
如何自己打包自己的代码
首先在maven文件中添加flink配置
<!--java 依赖包导入-->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
</dependency>
然后修改文件build的配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>${application}</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
然后简单修改一下官方的例子,主要是改一下文件的地址,这个代码的内容就和上文的例子完全一致。
public class WordCount {
public static void main(String[] args) throws Exception{
// 创建执行环境
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
// 从文件中读取数据
String inputPath = "xxx/Document/1.txt";
//这里和spark很相似了
DataSet<String> inputDataSet = env.readTextFile (inputPath);
// 对数据集进行处理,按空格分词展开,转换成(word, 1)二元组进行统计
DataSet<Tuple2<String, Integer>> resultSet = inputDataSet.flatMap(new MyFlatMapper())
.groupBy(0) // 按照第一个位置的word分组
.sum(1); // 将第二个位置上的数据求和
resultSet.print();
}
// 自定义类,实现FlatMapFunction接口
public static class MyFlatMapper implements FlatMapFunction<String, Tuple2<String, Integer>>
{
public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
// 按空格分词
String[] words = value.split(" ");
// 遍历所有word,包成二元组输出
for (String word : words) {
out.collect(new Tuple2<String,Integer>(word, 1));
}
}
}
}
点击maven的package或者使用命令 mvn-package 即可打包jar文件,注意要上传with-denpendencies这个版本的jar,这个版本的jar包里有打包进去的依赖文件。
然后我们就可以启动运行这个自制的wordcout jar了,启动以后的运行结果与官方的jar结果输出完全的一致。
其中重要的一句代码
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment().setRuntimeMode(RuntimeExecutionMode.STREAMING);
这个代码的功能就是区分和建立执行环境
//流处理环境,支持flink所有功能,所有的检查点,处理事件都将启用
STREAMING,
//使用批处理语义
BATCH,
//用于无界数据源
AUTOMATIC
在代码中可以清晰的阅读到,flink是一种支持流批一体化的大数据工具。
总结
今天我们实验了如何在电脑上部署一个简单的standlone的单机flink系统,以及如何编写自定义jar,配置自定义的jar的maven ,以及包括如何上传以及查看运行结果。flink的关键点还在于他强大的扩展能力,窗口能力,以及计算方式选择的灵活度。只要简单的使用flink的各种function就可以构建自己的计算系统。在flink新支持的sql系统还可以在不更改代码的情况下,简单的修改自己的计算系统的功能支持。