背景
实时即未来,在实时处理流域
Apache Spark
和Apache Flink
是一个伟大的进步,尤其是Apache Flink
被普遍认为是下一代大数据流计算引擎, 我们在使用Flink
&Spark
时发现从编程模型, 启动配置到运维管理都有很多可以抽象共用的地方, 我们将一些好的经验固化下来并结合业内的最佳实践, 通过不断努力终于诞生了今天的框架 —StreamX
, 项目的初衷是 — 让流处理更简单, StreamX不断提供了开发时便捷Api来加速开发, 还提供了一站式平台。
Flink流批一体越发成熟, 越来越多的企业开始大规模应用 Flink 来建设平台, 而Flink平台的建设是目前很多企业应用Flink的一道门槛。StreamX为解决这些痛点而生, 任务提交托管, 运维监控, FlinkSQL开发等做了很好的支持, Flink SQL任务独创型将SQL和依赖分离, 用户只管写SQL提交即可, 其他更多复杂的操作交给StreamX。
核心特性
- 开发脚手架
- 多版本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
streamx-core
streamx-core
定位是一个开发时框架,关注编码开发,规范了配置文件,按照约定优于配置的方式进行开发,提供了一个开发时 RunTime Content
和一系列开箱即用的Connector
,扩展了DataStream
相关的方法,融合了DataStream
和Flink 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"}
任务启动流程
任务启动流程图如下
streamx-console 提交任务流程
回顾2021
时间过的真快, 在2021年4月的时候 StreamX宣布开源, 从正式开源起 ,我们就秉承开源开放 ,公开透明的原则,鼓励和欢迎开发者们参与进来共同建设,目前star共计790+,fork共计276,开发者共计 23位,其中有 3 位已经是核心贡献者,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「最有价值开源项目」这对我们来说是莫大的鼓励,我们做的东西终于被认可了。
在 2021 年的最后一天,我们也非常荣幸可以获得 2021 年度 OSC 中国开源项目评选的 「最受欢迎项目」,这对我们而言是最好的新年礼物。
未来规划
目前 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
[ SQL Workbench Preview]
参与贡献
StreamX 遵循 Apache-2.0 开源协议,将会是个长期更新的活跃项目,自项目开源以来就受到很多同行的关注和认可,其中不乏业内大佬。目前在没有任何形式推广的情况下,靠口碑在不到一年的时间里已经累计 780+ star,于2021年11月荣获开源中国「最有价值开源项目」。随后荣获「2021 年度 OSC 中国开源项目评选」的「最受欢迎项目」,我们坚信未来会更好。
流批一体,流式数仓,数据湖是大数据领域的趋势,StreamX 虽离这个目标还有一段距离,但我们始终坚信: 道阻且长,行则将至,行而不辍,未来可期。我们会进一步积极进取,相关功能持续迭代,进一步建设好社区,和所有社区小伙伴一起努力,让 StreamX 成为一个功能完善,体验更佳,用户更多的产品,可以被更多人认可。真诚欢迎热爱开源的伙伴加入到贡献中来,为做一个优秀实用的好项目献上一份自己的力量。