开发第一个Flink应用

《Flink1.7从安装到体验》一文中,我们安装和体验了Flink,今天就用java来一起开发一个简单的Flink应用;

步骤列表

本次实战经历以下步骤:

  1. 创建应用;
  2. 编码;
  3. 构建;
  4. 提交任务到Flink,验证功能;

环境信息

  1. Flink:1.7;
  2. Flink所在机器的操作系统:CentOS Linux release 7.5.1804;
  3. 开发环境JDK:1.8.0_181;
  4. 开发环境Maven:3.5.0;

应用功能简介

《Flink1.7从安装到体验》一文中,我们在Flink运行SocketWindowWordCount.jar,实现的功能是从socket读取字符串,将其中的每个单词的数量统计出来,今天我们就来编码开发这个应用,实现此功能;

创建应用

  1. 应用基本代码是通过mvn命令创建的,在命令行输入以下命令:
mvn archetype:generate -DarchetypeGroupId=org.apache.flink -DarchetypeArtifactId=flink-quickstart-java -DarchetypeVersion=1.7.0
  1. 按控制台的提示输入groupId、artifactId、version、package等信息,一路回车确认后,会生成一个和你输入的artifactId同名的文件夹,里面是个maven工程:
Define value for property 'groupId': com.bolingcavalry
Define value for property 'artifactId': socketwordcountdemo
Define value for property 'version' 1.0-SNAPSHOT: :
Define value for property 'package' com.bolingcavalry: :
Confirm properties configuration:
groupId: com.bolingcavalry
artifactId: socketwordcountdemo
version: 1.0-SNAPSHOT
package: com.bolingcavalry
  1. 用IEDA导入这个maven工程,如下图,已经有了两个类:BatchJob和StreamingJob,BatchJob是用于批处理的,本次实战用不上,因此可以删除,只保留流处理的StreamingJob:
    在这里插入图片描述

应用创建成功,接下来可以开始编码了;

编码

您可以选择直接从GitHub下载这个工程的源码,地址和链接信息如下表所示:

名称链接备注
项目主页https://github.com/zq2599/blog_demos该项目在GitHub上的主页
git仓库地址(https)https://github.com/zq2599/blog_demos.git该项目源码的仓库地址,https协议
git仓库地址(ssh)git@github.com:zq2599/blog_demos.git该项目源码的仓库地址,ssh协议

这个git项目中有多个文件夹,本章源码在socketwordcountdemo这个文件夹下,如下图红框所示:
在这里插入图片描述

接下来开始编码:

  1. 在StreamingJob类中添加静态内部类WordWithCount,这是个PoJo,用来保存一个具体的单词及其出现频率:
	 /**
	 * 记录单词及其出现频率的Pojo
	 */
	public static class WordWithCount {
		/**
		 * 单词内容
		 */
		public String word;

		/**
		 * 出现频率
		 */
		public long count;

		public WordWithCount() {
			super();
		}

		public WordWithCount(String word, long count) {
			this.word = word;
			this.count = count;
		}

		/**
		 * 将单词内容和频率展示出来
		 * @return
		 */
		@Override
		public String toString() {
			return word + " : " + count;
		}
	}
  1. 把所有业务逻辑写在StreamJob类的main方法中,如下所示,关键位置都加了中文注释:
public static void main(String[] args) throws Exception {

		//环境信息
		final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

		//数据来源是本机9999端口,换行符分隔,您也可以考虑将hostname和port参数通过main方法的入参传入
		DataStream<String> text = env.socketTextStream("localhost", 9999, "\n");

		//通过text对象转换得到新的DataStream对象,
		//转换逻辑是分隔每个字符串,取得的所有单词都创建一个WordWithCount对象
		DataStream<WordWithCount> windowCounts = text.flatMap(new FlatMapFunction<String, WordWithCount>() {
			@Override
			public void flatMap(String s, Collector<WordWithCount> collector) throws Exception {
				for(String word : s.split("\\s")){
					collector.collect(new WordWithCount(word, 1L));
				}
			}
		})
		.keyBy("word")//key为word字段
		.timeWindow(Time.seconds(5))	//五秒一次的翻滚时间窗口
		.reduce(new ReduceFunction<WordWithCount>() { //reduce策略
			@Override
			public WordWithCount reduce(WordWithCount a, WordWithCount b) throws Exception {
				return new WordWithCount(a.word, a.count+b.count);
			}
		});


		//单线程输出结果
		windowCounts.print().setParallelism(1);

		// 执行
		env.execute("Flink Streaming Java API Skeleton");
	}

构建

  1. 在pom.xml文件所在目录下执行命令:
