流批一体架构 比较 流批一体化平台_flink

背景

实时即未来,在实时处理流域 Apache Spark 和 Apache Flink 是一个伟大的进步,尤其是Apache Flink被普遍认为是下一代大数据流计算引擎, 我们在使用 Flink & Spark 时发现从编程模型, 启动配置到运维管理都有很多可以抽象共用的地方, 我们将一些好的经验固化下来并结合业内的最佳实践, 通过不断努力终于诞生了今天的框架 — StreamX, 项目的初衷是 — 让流处理更简单, StreamX不断提供了开发时便捷Api来加速开发, 还提供了一站式平台。


Flink流批一体越发成熟, 越来越多的企业开始大规模应用 Flink 来建设平台, 而Flink平台的建设是目前很多企业应用Flink的一道门槛。StreamX为解决这些痛点而生, 任务提交托管, 运维监控, FlinkSQL开发等做了很好的支持, Flink SQL任务独创型将SQL和依赖分离, 用户只管写SQL提交即可, 其他更多复杂的操作交给StreamX。

流批一体架构 比较 流批一体化平台_SQL_02

流批一体架构 比较 流批一体化平台_kafka_03

流批一体架构 比较 流批一体化平台_SQL_04

核心特性

  • 开发脚手架
  • 多版本Flink支持(1.11,x, 1.12.x, 1.13 )
  • 一系列开箱即用的connectors
  • 支持项目编译功能(maven 编译)
  • 在线参数配置
  • 支持Applicaion 模式, Yarn-Per-Job, K8s 模式启动
  • 快捷的日常操作(任务启动停止savepoint,从savepoint恢复)
  • 支持火焰图
  • 支持notebook(在线任务开发)
  • 项目配置和依赖版本化管理
  • 支持任务备份、回滚(配置回滚)
  • 在线管理依赖(maven pom)和自定义jar
  • 自定义udf、连接器等支持
  • Flink SQL WebIDE
  • 支持 catalog、hive
  • 任务运行失败发送告警邮件
  • 支持失败重启重试
  • 从任务开发阶段到部署管理全链路支持
  • ...

组成部分

Streamx有三部分组成,分别是streamx-core,streamx-pump 和 streamx-console

流批一体架构 比较 流批一体化平台_SQL_05

streamx-core

streamx-core 定位是一个开发时框架,关注编码开发,规范了配置文件,按照约定优于配置的方式进行开发,提供了一个开发时 RunTime Content和一系列开箱即用的Connector,扩展了DataStream相关的方法,融合了DataStreamFlink sql api,简化繁琐的操作,聚焦业务本身,提高开发效率和开发体验

streamx-pump

pump 是抽水机,水泵的意思,streamx-pump的定位是一个数据抽取的组件,类似于flinkx,基于streamx-core中提供的各种connector开发,目的是打造一个方便快捷,开箱即用的大数据实时数据抽取和迁移组件,并且集成到streamx-console中,解决实时数据源获取问题,目前在规划中

streamx-console

streamx-console 是一个综合实时数据平台, 低代码(Low Code)平台, FlinkSQL 开发工作台, 可以较好的管理Flink任务,集成了项目编译、发布、参数配置、启动、savepoint,火焰图(flame graph),Flink SQL, 监控等诸多功能于一体,大大简化了Flink任务的日常操作和维护,融合了诸多最佳实践。旧时王谢堂前燕,飞入寻常百姓家,让大公司有能力研发使用的项目,现在人人可以使用, 目标是打造成一个实时数仓,流批一体的一站式大数据解决方案。

LIVE DEMO

下面我们使用 streamx-quickstart 来快速开启 streamx-console 之旅, streamx-quickstart 是 StreamX 开发 Flink 的上手示例程序,具体请查阅

DataStream 任务

下面的示例演示了如何开发部署一个 DataStream 应用


StreamX 开发部署DataStream作业演示


FlinkSql 任务

下面的示例演示了如何开发部署一个 FlinkSql 应用


StreamX 开发部署FlinkSQL 作业演示


  • 项目演示使用到的 flink sql 如下
CREATE TABLE user_log (
    user_id VARCHAR,
    item_id VARCHAR,
    category_id VARCHAR,
    behavior VARCHAR,
    ts TIMESTAMP(3)
 ) WITH (
'connector.type' = 'kafka', -- 使用 kafka connector
'connector.version' = 'universal',  -- kafka 版本,universal 支持 0.11 以上的版本
'connector.topic' = 'user_behavior',  -- kafka topic
'connector.properties.bootstrap.servers'='kafka-1:9092,kafka-2:9092,kafka-3:9092',
'connector.startup-mode' = 'earliest-offset', -- 从起始 offset 开始读取
'update-mode' = 'append',
'format.type' = 'json',  -- 数据源格式为 json
'format.derive-schema' = 'true' -- 从 DDL schema 确定 json 解析规则
 );

