Flink(三)Flink的主力APIDataStreamAPI
大家好,我是 杰哥
今天,继续来探索 Flink ,今天我们主要来看看 Flink 为我们所提供的 分层 API 一 Flink 的分层 API
Flink 不仅具有高吞吐、低延迟、高可用等优秀特性,而且还提供了 易于使用的分层 API ,所以它也是一个 易于开发 的框架,它的 API 分层 如图所示
Flink 包含三层 API : 低级 APIs - 有状态处理、 核心 APIs - DataStream API 以及 高级 APIs - Table API & SQL 1、有状态处理
最底层级的抽象仅仅提供了 有状态流 ,它将处理函数(Process Function)嵌入到了 DataStream API 中。通过实现 ProcessFunction 接口来进行操作。 ProcessFunction 可以处理一或两条输入数据流中的单个事件或者归入一个特定窗口内的多个事件。它提供了对于时间和状态的细粒度控制。开发者可以在其中任意地修改状态,也能够注册定时器用以在未来的某一时刻触发回调函数 2、核心 APIs-DataStream API
DataStream ?是不是感觉还有点儿熟悉呢?
是的,上一节的例子里面,它就出现过,我们使用 DataStream 类来存放 Flink 程序中的数据集合,供 Flink 进行处理 // 2- 读取文本流 (nc -lk 7777) DataStreamSource lineDataStream = env.socketTextStream("localhost", 7777);
其中 DataStreamSource 其实就是集成自 DataStream 而这里所提到的 DataStream API 的名字就来自于 DataStream 类。这个类中,可以存放包含重复项的不可变数据集合。集合中的数据可以是有限的,也可以是无界的
DataStream 在使用方面类似于常规的 Java 中的集合,但在一些关键方面有很大的不同,比如它们是不可变的,这意味着一旦创建了它们,就不能添加或删除元素。此外,我们也不能查看里面的元素,只能使用 DataStream API 操作 (也称为转换)对它们进行一些变换操作
可以通过在 Flink 程序中添加源来创建初始 DataStream 。然后,再可以从中派生新的流,并使用映射、过滤器等 API 方法将它们组合在一起 3、Table API & SQL API
Table API 是一个针对 Java、Scala 和 Python 的语言集成查询 API ,它允许以非常直观的方式组合来自关系操作符(如选择、筛选和连接)的查询。 Flink 的 SQL API 基于 Apache Calcite ,它实现了 SQL 标准的语法
Flink 提供的最高层级的抽象是 SQL 。这一层抽象在语法与表达能力上与 Table API 类似, 但是是以 SQL 查询表达式的形式表现程序。 SQL 抽象与 Table API 交互密切,同时 SQL 查询 可以直接在 Table API 定义的表上执行
Flink 的 分层 API 中,最主要、最常用的是 DataStream API 和 Table API & SQL 。我们可以将两者单独使用,也可以混合使用,取决于我们具体的应用场景 二 DataStream API 认识
我想,从它的 操作步骤 来认识它,应该是比较直观的
类似于我们曾经了解到的 JDBC 会有固定的 7 个步骤,使用 Flink 的 DataStream API 进行数据的处理,实际上也包含以下 5 个固定步骤,而 DataStream API 也可以随之被分为 5 类: 1、设置执行环境 2、读取输入流 3、转换操作 4、输出到一个或多个数据汇中 5、执行程序
我们来分别看一下 1、设置执行环境
在 Flink 中,可以使用 StreamExecutionEnvironment 的下列三种方式进行执行环境的创建 getExecutionEnvironment(); createLocalEnvironment(); createRemoteEnvironment(String host, int port, String... jarFiles);
其中前两个表示创建的是 本地环境 ,即表示 Flink 程序运行在 本地机器 。还可以通过指定远程机器的 主机名 、 端口号 以及 程序本身所生成的 jar 包最终拷贝到的路径 ,创建一个 远程执行环境 ,使得 Flink 程序运行在所指定的主机上
2、读取输入流
StreamExecutionEnvironment 为我们提供了一系列创建流式数据源的方法,使得我们可以将数据流读取到应用中。这些数据流可以来自于 文件、数据库、消息队列 等 读取的数据,就可以统一放入 DataStream 对象中
1)从集合中读取数据 ArrayList user = new ArrayList<>(); user.add(new User("Mary","./home",1000L)); user.add(new User("Bob","./cart",2000L)); DataStream stream = env.fromCollection(user);
2)从文件中读取数据 DataStream stream = env.readTextFile("words.txt");
3)从 Socket 读取数据 DataStream stream = env.socketTextStream("localhost", 7777);
4)从消息中心读取数据 DataStreamSource stream = env.addSource(new FlinkKafkaConsumer( "clicks", new SimpleStringSchema(), properties ));
5)自定义 Source 如果我们需要读取数据的数据源, Flink 没有为其提供读取数据源的方法,我们就可以通过 Flink 提供的自定义 Source 的方式进行了 那就只好自定义实现 SourceFunction 了。接下来我们创建一个自定义的数据源,实现 SourceFunction 接口。主要重写两个关键方法: run ()和 cancel () run ()方法:使用运行时上下文对象(SourceContext)向下游发送数据;cancel ()方法:通过标识位控制退出循环,来达到中断数据源的效果。3、转换操作
当数据被存入 DataStream 对象中后,我们就可以对它进行转换操作了 转换的类型有多种多样。有些会重新组织一下 DataStream 中的数据流,比如对这些数据进行一次分组或者分区;有些呢,就会生成一个新的 DataStream (类型可能会发生变化)
比如,使用 map() 可以将一个输入流中的所有正方形全部转换为圆形
今天在这里就不细说了,下次文章会专门为大家介绍 DataStream API 的转换操作 4、输出结果
一般场景下,我们将数据处理的结果总是会发送到某些外部系统,比如 文件、数据库,以及消息中心 中等,当然测试时,可以直接输出至 标准输出 中
比如,输出到文件的方式如下: StreamingFileSink fileSink = StreamingFileSink .forRowFormat(new Path("./output"), new SimpleStringEncoder<>("UTF-8")) .withRollingPolicy( DefaultRollingPolicy.builder() .withRolloverInterval(TimeUnit.MINUTES.toMillis(15) ) .withInactivityInterval(TimeUnit.MINUTES.toMillis(5 )) .withMaxPartSize(1024 * 1024 * 1024) .build()) .build(); // 将 Event 转换成 String 写入文件 stream.map(Event::toString).addSink(fileSink);
此外,还可以输出到 Kafka , mysql , pulsar 等
最新版本的 Flink 所支持的所有输入输出如下:
5、执行程序
在应用定义完成之后,我们就可以通过 StreamExecutionEnvironment 类中的 execute () 方法进行执行
Flink 被设计为了 延迟计算 的方式执行,在 执行 execute() 方法之前,前面的所有程序,只是在执行环境中构建了一个执行计划。也就是说,只有执行了 execute() 方法之后,前面定义的 Flink 应用程序才会被真正执行
这 5 个步骤看完了,我们再将那个简单的实例拿过来看看,确认一下是否是这样 public class StreamWordCount { public static void main(String[] args) throws Exception{ // 1-创建执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 2-读取文本流 (nc -lk 7777) DataStreamSource lineDataStream = env.socketTextStream("localhost", 7777); // 3-转换操作 // 3.1 收集各个单词,定义为二元组 SingleOutputStreamOperator> streamOperator = lineDataStream.flatMap((String line, Collector> out) -> { String words[] = line.split(" "); for (String word :words) { out.collect(Tuple2.of(word, 1L)); } }).returns(Types.TUPLE(Types.STRING, Types.LONG)); // 3.2 分组 KeyedStream, String> keyedStream = streamOperator.keyBy(data -> data.f0); // 3.3-统计 SingleOutputStreamOperator> sum = keyedStream.sum(1); // 4-打印 sum.print(); // 5-启动执行 env.execute(); } }
这个其实就是严格按照我们上述所提到的步骤来走的
其中第 2 步骤,是通过一行一行地读取 socket 文本流内容,进行数据源的输入的,将所输入的数据流存入 lineDataStream 中
而第 3 步骤,则是对 lineDataStream 中的数据进行转换处理操作。首先将各个数据通过 flatMap() 方法转换为二元组,然后使用 keyBy() 方法,对其元素进行分组,接着再使用 sum() 方法,对分组之后的元素进行求和操作
随着数据流的不断输入,所输入的每个单词出现的次数便会通过程序被源源不断地输出 总结
Flink 提供了 分层 API ,便于我们进行开发。在实际开发中,我们使用最多的就是 DataStream API ,而怎样认识 DataStream API 呢?从它的操作步骤来看,可以分为 5 个步骤,也就是说 DataStream API 可以分为 5 大类:
1、设置执行环境
2、读取输入流
3、转换操作
4、输出到一个或多个数据汇中
5、执行程序
嗯,就这样。每天学习一点,时间会见证你的强大
欢迎大家关注我们的公众号【青梅主码】,一起持续性学习吧~
往期精彩回顾
总结复盘
架构设计读书笔记与感悟总结
带领新人团队的沉淀总结
复盘篇:问题解决经验总结复盘
网络篇
网络篇(四):《图解 TCP/IP》读书笔记
网络篇(一):《趣谈网络协议》读书笔记(一)
事务篇章
事务篇(四):Spring事务并发问题解决
事务篇(三):分享一个隐性事务失效场景
事务篇(一):毕业三年,你真的学会事务了吗?
Docker篇章
Docker篇(六):Docker Compose如何管理多个容器?
Docker篇(二):Docker实战,命令解析
Docker篇(一):为什么要用Docker?
..........
Spring Cloud篇章
Spring Cloud(十三):Feign居然这么强大?
Spring Cloud(十):消息中心篇-Kafka经典面试题,你都会吗?
Spring Cloud(九):注册中心选型篇-四种注册中心特点超全总结
Spring Cloud(四):公司内部,关于Eureka和zookeeper的一场辩论赛
..........
Spring Boot篇章
Spring Boot(十二):陌生又熟悉的 OAuth2.0 协议,实际上每个人都在用
Spring Boot(七):你不能不知道的Mybatis缓存机制!
Spring Boot(六):那些好用的数据库连接池们
Spring Boot(四):让人又爱又恨的JPA
SpringBoot(一):特性概览
..........
翻译
[译]用 Mint 这门强大的语言来创建一个 Web 应用
【译】基于 50 万个浏览器指纹的新发现
使用 CSS 提升页面渲染速度
WebTransport 会在不久的将来取代 WebRTC 吗?
.........
职业、生活感悟
你有没有想过,旅行的意义是什么?
程序员的职业规划
灵魂拷问:人生最重要的是什么?
如何高效学习一个新技术?
如何让自己更坦然地度过一天?
..........
李连杰静修3周更新动态,一身黑衣显低调,却被嘲像70岁老翁李连杰静修3周更新动态,一身黑衣显低调近日,李连杰在寺院静修3周后,在个人社交账号首次更新动态,照片中的他,引起了网友们的关注。照片中,他站在寺庙门口前,带着一个黑色的棒球帽,一身
毛晓彤参加奔跑吧面临拆队成员们在场馆内进行卡牌的寻找,在这个过程中有的队伍中队员被其他队伍的队员上去就给淘汰掉了。红队可以说是整个游戏的淘汰王,在寻找卡牌的过程中,他们不断发挥自己的优势,去淘汰一个又一个
颜值不够别硬撑!让这12位女演员告诉你,什么叫第一美人古装剧里的第一美人,在未出场之前,总是给人无限遐想无限期待。然而,很多第一美人就是一个笑话,长相寒碜,撑不起人设,让观众大失所望。今天为大家盘点12位真正的第一美人,个个姿容绝世,
降息房贷还的少,存款利息到手也少五年期以上LPR再降15个基点是好是坏?因人而异有利good房贷利率降,对有房贷人群有利,每月的房贷将减少,多年下来可以节省不少钱。有弊bad三年五年以上的银行长期存款利率降,保本
都2022了,你还在相信这些社保谣言?养老保险交满15年就够了?交两份社保,退休可以领双份养老金?个人社保可以退费,把钱退出来用?日常生活中,我们经常听到各种各样关于社保的说法,不过其中很多都是谣言,大家可千万别相信!
海外网评中国与世界共享智能红利2022中国国际智能产业博览会主会场重庆国际博览中心。新华社记者黄伟摄8月22日,2022中国国际智能产业博览会在重庆开幕,国内外500多家参展单位将通过线上或线下方式,集中展示大
贷款利率再次下调,盘活定期存款和大额存单资金,用1个方法更好银行贷款利率又下降了,这不仅有利于房贷客户节省贷款利息支出,也有利于广大居民更好地打理银行定期存款。2022年8月份的贷款市场报价利率(LPR)又下调了,其中,一年期的LPR从之前
线下门店纷纷关闭,家居卖场为何陷入尴尬之地?家居卖场当下正面临严峻的挑战。不久前,全球知名家具品牌宜家宣布在中国市场关闭上海杨浦店。此前的4月1日,宜家中国已宣布贵阳线下门店关闭。3个月连续关闭2家门店,在中国已经深耕了20
8月24日中国股市即将开盘,刚刚得知3大消息,今天行情怎么走?今天是8月24日,盘后证券市场传来三则重要消息,其中百亿基金经理抛弃所有框架,什么能涨我们就买,让人哭笑不得,A股还有价值投资可言吗?短期投机氛围浓郁,万千散户该如何应对?本期文章
A股农业崛起细分农业龙头股盘点近期生态农业板块盘中出现明显异动,细分行业龙头大全!近期农业板块因本轮高温干旱上涨,今天农业股全线走强,其中细分种业板块放量高开高走,盘中一度大涨逾4。另外在加上5大粮商ABCD,
明年起,或要做好资产贬值的准备?以下4件事尽量不要去做从今年开始,国家多个部门联合出台了多项房地产调控政策,通过监管金融等多个维度联合对房地产进行稳定,使得地产行业的发展空间与潜力大大缩小,房价上升的可能性也有所下降。部分地区甚至还要
女性对自己做的3个行为,长期下来,可能会招惹麻烦,别不自知女性与男性对比之下,心思会更为细腻,对自己的健康会更为上心一点。而且,从中国的人均寿命来看,男女都呈现上升趋势,而男性的寿命总是没有女性长,有一部分原因,就在于女性更关心自己的健康
官方传来消息,幼儿园新规或有望于今年秋季实行,老师也有份引导语俗话说,好的开端是成功的一半。所以在所有学生开始接受教育的时候,最开始接触到的东西是非常重要的,每一个家长都特别重视孩子的学前教育。一方面希望他们在刚开始接受知识的时候接受到
赵丽颖,你果然是个狠人赵丽颖婚变那天,我正好在处理OA,突然电脑右下方弹出一条新闻,小赵离婚了。惊讶惊讶,还是惊讶。一是惊讶于小赵之快。结婚之快,离婚之快。前一天唱K点到歌曲知否,还和朋友讨论,浪子回头
vivo首款折叠屏平板电脑发布!还有7寸大屏旗舰4月11日,vivo举行发布会,正式发布旗下首款折叠屏旗舰vivoXFold首款平板vivoPad以及全新大屏旗舰vivoXNote等一系列新品。vivoXFold开启折叠屏2。0
小米vivo新机黑科技曝光,vivoX60惭愧价崩沦为百元机4月11日,博主DigitalChatStation爆料称,高品质2K柔性OLED显示器已经开始在2K价位段流行起来。因此,如果高端旗舰使用屏下摄像头技术,则必须同时实现高分辨率。
吃鸡主播试玩原神入迷,每天都提前下班,超管都看不下去了最近原神2。6版本开启之后,新地图和新剧情等又一次在国内外爆火起来,除了老玩家们在狂欢研究新游戏内容之外,还有不少新玩家加入了进来。要说其中最受关注的新玩家,肯定少不了绝地求生区的
所谓岁月静好,在休产假的时候,回娘家最能体会所谓岁月静好,在休产假的时候,回娘家最能体会。大宝交给舅舅或者午休,小宝好骗,BB车推推,出去放放风,就行了。下午5点的时候,风很大,微熹,推着小宝,就跟妈妈去摘番茄,摘菜吃。多少
5岁娃成为幼儿园里的小天才,全靠爷爷陪娃这样玩,羡慕极了闺蜜的孩子已经5岁,但是却数不清数,闺蜜甚至都怀疑自己的孩子是不是智商有问题。但是这样的孩子不是她一个,我家楼下邻居的孩子也是这样的。今年9月份,刚刚进入幼儿园,各方面表现都不太理
坐月子期间可以洗头吗?有什么注意事项?顺利产下宝宝的一瞬间,绝对是可喜可贺的,可是伴随而来的就是漫长的月子。坐月子是中国妈妈素有的传统,并且还有诸多的禁忌。很多老人家都说坐月子期间不能洗头洗澡,不能吃螃蟹,不能吹空调等
赏花访古饮泉,尽在京西门头沟春日生活打卡季行程概览出行方式自驾出行日期2022。4。9游玩地点1赏花访古处南港村(赏花)西落坡村(访古)桥耳涧村东落坡村2打水饮泉处西落坡村(九龙泉)樱桃泉。九龙泉樱桃泉环境特
美哉,韭菜坪有人说如果某一日厌倦了城市的拥挤和喧嚣,就停留在世界的某个角落,悠然做梦,安静唱歌。我时常在想,我所在的城市很幸运,我们得天独厚,无需来到遥远的角落,韭菜坪就是个非常适宜悠然做梦和