限时领|《AI 百问百答》专栏课+实体书(包邮)! 了解详情
写点什么

Druid 在有赞的使用场景及应用实践

  • 2019-02-18
  • 本文字数:4015 字

    阅读完需:约 13 分钟

Druid 在有赞的使用场景及应用实践

一、Druid 介绍

Druid 是 MetaMarket 公司研发,专为海量数据集上的做高性能 OLAP (OnLine Analysis Processing)而设计的数据存储和分析系统,目前 Druid 已经在 Apache 基金会下孵化。Druid 的主要特性:


  • 交互式查询( Interactive Query ): Druid 的低延迟数据摄取架构允许事件在它们创建后毫秒内查询,因为 Druid 的查询延时通过只读取和扫描有必要的元素被优化。Druid 是列式存储,查询时读取必要的数据,查询的响应是亚秒级响应。

  • 高可用性( High Available ):Druid 使用 HDFS/S3 作为 Deep Storage,Segment 会在 2 个 Historical 节点上进行加载;摄取数据时也可以多副本摄取,保证数据可用性和容错性。

  • 可伸缩( Horizontal Scalable ):Druid 部署架构都可以水平扩展,增加大量服务器来加快数据摄取,以及保证亚秒级的查询服务

  • 并行处理( Parallel Processing ): Druid 可以在整个集群中并行处理查询

  • 丰富的查询能力( Rich Query ):Druid 支持 Scan、 TopN、 GroupBy、 Approximate 等查询,同时提供了 2 种查询方式:API 和 SQL


Druid 常见应用的领域:


  • 网页点击流分析

  • 网络流量分析

  • 监控系统、APM

  • 数据运营和营销

  • BI 分析/OLAP

二、为什么我们需要用 Druid

有赞作为一家 SaaS 公司,有很多的业务的场景和非常大量的实时数据和离线数据。在没有是使用 Druid 之前,一些 OLAP 场景的场景分析,开发的同学都是使用 SparkStreaming 或者 Storm 做的。用这类方案会除了需要写实时任务之外,还需要为了查询精心设计存储。带来问题是:开发的周期长,初期的存储设计很难满足需求的迭代发展,不可扩展。


在使用 Druid 之后,开发人员只需要填写一个数据摄取的配置,指定维度和指标,就可以完成数据的摄入。从上面描述的 Druid 特性中我们知道,Druid 支持 SQL,应用 APP 可以像使用普通 JDBC 一样来查询数据。通过有赞自研 OLAP 平台的帮助,数据的摄取配置变得更加简单方便,一个实时任务创建仅仅需要 10 来分钟,大大的提高了开发效率。

2.1 Druid 在有赞使用场景

  • 系统监控和 APM:有赞的监控系统(天网)和大量的 APM 系统都使用了 Druid 做数据分析

  • 数据产品和 BI 分析:有赞 SaaS 服务为商家提供了有很多数据产品,例如:商家营销工具,各类 BI 报表

  • 实时 OLAP 服务:Druid 为风控、数据产品等 C 端业务提供了实时 OLAP 服务

三、Druid 的架构


Druid 的架构是 Lambda 架构,分成实时层( Overlord、 MiddleManager )和批处理层( Broker 和 Historical )。主要的节点包括(PS: Druid 的所有功能都在同一个软件包中,通过不同的命令启动):


  • Coordinator 节点:负责集群 Segment 的管理和发布,并确保 Segment 在 Historical 集群中的负载均衡

  • Overlord 节点:Overlord 负责接受任务、协调任务的分配、创建任务锁以及收集、返回任务运行状态给客户端;在 Coordinator 节点配置 asOverlord,让 Coordinator 具备 Overlord 功能,这样减少了一个组件的部署和运维

  • MiddleManager 节点:负责接收 Overlord 分配的索引任务,创建新启动 Peon 实例来执行索引任务,一个 MiddleManager 可以运行多个 Peon 实例

  • Broker 节点:负责从客户端接收查询请求,并将查询请求转发给 Historical 节点和 MiddleManager 节点。Broker 节点需要感知 Segment 信息在集群上的分布

  • Historical 节点:负责按照规则加载非实时窗口的 Segment

  • Router 节点:可选节点,在 Broker 集群之上的 API 网关,有了 Router 节点 Broker 不在是单点服务了,提高了并发查询的能力

