更多Flink系列文章请点击Flink系列文章
更多大数据文章请点击大数据好文推荐
flinkStreamSQL是袋鼠云大数据团队基于开源的flink,对其实时sql进行了扩展;主要实现了流与维表的join,支持原生flink SQL所有的语法。
优点是可以纯SQL的方式提交应用运行。
缺点是目前版本只支持到Flink 1.8,不支持1.9以后的Blink特性,很多函数都无法使用需要自己写UDF。
提了个issue,回复说4月底才能支持Flink1.10,我们等不起。。。
更多详情可参考:
原生FlinkSQL没有实现对数据来源、数据目的地的SQL化,必须要写代码。
这个就很坑了,一般来说,SQL面向数据分析人员,如果要写代码无疑提高了门槛。flinkStreamSQL里面将这一切都用SQL解决。袋鼠云声称的数据计算采用SQL的优势:
此外,FlinkSQl还支持了流与流、流与维表Join:
这里摘自Flink-SQL的扩展实现
将创建源表的sql语句转换为flink的operator
目前flinkStreamSQL只支持Kafka数据源,已经满足我们要求。其实我们在flinkStreamSQL中写的建表语句就是映射到Flink Table类,各个属性就是Kafka数据源的属性,注册表时调用以下Flink代码:
StreamTableEnvironment.registerTable(tableName, table);
将创建的输出表sql语句转换为flink的operator
writeRecord
方法将数据写入外部数据源将UDF语句转换为flink的operator
Flink原生对UDF提供两种类型的实现方式:
flinkStreamSQL将用户提供的实现了上述接口class所在的jar添加到URLClassLoader,并加载指定的class ,然后调用TableEnvironment.registerFunction(funcName, udfFunc)
即完成了UDF注册。
维表功能的实现
Flink原生SQL不支持注册表和外部数据源Join,但我们常常需要用Flink做数据预处理时就join维表补足表的维度信息字段。
flinkStreamSQL使用定时更新缓存外部被Join数据源、阿里贡献的异步获取外部数据源数据的RichAsyncFunction、解决了维表不断变化、IO吞吐问题。
另一方面,使用Flink项目依赖的calcite做SQL解析出的AST,迭代搜索出维度表,区分出维表和非维表即可(如果有维表就把这个join的维表的语句单独拆来,用Flink的TableAPI和StreamAPi 生成新DataStream,在把这个DataStream与其他的表再做join即可)。
参考:
Oppo在手机上做了基于Android的ColorOS,日活2亿,构建了不少应用,每天产生海量数据。
这里还可以看看Oppo的数据中台:
这里的全域数据是指公司业务数据全都打通后形成的统一数据自产。
以前Oppo是离线数仓:
Presto那条线是可直接通过Presto即席查询和提数。
需求背景:
主要是有很多实时也无需求提出。比如实时推送商圈广告,就需要实时对用户打商圈标,此时t+1肯定就不行。所以需要实时打标
在数据平台这边,因为离线数仓大多是t+1的,所以调度平台、标签计算和导入大多集中在凌晨,资源竞争严重,集群压力大,耗时长。而数据质量监控也是t+1,必须在数据产出后进行事后校验,无法及时发现问题,增加起夜率。
离线迁移到实时,必须注意平滑,即对用户来说使用习惯和抽象不能有根本改变。
虽然FlinkSQL可以用SQL定义输入输出表,但仍然需要编码,这对于ETL同事来说并不友好,所以最好是有个界面,能直接用SQL定义、提交流作业。但FlinkSQL并未提供该功能,只能自己实现。
OPPO的流式SQL凭条界面构想如下:
可以看到,该界面就如同Navicat、HUE等。
Job
是SQL作业的抽象,封装SQL及作业资源信息。
Job Store
托管所有Job。
定义
Wstream
,其实时平台演进路线如下主要业务分为 实时ETL、实时数仓(实时数据数据计算、模型加工、存储、业务指标实时计算服务于运营人员)、实时监控(包括系统行为如业务指标和用户行为如金融风控)、实时分析(如实时标签、特征平台、实时推荐等)
流平台Wstream架构如下
FlinkSQL这块儿扩展如下:
用户提交任务可使用Sql client的cli方式以及Wstream界面的sql任务编辑器,同时对用户提供了向导化配置方式,解决用户定义table需要了解复杂的参数设置(比如),用户只需关心业务逻辑处理,像开发离线Hive一样使用sql开发实时任务,比如以下Flink SQL DDL配置:
58流平台支持如下:
腾讯选择用 Flink 作为新一代的实时流计算引擎,并对社区版的 Flink 进行了深度的优化,在此之上构建了一个集开发、测试、部署和运维于一体的一站式可视化实时计算平台—— Oceanus
腾讯云的流平台技术演进路线,也是Storm(没有内置状态的支持,没有提供完备的容错能力,没有内置的窗口 API,core API 无法提供 Exactly-once 的语义保证等)->Flink,但没有SparkStreaming。可以看到,他们把流计算平台不仅应用与公司内部,还上云给客户使用。
Oceanus技术架构如下
长链路且快速变化的业务
严选作为一个 ODM 电商,整个业务链度从商品采购、生产、仓库、到销售这个阶段可以在主站 APP 上购买或者分厂购买,然后通过商户配送到达消费者。链度是非常长的,这也决定数据的数据域非常广;
严选作为一个成长的电商,会有很多新的业务出现。
越来越多的实时数据需求
目前需要更多的实时数据来做业务决策,需要依据销售情况做一个资源位的调整;
同时有些活动也需要实时数据来增强与用户的互动。
如果数据有实时和离线两种方案,优先考虑实时的,如果实时实现不了再考虑离线的方式。
越来越高的数据质量要求
因为数据会直接影响业务决策,影响线上运营活动效果,因此对数据质量的要求越来越高。
针对这样的项目背景提出了实时数仓的三个设计目标:
还介绍了对 Hyperloglog HBase MySQL Greenplum的一些使用优化。
数据质量分为两个方面来介绍,离线/实时数据一致性和数据监控。
数据一致性主要针对实时与离线的数据一致性,同一个指标实时与离线都会产出:
梳理实时数仓中数据依赖关系,以及实时任务的依赖关系,从底层 ODS 到 DIM 再到 DM,以及 DM 层被哪些模型用到,将整个链度串联起来。
还有业务后台仓配产能监控、物流时效监控、库存预警、商品变更通知。