1、stream x
大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域 Apache Spark 和 Apache Flink 更是一个伟大的进步,尤其是Apache Flink被普遍认为是下一代大数据流计算引擎,我们在使用 Flink 时发现从编程模型, 启动配置到运维管理都有很多可以抽象共用的地方, 我们将一些好的经验固化下来并结合业内的最佳实践, 通过不断努力终于诞生了今天的框架 —— StreamX, 采用 java/scala 开发, 项目的初衷是 —— 让 Flink 开发更简单,使用StreamX开发,可以极大降低学习成本和开发门槛, 让开发者只用关心最核心的业务,StreamX 规范了项目的配置,鼓励函数式编程,提供了一系列开箱即用的Connectors,支持scala和java两套 api, 并且提供一个数据平台,基于Apache Flink 封装的一个可视化的,轻量级的 Flink Submit 系统,旨在简化 Flink 任务提交和管理运维,标准化了配置、开发、测试、部署、监控、运维的整个过程,其最终目的是打造一个一站式大数据平台,流批一体,湖仓一体的解决方案。
2、功能特性
- 开发脚手架
- 一系列开箱即用的 connectors
- 项目编译功能(maven 编译)
- 支持Applicaion 模式, Yarn-Per-Job模式启动
- 快捷的日常操作(任务启动、停止、savepoint,从savepoint恢复)
- 支持火焰图
- 支持notebook(在线任务开发)
- 项目配置和依赖版本化管理
- 支持任务备份、回滚(配置回滚)
- 在线管理依赖(maven pom)和自定义 jar
- 自定义 udf、连接器等支持
- Flink sql Submit
- Flink Sql WebIDE
- 支持 catalog、hive
3、架构
3.1 streamx-core
streamx-core 定位是一个开发时框架,关注编码开发,规范了配置文件,按照约定优于配置的方式进行开发,提供了一个开发时 RunTime Content和一系列开箱即用的Connector,扩展了DataStream相关的方法,融合了DataStream和Flink sql api,简化繁琐的操作,聚焦业务本身,提高开发效率和开发体验
3.2 streamx-pump(规划中)
pump 是抽水机,水泵的意思,streamx-pump的定位是一个数据抽取的组件,类似于flinkx,基于streamx-core中提供的各种connector开发,目的是打造一个方便快捷,开箱即用的大数据实时数据抽取和迁移组件,并且集成到streamx-console中,解决实时数据源获取问题,目前在规划中
3.3 streamx-console
streamx-console 是一个综合实时数据平台,低代码(Low Code)平台,可以较好的管理Flink任务,集成了项目编译、发布、参数配置、启动、savepoint,火焰图(flame graph),Flink SQL,监控等诸多功能于一体,大大简化了Flink任务的日常操作和维护,融合了诸多最佳实践。旧时王谢堂前燕,飞入寻常百姓家,让大公司有能力研发使用的项目,现在人人可以使用,其最终目标是打造成一个实时数仓,流批一体的一站式大数据解决方案
4、安装要求
5、使用
datastream
IDE开发你的java代码,提交到git,通过streamx的项目管理构建的你的项目,打包提交到集群执行。
原有的开发流程
- 编码
- 提交git
- 构建打包
- 上传jar
- 提交任务
现在
- 编码
- 提交git
- 拉取更新,打包上传提交一键处理
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');
6、与其它平台的比较
| 功能 | **Zeppelin ** | **StreamX ** |
|---|---|---|
| 任务状态监控 | 稍低,不能作为任务状态监控工具 | 较高 |
| 任务资源管理 | 无 | 有,但目前版本还不是很健全 |
| 本地化部署 | 稍低,on K8s模式只能将Zeppelin部署在K8s中,否则就需要打通pod和外部网络,但是这在生产环境中很少这样做的 | 可以本地化部署 |
| 多语言支持 | 较高,支持Python/Scala/Java多语言 | 一般,目前K8s模式和YARN模式同时支持FlinkSql,并可以根据自身需求,使用Java/Scala开发DataStream |
| Flink WebUI代理 | 目前还支持的不是很完整,主开发大佬目前是考虑整合ingress | 较好 , 目前支持ClusterIp/NodePort/LoadBalance模式 |
| 学习成本 | 成本较低,需要增加额外的参数学习,这个和原生的FlinkSql在参数上有点区别 | 无成本,K8s模式下FlinkSql为原生支持的sql格式;同时支持Custome-Code(用户编写代码开发Datastream/FlinkSql任务) |
| Flink多版本支持 | 支持 | 支持 |
| Flink原生镜像侵入 | 有侵入,需要在Flink镜像中提前部署jar包,会同jobmanage启动在同一个pod中,和zeppelin-server通信 | 无侵入,但是会产生较多镜像,需要定时清理 |
| 代码多版本管理 | 支持 | 支持 |