streamx Flink开发平台简介

263 阅读5分钟

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的项目管理构建的你的项目,打包提交到集群执行。

原有的开发流程

  1. 编码
  2. 提交git
  3. 构建打包
  4. 上传jar
  5. 提交任务

现在

  1. 编码
  2. 提交git
  3. 拉取更新,打包上传提交一键处理

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通信无侵入,但是会产生较多镜像,需要定时清理
代码多版本管理支持支持

6、参考文档

streamx官方文档