首页 技术 正文
技术 2022年11月23日
0 收藏 335 点赞 3,437 浏览 2107 个字

最近flink真是风生水起,但是浪院长看来这不过是阿里错过了创造spark影响力之后,想要在flink领域创建绝对的影响力。但是,不可否认flink在实时领域确实目前来看独树一帜,当然也有它不适合的地方,比如今天要推荐的第一个基于flink开发的项目,流表和维表的join,还有很多地方还是用spark streaming更合适,但是整体的流处理而言flink确实很优秀,虽然目前测出了一些bug,后面会发文说明一下flink开发时候常见的坑和已有的自身bug。接下来转入正题。

flinkStreamSQL

熟悉flink的应该都了解,flink支持流表之间的join,但到1.6为止都不支持流表和维表的join。浪尖最近,也在开发流平台,需要到flink流表和维表的join。那么针对这个大家第一印象,可以写个算子去实现,比如map等。但是浪尖这里开发的流平台不是说自己写api,而是用户通过sql去实现创建source,sink,udf,sql等,这个时候要进行维表join,大家可能是想到了udf。是的对于只有一个维表的情况下使用udf比较方便,但是多个维表,相对就麻烦很多了。

而基于flink开发的flinkStreamSQL主要是实现了flink 流表和维表的join,其主要功能如下:

自定义create table 语法(包括源表,输出表,维表)

自定义create function 语法

实现了流与维表的join

浪尖花了个把小时看了一下源码,源码思路很清晰,主要是两个步骤:

用flink api实现维表的功能: 要实现维表功能就要用到 flink Aysnc I/O 这个功能,是由阿里巴巴贡献给apache flink的。关于异步IO的介绍,可以参考:https://yq.aliyun.com/articles/457385

解析流与维表join的sql语法转化成底层的flinkAPI

源码下载地址:

https://github.com/DTStack/flinkStreamSQL

为了方便大家阅读,这里浪尖也把维表转化的过程主要函数贴出来吧:

主函数
Main#main

SQL解析
SqlTree sqlTree = SqlParser.parseSql(sql)
拆读
SqlParser#parseSql
TableInfoParserFactory#parseWithTableType

注册表
registerTable

存在维表的话,维表转换与逻辑sql执行
SideSqlExec#exec
也即是
sideSqlExec.exec(result.getExecSql(), sideTableMap, tableEnv, registerTableCache);

不存在维表的话
tableEnv.sqlUpdate(result.getExecSql());

SqlSession sqlSession=null;List<User> userList=new ArrayList<User>(); try{    sqlSession=MyBatisUtil.createSqlSession();    User user=new User(www.furggw.com);    user.setUserName("赵");    user.setUserRole(www.mingrenf178.com);    userList=sqlSession.getMapper(UserMapper.class).getUserListByUser(user);}catch (Exception ex){    ex.printStackTrace();}finally {    MyBatisUtil.closeSqlSession(sqlSession);}for (User user:        userList) {    System.out.println(user.getUserName()+"\t"+user.getUserRole());}

使用Map入参编写接口

List<User> getUserListByMap(Map<www.ysyl157.com String,String> userMap);

编写UserMapper.xml文件

<select id="getUserListByMap" resultType="User" parameterType=www.mcyllpt.com"Map">    SELECT * FROM USER www.meiwanyule.cn WHERE userName LIKE concat('%',#{userName},'%')    and userRole=#{userRole}

FlinkX

FlinkX主要是用来做数据同步的,实现了多种异构数据源之间高效的数据迁移。

不同的数据源头被抽象成不同的Reader插件,不同的数据目标被抽象成不同的Writer插件。理论上,FlinkX框架可以支持任意数据源类型的数据同步工作。作为一套生态系统,每接入一套新数据源该新加入的数据源即可实现和现有的数据源互通。

在底层实现上,FlinkX依赖Flink,数据同步任务会被翻译成StreamGraph在Flink上执行

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,905
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,430
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,247
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,058
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,690
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,727