当前位置: 首页 > news >正文

轻量级大数据ETL的开发框架——​七牛云内部平台架构 QStreaming

QStreaming 背景

首先在进入主题之前我们先来回顾下经典的大数据 ETL 架构有哪些?

1. Lambda 架构

2. Kappa 架构

3. 混合架构

它们之间的区别如下:

七牛的大数据平台在搭建过程中也经历了上面几个架构的变迁,也就是从最早的 Lambda 架构,到尝试使用 Kappa 架构,再到后面的新型混合 ETL 架构,为了满足业务需求,开发人员在这几个架构中进行折中选择,但是我们发现上面几个架构对于大数据的开发人员要求较高,主要体现在下面几个方面:

  1. 涉及到众多的框架,如流处理框架就有早期的 Apache Storm,到后面的 Apache Spark Streaming,再到 Apache Flink,学习门槛较高。

  2. 不同计算框架对数据源的定义不统一,造成输入输出较难管理。

  3. 数据开发人员新开发一个业务指标,不同开发人员写出的代码风格不统一,开发效率低,很难进行工程化,后期维护也必将困难。

为了解决上面的几个问题,团队选择基于 Apache Spark 开发了 QStreaming ( https://github.com/qiniu/QStreaming )这套简单轻量级 ETL 开发框架。

QStreaming 特性

数据源支持

  1. Apache Kafka
  2. Apache Hbase
  3. Hadoop HDFS/S3
    4 .OSS对象存储
  4. Jdbc
  5. MongoDB
  6. Apache Hudi

1. DDL 定义输入源

这里面“stream”关键字代表定义了一个流表,并且是连接到 Kafka 消息中间件。

2. 流处理 Watermark 的 DSL 支持

在 DSL 中添加 Watermark,主要有 2 种方式:

  1. 在 DDL 中指定

  1. 在 create view 语句中指定

  1. 动态 UDF
    比如下面这个转换一个日期字符串为时间戳格式。

  1. 流处理的多输出

这个特性主要是通过 Spark Structed Streaming 的 foreachBatch 实现的。

  1. 变量渲染

变量渲染经常在一些定时调度批处理中非常有用,如下根据小时读取一个 HDFS 上的parquet 文件。

  1. 监控,如 kafka lag 监控

由于 Apache spark 消费 Kafka 是使用的低阶 API,默认我们没有办法知道消费的 topic有没有延迟,我们通过指定 group-id 属性,模拟 Kafka consumer 的 subscribe 模式,这样就和普通的 Kafka consumer 高级 API 一样了。

  1. 数据质量

这个特性主要是用来对数据做单元测试的,比如校验我们 ETL 结果表的准确性。

8.流读批写

这个特性是用来在集成一些第三方 spark connector 的时候,发现某些 connector 没有对流的写入支持得很好,只能在批处理场景中使用,那么这个时候就可以用上这个特性。

比如下面这条语句:

create stream output table behavior_cnt_per_hour using jdbc(url=,
user=,password=,dbTable=)
TBLPROPERTIES(batchWrite=true)

本身 jdbc format 没有对流进行支持,但是我们加上了 TBLPROPERTIES(batchWrite=true),这样就能够在流计算中往数据库写入数据。

9.其他

支持对 view 或者 table 的 repartition 及 coalesce 操作,这个和 spark 本身对 dataset 进行 repartition 及 coalesce 时一样支持的。

比如下面这条 create view 语句加入了coalesce, 代表对结果进行了 coalesce 操作,并且设置重分区为 1 个分区:

create view v_request_log with(coalesce=1) as
select
request_time,
domain,
server_ip,
ip_ver,
scheme,
status_code,
hitmiss,
bytes_sent,
response_time
from request_log;

10.语法

QStreaming 完整的语法特性参考:

(https://github.com/qiniu/QStreaming/blob/master/stream-core/src/main/antlr4/com/qiniu/stream/core/parser/Sql.g4)

QStreaming 架构

架构图

核心组件

从上面的架构图中可以看出 QStreaming 主要有以下几个组件组成:

  1. Pipeline DSL

Pipeline DSL 是一个定义时的 Job 任务描述文件,类似于 SQL 语法,对 Spark SQL 完全兼容,比如下面这个:

  1. Pipeline DSL Parser

Pipeline DSL Parser 组件负责解析 Pipeline DSL 并且转换 ANTLR AST 为 Pipeline Domain Models。

Pipeline Domain Models

  1. Pipleine Translator

Pipeline Translator 进一步将 Pipeline domain model 转换为 Spark transformations and actions。

  1. Data Quality Checker

Data Quality Check 负责解析单元测试语句,使用 Amazon Deequ 库并且翻译为 Deequ 的 Verification Suite。

  1. Pipeline Runner

这个组件负责构建 Pipeline 启动上下文,协同 Pipeline Parser 和 Pipeline Translator一起工作,根据配置启动流或者批处理 Application。

QStreaming 使用场景

场景一

在这一个场景中,QStreaming 主要通过消费 Kafka,然后进行预聚合,预聚合可以进行开窗口计算,比如 1 分钟的窗口,然后再把窗口聚合的结果写入下游数据存储中,这里面很重要的一个特性就是数据订正功能,所以可以选择的 ETL 架构如下:

Lambda架构

Kappa架构

混合架构

场景二

在这个场景中,QStreaming 扮演了一层很薄的角色,比如对数据进行加工,但是不对数据进行聚合,保留了明细,预聚合的功能交给了下游支持 OLAP 引擎,比如支持 RollUp 功能的 Apache Druid,Apache Doris,Clickhouse 等,另外 Apache Doris 还可以保留明细功能。

场景三

在这个场景中,QStreaming 主要是通过 Apache Airflow 进行调度的,ODS 对接 Apache Hive 数据仓库,然后可以做 DWS 或者是 DWD 操作,再把结果写入 Hive 数据仓库中,提供离线即席查询,或者是聚合的结果写入 RDS,NOSQL 等数据库,上层对其结果封装为 API,供用户使用。

场景四

这个场景主要是消息驱动的,通过上游业务方发送消息到消息中间件,然后消费消息驱动 QStreaming ETL 任务。

QStreaming 总结

整体上 QStreaming 可以从 三点简单概况:

1.架构层面: 可用于 Lambda架构,Kappa架构,混合架构三种架构中,并且灵活切换。
2.开发层面: 只需要掌握 SQL 即可。
3.运维层面: 能够实现统一部署和管理。

QStreaming RoadMap

QStreaming 还非常年轻,后期还会有进一步的规划,规划的特性包括 完善数据源支持(如 Delta Lake,Apache Hudi 等), 添加数据血缘功能 和 机器学习 Pipeline。
欢迎大家持续关注我们的项目和「技术猩球」栏目,共同交流技术,畅谈未来。

相关文章:

  • 聚焦自主创新,七牛云完成华为多项兼容性认证
  • 【技术猩球】牛人分享:大数据架构师在关注什么?
  • Niu Talk 数据科学系列论坛:明晚,我们聊聊大数据与开源
  • 是什么让你在赛博空间更好看?
  • 直播新规出台!如何用技术管住乱打赏的「熊孩子」?
  • 【技术猩球】七牛云姜智:Go+ 演进之路
  • 七牛云视频模板 SDK:「剪刀手」是怎样炼成的?
  • ECUG 全球技术大会开幕在即|顶级技术领袖助阵,共探无界未来
  • 【ECUG】十四年如一日,有这样一群初心不改的技术人
  • 太强!国人开发的后端新语言1.0 版本正式发布!
  • 又一门国产编程语言即将发布 1.0 版本
  • 这门国产语言终于要发布 1.0 版本了
  • 这门国产语言终于要发布1.0版本了!可以和Python相当!
  • 通知大家一件事:10月15日,我在上海等你们~
  • 追踪报道!Go+ 1.0 发布会有哪些大佬和精彩话题?嘿嘿嘿
  • 2019年如何成为全栈工程师?
  • Angular数据绑定机制
  • codis proxy处理流程
  • CSS盒模型深入
  • Git学习与使用心得(1)—— 初始化
  • JS题目及答案整理
  • MySQL用户中的%到底包不包括localhost?
  • overflow: hidden IE7无效
  • SpiderData 2019年2月16日 DApp数据排行榜
  • uni-app项目数字滚动
  • 阿里研究院入选中国企业智库系统影响力榜
  • 从setTimeout-setInterval看JS线程
  • 大主子表关联的性能优化方法
  • 对JS继承的一点思考
  • 关于extract.autodesk.io的一些说明
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​ubuntu下安装kvm虚拟机
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #pragma data_seg 共享数据区(转)
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (多级缓存)多级缓存
  • (简单) HDU 2612 Find a way,BFS。
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)linux 命令大全
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)nsfocus-绿盟科技笔试题目
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net 获取url的方法
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET设计模式(11):组合模式(Composite Pattern)
  • @Documented注解的作用
  • @EnableWebMvc介绍和使用详细demo
  • []常用AT命令解释()
  • []指针
  • [AIGC codze] Kafka 的 rebalance 机制