四、有赞 OLAP 平台的架构和功能解析

4.1 有赞 OLAP 平台的主要目标


  • 最大程度的降低实时任务开发成本:从开发实时任务需要写实时任务、设计存储,到只需填写配置即可完成实时任务的创建

  • 提供数据补偿服务,保证数据的安全:解决因为实时窗口关闭,迟到数据的丢失问题

  • 提供稳定可靠的监控服务:OLAP 平台为每一个 DataSource 提供了从数据摄入、Segment 落盘,到数据查询的全方位的监控服务


4.2 有赞 OLAP 平台架构



有赞 OLAP 平台是用来管理 Druid 和周围组件管理系统,OLAP 平台主要的功能:


  • Datasource 管理

  • Tranquility 配置和实例管理:OLAP 平台可以通过配置管理各个机器上 Tranquility 实例,扩容和缩容

  • 数据补偿管理:为了解决数据迟延的问题,OLAP 平台可以手动触发和自动触发补偿任务

  • Druid SQL 查询: 为了帮助开发的同学调试 SQL,OLAP 平台集成了 SQL 查询功能

  • 监控报警

4.2 Tranquility 实例管理

OLAP 平台采用的数据摄取方式是 Tranquility 工具,根据流量大小对每个 DataSource 分配不同 Tranquility 实例数量; DataSource 的配置会被推送到 Agent-Master 上,Agent-Master 会收集每台服务器的资源使用情况,选择资源丰富的机器启动 Tranquility 实例,目前只要考虑服务器的内存资源。同时 OLAP 平台还支持 Tranquility 实例的启停,扩容和缩容等功能。


4.3 解决数据迟延问题———离线数据补偿功能

流式数据处理框架都会有时间窗口,迟于窗口期到达的数据会被丢弃。如何保证迟到的数据能被构建到 Segment 中,又避免实时任务窗口长期不能关闭。我们研发了 Druid 数据补偿功能,通过 OLAP 平台配置流式 ETL 将原始的数据存储在 HDFS 上,基于 Flume 的流式 ETL 可以保证按照 Event 的时间,同一小时的数据都在同一个文件路径下。再通过 OLAP 平台手动或者自动触发 Hadoop-Batch 任务,从离线构建 Segment。



基于 Flume 的 ETL 采用了 HDFS Sink 同步数据,实现了 Timestamp 的 Interceptor,按照 Event 的时间戳字段来创建文件(每小时创建一个文件夹),延迟的数据能正确归档到相应小时的文件中。

4.4 冷热数据分离

随着接入的业务增加和长期的运行时间,数据规模也越来越大。Historical 节点加载了大量 Segment 数据,观察发现大部分查询都集中在最近几天,换句话说最近几天的热数据很容易被查询到,因此数据冷热分离对提高查询效率很重要。Druid 提供了 Historical 的 Tier 分组机制与数据加载 Rule 机制,通过配置能很好的将数据进行冷热分离。


首先将 Historical 群进行分组,默认的分组是"_default_tier",规划少量的 Historical 节点,使用 SATA 盘;把大量的 Historical 节点规划到 “hot” 分组,使用 SSD 盘。然后为每个 DataSource 配置加载 Rule :


  • rule1: 加载最近 30 天的 1 份 Segment 到 “hot” 分组;

  • rule2: 加载最近 180 天的 1 份 Segment 到 “_default_tier” 分组;

  • rule3: Drop 掉之前的数据(注:Rule 机制只影响 Historical 加载 Segment,Drop 掉的 Segment 在 HDFS 上任有备份)


