开发一个Flink应用
步骤列表
本次实战经历以下步骤:
创建应用;
编码;
构建;
提交任务到Flink,验证功能;
环境信息
Flink:1.7;
Flink所在机器的操作系统:CentOS Linux release 7.5.1804;
开发环境JDK:1.8.0_181;
开发环境Maven:3.5.0;
应用功能简介
在Flink运行SocketWindowWordCount.jar,实现的功能是从socket读取字符串,将其中的每个单词的数量统计出来,今天我们就来编码开发这个应用,实现此功能;
1、应用基本代码是通过mvn命令创建的,在命令行输入以下命令
mvn archetype:generate -DarchetypeGroupId=org.apache.flink -DarchetypeArtifactId=flink-quickstart-java -DarchetypeVersion=1.7.0
2、按控制台的提示输入groupId、artifactId、version、package等信息,一路回车确认后,会生成一个和你输入的artifactId同名的文件夹,里面是个maven工程:
Define value for property 'groupId': com.hjp
Define value for property 'artifactId': socketwordcountdemo
Define value for property 'version' 1.0-SNAPSHOT: :
Define value for property 'package' com.hjp: :
Confirm properties configuration:
groupId: com.hjp
artifactId: socketwordcountdemo
version: 1.0-SNAPSHOT
package: com.hjp
3、用IEDA导入这个maven工程,如下图,已经有了两个类:BatchJob和StreamingJob,BatchJob是用于批处理的,本次实战用不上,因此可以删除,只保留流处理的StreamingJob:
应用创建成功,接下来可以开始编码了;
在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;
}
}
把所有业务逻辑写在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");
}
构建
maven 打包
在Flink验证
1、登录到Flink所在机器,执行以下命令:
2、我这边Flink所在机器的IP地址是192.168.11.107,因此用浏览器访问的Flink的web地址为:http://192.168.11.107:8081;
3、选择刚刚生成的jar文件作为一个新的任务,如下图:
4、点击下图红框中的"upload",将文件提交:
5、目前还只是将jar文件上传了而已,接下来就是手工设置执行类并启动任务,操作如下图,填写前面编写的StreamingJob类的完整名称:
6、提交后的页面效果如下图所示,可见一个job已经在运行中了:
7、回到Flink所在机器的控制台,在之前输入了nc -l 9999的窗口输入一些英文句子,然后按下回车键,例如:
8、接下来看看我们的job的执行效果,如下图,点击左侧的"Task Managers",在右边的列表中只有一个Task,点击它:
9、点击"Stdout"这个tab,就能见到我们的任务对之前句子中的单词的统计结果,如下图:
至此,第一个比较简单的FLINK就完成了。
开发一个Flink应用的更多相关文章
- Flink从入门到放弃(入门篇2)-本地环境搭建&构建第一个Flink应用
戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...
- 在 Cloudera Data Flow 上运行你的第一个 Flink 例子
文档编写目的 Cloudera Data Flow(CDF) 作为 Cloudera 一个独立的产品单元,围绕着实时数据采集,实时数据处理和实时数据分析有多个不同的功能模块,如下图所示: 图中 4 个 ...
- 轻装上阵Flink--在IDEA上开发基于Flink的实时数据流程序
前言 本文介绍如何在IDEA上快速开发基于Flink框架的DataStream程序.先直接上手! 环境清单 案例是在win7运行.安装VirtualBox,在VirtualBox上安装Centos操作 ...
- 拥抱.NET Core,如何开发一个跨平台类库 (1)
在此前的文章中详细介绍了使用.NET Core的基本知识,如果还没有看,可以先去了解“拥抱.NET Core,学习.NET Core的基础知识补遗”,以便接下来的阅读. 在本文将介绍如何配置类库项目支 ...
- 如何开发一个简单的HTML5 Canvas 小游戏
原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...
- [MEF插件式开发] 一个简单的例子
偶然在博客园中了解到这种技术,顺便学习了几天. 以下是搜索到一些比较好的博文供参考: MEF核心笔记 <MEF程序设计指南>博文汇总 先上效果图 一.新建解决方案 开始新建一个解决方案Me ...
- bootstrap开发一个简单网页。
CSS代码: body{ padding-top: 50px; padding-bottom: 50px; overflow: auto!important; ...
- 后移动互联网时代:到底还要不要开发一个App?
后移动互联网时代,到底是什么样的一个时代? 首先,后移动互联网时代中,产生头部应用的几率变小了,像微信这样巨头式的App很难在产生第二个.其次,后移动互联网时代,物联网发展迅速,所有的智能硬件都需要一 ...
- iOS开发一个用户登录注册模块需要解决的坑
最近和另外一位同事负责公司登录和用户中心模块的开发工作,开发周期计划两周,减去和产品和接口的协调时间,再减去由于原型图和接口的问题,导致强迫症纠结症状高发,情绪不稳定耗费的时间,能在两周基本完成也算是 ...
随机推荐
- python cv2展示网络图片、图片编解码、及与base64转换
从网络读取图像数据并展示 需要使用cv2.imdecode()函数,从指定的内存缓存中读取数据,并把数据转换(解码)成图像格式:主要用于从网络传输数据中恢复出图像. # -*- coding: utf ...
- 在docker容器中为elasticsearch配置跨域访问
一.在docker容器中进入elasticsearch对应的容器 docker exec -it [容器名] /bin/bash 二.安装vim编辑器 因为我们需要更改配置文件,安装过的朋友就不用安装 ...
- ftp建立虚拟用户实现文件上传和下载
环境 centos7 1.开启vsftpd服务 2.检查vsftpd服务是否开启 3.添加虚拟用户口令文件 vi etc/vsftpd/vuser.txt 4.生成虚拟用户口令认证文件 如果没有db_ ...
- RabbitMQ延迟队列插件安装
RabbitMQ延迟队列插件安装 一.下载插件 下载地址:https://www.rabbitmq.com/community-plugins.html 二.把下载的插件放到指定位置 下载的文件为zi ...
- AIX中设备管理
1.AIX系统中的设备概述 逻辑设备文件 #ls -l /dev 空设备文件 #/dev/null 设备的状态:undefined.defined.available.stopp ...
- Generative Adversarial Nets(GAN Tensorflow)
Generative Adversarial Nets(简称GAN)是一种非常流行的神经网络. 它最初是由Ian Goodfellow等人在NIPS 2014论文中介绍的. 这篇论文引发了很多关于神经 ...
- java 基本包
1. import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java ...
- WPF 样式Style
一:样式基础 如果我们的程序有三个这样的按键,一般我们会这样写 <StackPanel> <!--按键的背景色为Azure蔚蓝色背景色为Coral珊瑚色字体为Arial加粗字体大小为 ...
- thinkphp之cookie操作
cookie设置 命名空间 代码
- pt-archiver使用记录
pt-archiver使用记录 功能:将MySQL表中的行存档到另一个表或文件中用法:pt-archiver [OPTIONS] --source DSN --where WHERE ; trunca ...