赞
踩
本篇文章,主要通过Flink来实现“Hello Word”、批处理的“Word Count”以及流处理的“Word Count”来体验一下Flink.
本系列文章所使用的flikn版本为最新的1.12.0(截至2021年1月)
Flink:1.12.0
Java:1.8
Maven:3.6.3
在学习任何一门语言或者框架的时候,我们总是以“Hello Word”开始。
//Java
System.out.println("Hello,World!");
//C
printf("Hello,World!");
//Python
print("Hello,World!")
//C#
Console.WriteLine("Hello,World!");
所以,在学习Flink时,我们也从输出“Hello Word”开始,来打开Flink的大门。
首先我们需要引入Flink相关的依赖,只需要引入flin-clinets即可,它本身已经包含了flink-java和flink-core了。
<properties>
<flink.version>1.12.0</flink.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
</dependencies>
以下代码实现了输出一个List数据源中的元素“Hello Word”:
/**
* 最简单的Flink程序: Hello Word
*
* @author wxg
*/
public class HelloWord {
public static void main(String[] args) throws Exception {
//获取Flink执行环境
ExecutionEnvironment environment = ExecutionEnvironment.getExecutionEnvironment();
//从集合中获取数据源
DataSource<String> dataSource = environment.fromCollection(Collections.singletonList("Hello Word"));
//输出到控制台
dataSource.print();
}
}
在Idea中启动它,不出意外的话,会输出以下结果:
Hello Word
当然这段程序并没有具体的处理逻辑和功能,它只是把数据源的内容原样输出,但它确实是在Flink环境中执行的。
word count可以说是大数据界的hello word,所以本次依然以最简单的word count例子来分别构建一个基于批处理和流处理的简单的flink应用。
和上面一样,仍然只需要flink-clients依赖即可。
<properties>
<flink.version>1.12.0</flink.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
</dependencies>
依赖导入完成后,我们就可以愉快的来编写Flink程序了。
在没使用Flink前,比如使用MR的时候,我们要做单词计数的功能,通常有以下几步(可参照文末的附录6.1):
定义输入输出数据格式
编写Map函数,将一行行的字符串按照分隔符进行拆分,然后输出格式类似为{word:1}的一个List
编写Reduce函数,将Map阶段的输出按照word(Reduce Key)进行进行聚合统计
输出结果
实际上flink也大致是这样的一个流程,只不过,代码更简洁。
以下是Flink实现的一个简单的统计文本文件中的单词出现次数的代码:
/** * 批处理的word count * * @author wxg */ public class BatchWordCount { public static void main(String[] args) throws Exception { //获取Flink批处理执行环境 ExecutionEnvironment environment = ExecutionEnvironment.getExecutionEnvironment(); //从文件中获取数据源 final String fileName = "E:\\temp\\study-flink\\word-count.txt"; DataSource<String> dataSource = environment.readTextFile(fileName); //单词计数 dataSource //将一行句子按照空格拆分,输入一个字符串,输出一个2元组,key为一个单词,value为1 .flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() { public void flatMap(String s, Collector<Tuple2<String, Integer>> collector) throws Exception { //对读取到的每一行数据按照空格分割 String[] split = s.split(" "); //将每个单词放入collector中作为输出,格式类似于{word:1} for (String word : split) { collector.collect(new Tuple2<String, Integer>(word, 1)); } } }) //聚合算子,按照第一个字段(即word字段)进行分组 .groupBy(0) //聚合算子,对每一个分租内的数据按照第二个字段进行求和 .sum(1) //打印结果到控制台 .print(); } }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/395812
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。