{"type":"loadByPeriod","tieredReplicants":{"hot":1}, "period":"P30D"} {"type":"loadByPeriod","tieredReplicants":{"_default_tier":1}, "period":"P180D"} {"type":"dropForever"}
复制代码


提高 "hot"分组集群的 druid.server.priority 值(默认是 0),热数据的查询都会落到 “hot” 分组。


4.5 监控与报警

Druid 架构中的各个组件都有很好的容错性,单点故障时集群依然能对外提供服务:Coordinator 和 Overlord 有 HA 保障;Segment 是多副本存储在 HDFS/S3 上;同时 Historical 加载的 Segment 和 Peon 节点摄取的实时部分数据可以设置多副本提供服务。同时为了能在节点/集群进入不良状态或者达到容量极限时,尽快的发出报警信息。和其他的大数据框架一样,我们也对 Druid 做了详细的监控和报警项,分成了 2 个级别:


  • 基础监控

  • 包括各个组件的服务监控、集群水位和状态监控、机器信息监控

  • 业务监控

  • 业务监控包括:实时任务创建、数据摄取 TPS、消费迟延、持久化相关、查询 RT/QPS 等的关键指标,有单个 DataSource 和全局的 2 种不同视图;同时这些监控项都有设置报警项,超过阈值进行报警提醒。业务指标的采集是大部分是通过 Druid 框架自身提供的 Metrics 和 Alerts 信息,然后流入到 Kafka/OpenTSDB 等组件,通过流数据分析获得我们想要的指标。

五、挑战和未来的展望

5.1 数据摄取系统

目前比较常用的数据摄取方案是:KafkaIndex 和 Tranquility 。我们采用的是 Tranquility 的方案,目前 Tranquility 支持了 Kafka 和 Http 方式摄取数据,摄取方式并不丰富;Tranquility 也是 MetaMarket 公司开源的项目,更新速度比较缓慢,不少功能缺失,最关键的是监控功能缺失,我们不能监控到实例的运行状态,摄取速率、积压、丢失等信息。


目前我们对 Tranquility 的实例管理支持启停,扩容缩容等操作,实现的方式和 Druid 的 MiddleManager 管理 Peon 节点是一样的。把 Tranquility 或者自研摄取工具转换成 Yarn 应用或者 Docker 应用,就能把资源调度和实例管理交给更可靠的调度器来做。

5.2 Druid 的维表 JOIN 查询

Druid 目前并不没有支持 JOIN 查询,所有的聚合查询都被限制在单 DataSource 内进行。但是实际的使用场景中,我们经常需要几个 DataSource 做 JOIN 查询才能得到所需的结果。这是我们面临的难题,也是 Druid 开发团队遇到的难题。

5.3 整点查询 RT 毛刺问题

对于 C 端的 OLAP 查询场景,RT 要求比较高。由于 Druid 会在整点创建当前小时的 Index 任务,如果查询正好落到新建的 Index 任务上,查询的毛刺很大,如下图所示:



我们已经进行了一些优化和调整,首先调整 warmingPeriod 参数,整点前启动 Druid 的 Index 任务;对于一些 TPS 低,但是 QPS 很高的 DataSource ,调大 SegmentGranularity,大部分 Query 都是查询最近 24 小时的数据,保证查询的数据都在内存中,减少新建 Index 任务的,查询毛刺有了很大的改善。尽管如此,离我们想要的目标还是一定的差距,接下去我们去优化一下源码。

5.4 历史数据自动 Rull-Up

现在大部分 DataSource 的 Segment 粒度( SegmentGranularity )都是小时级的,存储在 HDFS 上就是每小时一个 Segment。当需要查询时间跨度比较大的时候,会导致 Query 很慢,占用大量的 Historical 资源,甚至出现 Broker OOM 的情况。如果创建一个 Hadoop-Batch 任务,把一周前(举例)的数据按照天粒度 Rull-Up 并且 重新构建 Index,应该会在压缩存储和提升查询性能方面有很好的效果。