mvn clean package -U
  1. 命令执行完毕后,在target目录下的socketwordcountdemo-1.0-SNAPSHOT.jar文件就是构建成功的jar包;

在Flink验证

  1. Flink的安装和启动请参考《Flink1.7从安装到体验》
  2. 登录到Flink所在机器,执行以下命令:
nc -l 9999
  1. 我这边Flink所在机器的IP地址是192.168.1.103,因此用浏览器访问的Flink的web地址为:http://192.168.1.103:8081
  2. 选择刚刚生成的jar文件作为一个新的任务,如下图:
    在这里插入图片描述
  3. 点击下图红框中的"upload",将文件提交:
    在这里插入图片描述
  4. 目前还只是将jar文件上传了而已,接下来就是手工设置执行类并启动任务,操作如下图,红框2中填写的前面编写的StreamingJob类的完整名称:
    在这里插入图片描述
  5. 提交后的页面效果如下图所示,可见一个job已经在运行中了:
    在这里插入图片描述
  6. 回到Flink所在机器的控制台,在之前输入了nc -l 9999的窗口输入一些英文句子,然后按下回车键,例如:
[root@vostro flink-1.7.0]# ./bin/start-cluster.sh
Starting cluster.
Starting standalonesession daemon on host vostro.
Starting taskexecutor daemon on host vostro.
[root@vostro flink-1.7.0]# nc -l 9999
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.

  1. 接下来看看我们的job的执行效果,如下图,点击左侧的"Task Managers",在右边的列表中只有一个Task,点击它:
    在这里插入图片描述
  2. 出现的页面有三个tab页,点击"Stdout"这个tab,就能见到我们的任务对之前句子中的单词的统计结果,如下图:
    在这里插入图片描述

至此,第一个最简单Flink就完成了。

欢迎关注我的公众号:程序员欣宸

在这里插入图片描述

### 创建并运行第一个Apache Flink项目 #### 准备工作环境 为了成功创建并运行首个Flink应用,需先安装配置好Java开发环境以及Maven构建工具。确保已设置JAVA_HOME环境变量指向JDK路径,并能通过命令行访问`mvn`命令。 #### 初始化Maven项目结构 使用Maven原型插件来初始化一个新的Flink应用程序骨架: ```bash mvn archetype:generate \ -DgroupId=com.example.flink \ -DartifactId=my-flink-project \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DinteractiveMode=false ``` 这会生成一个基础的Maven工程目录树[^2]。 #### 添加依赖项至pom.xml文件 编辑项目的`pom.xml`文件,加入必要的Flink库依赖声明以便后续编译链接时能够识别这些类库: ```xml <dependencies> <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-streaming-java --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java_2.12</artifactId> <version>1.14.0</version> </dependency> <!-- Other dependencies... --> </dependencies> ``` 上述XML片段展示了如何引入用于流处理的核心模块版本号为1.14.0的具体实例[^1]。 #### 编写简单的Word Count程序作为入门案例 在src/main/java下新建名为`com/example/flink/WordCount.java`源码文件,输入如下所示的基础代码实现单词计数逻辑功能: ```java package com.example.flink; import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStreamSource; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.util.Collector; public class WordCount { public static void main(String[] args) throws Exception { final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStreamSource<String> text = env.fromElements( "To be, or not to be, that is the question", "Whether 'tis nobler in the mind to suffer" ); text.flatMap(new Tokenizer()) .keyBy(value -> value.f0) .sum(1) .print(); env.execute("Word Count Example"); } public static final class Tokenizer implements FlatMapFunction<String, Tuple2<String, Integer>> { @Override public void flatMap(String value, Collector<Tuple2<String, Integer>> out) { String[] tokens = value.toLowerCase().split("\\W+"); for (String token : tokens) { if (token.length() > 0) { out.collect(new Tuple2<>(token, 1)); } } } } } ``` 这段代码定义了一个基本的数据流水线,它读取字符串列表中的句子,将其拆分为单独词语并通过键控窗口聚合统计每个词频次最后打印输出结果。 #### 构建可执行jar 完成编码后回到IDEA界面依次操作菜单栏选项:File->Project Structure->Artifacts 来指定要被打的内容;接着选择 Build->Build Artifacts 完成整个过程。 #### 部署到远程集群执行 假设已经有一个正在运行着单节点模式下的Flink集群,则可通过SCP协议把本地生成好的jar复制过去放置于服务器特定位置等待提交任务给JobManager调度器去启动作业流程: ```bash docker cp my-flink-projec2.jar master:/opt/ ``` 随后登录目标机器终端连接进入容器内部利用CLI客户端提交该job请求即可开始正式跑批运算任务
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员欣宸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值