CREATE TABLE pvuv_sink (
    dt VARCHAR,
    pv BIGINT,
    uv BIGINT
 ) WITH (
'connector.type' = 'jdbc', -- 使用 jdbc connector
'connector.url' = 'jdbc:mysql://test-mysql:3306/test', -- jdbc url
'connector.table' = 'pvuv_sink', -- 表名
'connector.username' = 'root', -- 用户名
'connector.password' = '123456', -- 密码
'connector.write.flush.max-rows' = '1' -- 默认 5000 条,为了演示改为 1 条
 );

INSERT INTO pvuv_sink
SELECT
  DATE_FORMAT(ts, 'yyyy-MM-dd HH:00') dt,
  COUNT(*) AS pv,
  COUNT(DISTINCT user_id) AS uv
FROM user_log
GROUP BY DATE_FORMAT(ts, 'yyyy-MM-dd HH:00');
  • 使用到 maven 依赖如下
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.48</version>
</dependency>

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-sql-connector-kafka_2.11</artifactId>
    <version>1.12.0</version>
</dependency>

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-jdbc_2.11</artifactId>
    <version>1.12.0</version>
</dependency>

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-json</artifactId>
    <version>1.12.0</version>
</dependency>
  • Kafka 模拟发送的数据如下
{"user_id": "543462", "item_id":"1715", "category_id": "1464116", "behavior": "pv", "ts":"2021-02-01T01:00:00Z"}
{"user_id": "662867", "item_id":"2244074","category_id":"1575622","behavior": "pv", "ts":"2021-02-01T01:00:00Z"}
{"user_id": "662867", "item_id":"2244074","category_id":"1575622","behavior": "pv", "ts":"2021-02-01T01:00:00Z"}
{"user_id": "662867", "item_id":"2244074","category_id":"1575622","behavior": "learning flink", "ts":"2021-02-01T01:00:00Z"}

任务启动流程

任务启动流程图如下

流批一体架构 比较 流批一体化平台_big data_06

streamx-console 提交任务流程

回顾2021

时间过的真快, 在2021年4月的时候 StreamX宣布开源, 从正式开源起 ,我们就秉承开源开放 ,公开透明的原则,鼓励和欢迎开发者们参与进来共同建设,目前star共计790+,fork共计276,开发者共计 23位,其中有 位已经是核心贡献者,issue 和 PR 处于活跃状态,我们总结了用户常见问题 FAQ,已有两个用户交流群,保持良好氛围,其中不乏apache项目的committer,PMC,各类框架平台作者,公号作者等... 

2021 年,我们持续保持版本迭代节奏,积极发展开发者, 分别于 7 月 14 日和 11 月 16 日 发布了 1.1.0  Release 和 1.2.0 Release 版本,接近 21 位 Contributor 为 StreamX 提交了多项优化和修复诸多新功能加入到 StreamX 中,在任务提交on k8s以及Flink多版本的支持上,我们探索出了一条特色道路,为后续SQL Data Studio等相关功能的建设奠定了坚实的基础。

在2021年11月,StreamX成功被开源中国评选为GVP - Gitee「最有价值开源项目」这对我们来说是莫大的鼓励,我们做的东西终于被认可了。

流批一体架构 比较 流批一体化平台_big data_07

在 2021 年的最后一天,我们也非常荣幸可以获得 2021 年度 OSC 中国开源项目评选的 「最受欢迎项目」,这对我们而言是最好的新年礼物。

流批一体架构 比较 流批一体化平台_flink_08

未来规划

目前 StreamX 已完成 Flink 任务的托管,这部分工作非常重要,感谢所有开发者们付出的努力。但这只是万里长征第一步,接下来的 1.3.0 中我们关注的重点是流式数仓(Streaming-Warehouse) 和 云原生(Cloud-Native)。计划会新增全新的开发工作台 - SQL Workbench(草稿、调试、预览、发布、锁定、版本管理...)具体请移步 1.3.0的 roadmap。

1.3.0 roadmap: StreamX 1.3.0 roadmap · Issue #602 · streamxhub/streamx · GitHub  

流批一体架构 比较 流批一体化平台_kafka_09

[ SQL Workbench Preview]

参与贡献

StreamX 遵循 Apache-2.0 开源协议,将会是个长期更新的活跃项目,自项目开源以来就受到很多同行的关注和认可,其中不乏业内大佬。目前在没有任何形式推广的情况下,靠口碑在不到一年的时间里已经累计 780+ star,于2021年11月荣获开源中国「最有价值开源项目」。随后荣获「2021 年度 OSC 中国开源项目评选」的「最受欢迎项目」,我们坚信未来会更好。

流批一体,流式数仓,数据湖是大数据领域的趋势,StreamX 虽离这个目标还有一段距离,但我们始终坚信: 道阻且长,行则将至,行而不辍,未来可期。我们会进一步积极进取,相关功能持续迭代,进一步建设好社区,和所有社区小伙伴一起努力,让 StreamX 成为一个功能完善,体验更佳,用户更多的产品,可以被更多人认可。真诚欢迎热爱开源的伙伴加入到贡献中来,为做一个优秀实用的好项目献上一份自己的力量。