2019-02-18 08:005811
用户头像

发布了 41 篇内容, 共 92735 次阅读, 收获喜欢 66 次。

关注

评论

发布
暂无评论
发现更多内容

模块一作业

小智

架构实战营

华为高级技术专家多年经验分享微服务治理体系、架构及实践文档

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

在?进来看看新一季周边到底做点啥?【话题讨论】

气气

话题讨论

软件测试框架之——Postman参数化(超详细小白教程)

程序员阿沐

软件测试 自动化测试 接口测试

webrtc BitrateAllocator 带宽分配器

webrtc developer

WebRTC

🏆「作者推荐」Java技术专题-JDK/JVM的新储君—GraalVM和Quarkus

码界西柚

Java JVM GraalVM 8月日更

由阿里三位专家撰写:数据库高效优化:架构、规范SQL技巧文档

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

MySQL 不完全入门指南

Java 编程 架构 面试 架构师

简单、快捷、低成本的超写实虚拟人平台来了……

百度开发者中心

人工智能 AI 最佳实践 虚拟人 前沿技术

解密优酷智能生产技术,看 AI 赋能内容数字化

阿里云CloudImagine

音视频 短视频 视频处理 视频制作 视频云

立于山巅!他,凭什么抗住万亿级流量冲击!

博文视点Broadview

论坛接口测试——Postman数据驱动(超详细小白教程)

程序员阿沐

编程 程序员 软件测试 自动化测试 接口测试

如何优雅的在业务中使用设计模式(代码如诗)

小呆呆666

flutter android 大前端 设计模式

短视频询盘获客系统开发案例解析

获客I3O6O643Z97

抖音、快手获客系统 抖音矩阵拓客

【虚拟机专栏】智能合约执行引擎的前世今生

趣链科技

20年IT老民工苦心编撰成超大流量分布式系统架构解决方案文档

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

【等保测评】黑龙江等保测评机构详细信息说明

行云管家

网络安全 等保 等级保护 等保测评

摩尔时代如何押注AI算力?英特尔战术大揭秘

科技新消息

文件上传绕过思路拓展

网络安全学海

黑客 网络安全 信息安全 渗透测试 安全漏洞

GraphQL设计思想

Ryan Zheng

graphql

DEX去中心化交易所自动刷量机器人开发|去中心化做市机器人

量化系统19942438797

去中心化 做市机器人

来了!《中国移动2021智能硬件质量报告》正式发布

零基础入门:基于开源WebRTC,从0到1实现实时音视频聊天功能

JackJiang

音视频 WebRTC 即时通讯 IM

DEX去中心化交易所自动刷量机器人开发|去中心化做市机器人

Geek_23f0c3

去中心化交易所系统开发 量化交易机器人系统开发 量化机器人 做市机器人 自动刷量机器人

译文 | 四张画布教你判断「产品开发优先级」

LigaAI

产品经理 产品开发 画布 产品优先级

影像篡改与识别(一):胶片时代

腾讯安全云鼎实验室

影像 暗房技术 篡改识别

多样数字人民币钱包来袭,阻力与动力并存

CECBC

没有7年经验你真学不会这份SpringCloud实战演练文档

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

终于有大牛把Spring微服务架构设计第2版文档给整理完毕了

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

堡垒机和跳板机的三大区别分析-行云管家

行云管家

运维 堡垒机 IT运维 跳板机

一文带你掌握 OceanBase 社区版部署细节及原理

OceanBase 数据库

数据库 分布式数据库 oceanbase OceanBase 开源 OceanBase 社区版

Druid 在有赞的使用场景及应用实践_架构_有赞技术_InfoQ精选文章