从零构建Flink SQL计算平台 - 1平台搭建概述
一、理想与现实
apache flink 是一个分布式流批一体化的开源平台。flink 的核心是一个提供数据分发、通信以及自动容错的流计算引擎。flink 在流计算之上构建批处理,并且原生的支持迭代计算,内存管理以及程序优化。
实时计算(alibaba cloud realtime compute,powered by ververica)是阿里云提供的基于 apache flink 构建的企业级大数据计算平台。在 pb 级别的数据集上可以支持亚秒级别的处理延时,赋能用户标准实时数据处理流程和行业解决方案;支持 datastream api 作业开发,提供了批流统一的 flink sql,简化 bi 场景下的开发;可与用户已使用的大数据组件无缝对接,更多增值特性助力企业实时化转型。
apache flink 社区迎来了激动人心的两位数位版本号,flink 1.10.0 正式宣告发布!作为 flink 社区迄今为止规模最大的一次版本升级,flink 1.10 容纳了超过 200 位贡献者对超过 1200 个 issue 的开发实现,包含对 flink 作业的整体性能及稳定性的显著优化、对原生 kubernetes 的初步集成以及对 python 支持(pyflink)的重大优化。
flink 1.10 同时还标志着对 blink的整合宣告完成,随着对 hive 的生产级别集成及对 tpc-ds 的全面覆盖,flink 在增强流式 sql 处理能力的同时也具备了成熟的批处理能力。
在过去的2019年,大数据领域的flink异常火爆,从年初阿里巴巴高调收购flink的母公司,到秋天发布的1.9以及最近的1.10版本完成整合阿里blink分支,各类分享文章和一系列国内外公司应用案例,都让人觉得flink是未来大数据领域统一计算框架的趋势。尤其是看过阿里云上的实时计算平台,支持完善的sql开发和批流都能处理的模式让人印(直)象(流)深(口)刻(水)。但是相对于公有云产品,稍微有点规模的公司都更愿意使用开源产品搭建自己的平台,可是仔细研究flink的官方文档和源码,准备撸起袖子开干时,才发现理想和现实的差距很大……
首先是阿里实时计算平台产品的sql开发界面:
然而现实中flink所支持的sql开发api是这样的:
// create a tableenvironment for specific planner batch or streaming tableenvironment tableenv = ...; // see "create a tableenvironment" section // register a table tableenv.registertable("table1", ...) // or tableenv.registertablesource("table2", ...); // or tableenv.registerexternalcatalog("extcat", ...); // register an output table tableenv.registertablesink("outputtable", ...); // create a table from a table api query table tapiresult = tableenv.scan("table1").select(...); // create a table from a sql query table sqlresult = tableenv.sqlquery("select ... from table2 ... "); // emit a table api result table to a tablesink, same for sql result tapiresult.insertinto("outputtable"); // execute tableenv.execute("jobname");
最后翻遍flink文档发现提供了一个实验性质的命令行sql客户端:
此外当我们用开源flink代码部署一套集群后,整个集群有 jobmanager 和 taskmanager 两种角色,其中 jobmanager 提供了一个简单的管理界面,提供了上传jar包执行任务的功能,以及一些简单监控界面,此外还提供一系列管理和监控的 rest api,可惜都没有和sql层面直接相关的东西。
之所以有这一系列理想与现实的差异,是因为flink更多的定位在计算引擎,在开发界面等方面暂时投入较少,但是每写一个sql然后嵌入到代码中编译成jar包上传到flink集群执行是客(小)户(白)所不能接受的,这也就需要我们自己开发一套以sql作业为中心的管理平台(对用户暴露的web系统),由该平台管理 flink 集群,共同构成 flink sql 计算平台。
二、平台功能梳理
一个完整的sql平台在产品流程上至少(第一版)需要有以下部分。
sql作业管理:新增、调试、提交、下线sql任务
数据源和维表管理:用ddl创建数据源表,其中维表也是一种特殊数据源
数据汇管理:用ddl创建数据结果表,即 insert into 结果表 select xxx
udf管理:上传udf的jar包
调度和运维:任务定时上下线、任务缩容扩容、savepoint管理
监控:日志查看、指标采集和记录、报警管理
其他:角色和权限管理、文档帮助等等……
除了作为web系统需要的一系列增删改查和交互展示功能外,大部分flink集群管理功能可以通过操作flink集群提供的rest接口实现,但是其中没有sql相关内容,也就是前面四项功能(提交sql、ddl、udf,后文统称提交作业部分)都需要自己实现和 flink 的交互代码,因此如何更好地提交作业就成了构建该平台的第一个挑战。