druid在有赞的实践

author author     2023-04-28     682

关键词:

参考技术A

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

Druid常见应用的领域:

有赞作为一家 SaaS 公司,有很多的业务的场景和非常大量的实时数据和离线数据。在没有是使用 Druid 之前,一些 OLAP 场景的场景分析,开发的同学都是使用 SparkStreaming 或者 Storm 做的。用这类方案会除了需要写实时任务之外,还需要为了查询精心设计存储。带来问题是:开发的周期长;初期的存储设计很难满足需求的迭代发展;不可扩展。
在使用 Druid 之后,开发人员只需要填写一个数据摄取的配置,指定维度和指标,就可以完成数据的摄入;从上面描述的 Druid 特性中我们知道,Druid 支持 SQL,应用 APP 可以像使用普通 JDBC 一样来查询数据。通过有赞自研OLAP平台的帮助,数据的摄取配置变得更加简单方便,一个实时任务创建仅仅需要10来分钟,大大的提高了开发效率。

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

4.1 有赞 OLAP 平台的主要目标:

4.2 有赞 OLAP 平台架构

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

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

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

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

随着接入的业务增加和长期的运行时间,数据规模也越来越大。Historical 节点加载了大量 Segment 数据,观察发现大部分查询都集中在最近几天,换句话说最近几天的热数据很容易被查询到,因此数据冷热分离对提高查询效率很重要。Druid 提供了Historical 的 Tier 分组机制与数据加载 Rule 机制,通过配置能很好的将数据进行冷热分离。
首先将 Historical 群进行分组,默认的分组是"_default_tier",规划少量的 Historical 节点,使用 SATA 盘;把大量的 Historical 节点规划到 "hot" 分组,使用 SSD 盘。然后为每个 DataSource 配置加载 Rule :

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

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

Historical 集群的部署和4.4节中描述的数据冷热分离相对应,用 SSD 集群存储最近的N天的热数据(可调节 Load 的天数),用相对廉价的 Sata 机型存储更长时间的历史冷数据,同时充分利用 Sata 的 IO 能力,把 Segment Load到不同磁盘上;在有赞有很多的收费业务,我们在硬件层面做隔离,保证这些业务在查询端有足够的资源;在接入层,使用 Router 做路由,避免了 Broker 单点问题,也能很大的程度集群查询吞吐量;在 MiddleManager 集群,除了部署有 Index 任务(内存型任务)外,我们还混合部署了部分流量高 Tranquility 任务(CPU型任务),提高了 MiddleManager 集群的资源利用率。

在有赞业务查询方式一般是 SQL On Broker/Router,我们发现一旦有少量慢查询的情况,客户端会出现查询不响应的情况,而且连接越来越难获取到。登录到Broker 的服务端后发现,可用连接数量急剧减少至被耗尽,同时出现了大量的 TCP Close_Wait。用 jstack 工具排查之后发现有 deadlock 的情况,具体的 Stack 请查看 ISSUE-6867 。

经过源码排查之后发现,DruidConnection为每个 Statement 注册了回调。在正常的情况下 Statement 结束之后,执行回调函数从 DruidConnection 的 statements 中 remove 掉自己的状态;如果有慢查询的情况(超过最长连接时间或者来自客户端的Kill),connection 会被强制关闭,同时关闭其下的所有 statements ,2个线程(关闭connection的线程和正在退出 statement 的线程)各自拥有一把锁,等待对方释放锁,就会产生死锁现象,连接就会被马上耗尽。

在排查清楚问题之后,我们也向社区提了 PR-6868 。目前已经成功合并到 Master 分支中,将会 0.14.0 版本中发布。如果读者们也遇到这个问题,可以直接把该PR cherry-pick 到自己的分支中进行修复。

目前比较常用的数据摄取方案是:KafkaIndex 和 Tranquility 。我们采用的是 Tranquility 的方案,目前 Tranquility 支持了 Kafka 和 Http 方式摄取数据,摄取方式并不丰富;Tranquility 也是 MetaMarket 公司开源的项目,更新速度比较缓慢,不少功能缺失,最关键的是监控功能缺失,我们不能监控到实例的运行状态,摄取速率、积压、丢失等信息。
目前我们对 Tranquility 的实例管理支持启停,扩容缩容等操作,实现的方式和 Druid 的 MiddleManager 管理 Peon 节点是一样的。把 Tranquility 或者自研摄取工具转换成 Yarn 应用或者 Docker 应用,就能把资源调度和实例管理交给更可靠的调度器来做。

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

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

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

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

最后打个小广告,有赞大数据团队基础设施团队,主要负责有赞的数据平台 (DP), 实时计算 (Storm, Spark Streaming, Flink),离线计算 (HDFS, YARN, HIVE, SPARK SQL),在线存储(HBase),实时 OLAP (Druid) 等数个技术产品,欢迎感兴趣的小伙伴联系 zhaojiandong@youzan.com

实时数仓在有赞的实践(代码片段)

作者:小君部门:技术中台/数据中台前言  随着实时技术的不断发展和商家实时应用场景的不断丰富,有赞在实时数仓建设方面做了大量的尝试和实践。本文主要分享有赞在建设实时数仓过程中所沉淀的经验,... 查看详情

实时数仓在有赞的实践(代码片段)

作者:小君部门:技术中台/数据中台前言  随着实时技术的不断发展和商家实时应用场景的不断丰富,有赞在实时数仓建设方面做了大量的尝试和实践。本文主要分享有赞在建设实时数仓过程中所沉淀的经验,... 查看详情

实时数仓在有赞的实践(代码片段)

前言随着实时技术的不断发展和商家实时应用场景的不断丰富,有赞在实时数仓建设方面做了大量的尝试和实践。本文主要分享有赞在建设实时数仓过程中所沉淀的经验,内容包括以下五个部分:建设背景应用场景方... 查看详情

有赞数据仓库实践之路

...设期,目前在成熟期中蜕变着……2.1混沌期2.1.1背景在有赞大数据的初期,严格来说是没有数仓概念的:没有分层,没有主题域,也没有规范。当整个Hive里就只有一个st库,并且不做规范性命名的时候 查看详情

有赞实时计算flink1.13升级实践

...相比于Flink1.10有了很多的新特性和优化,有些新特性在有赞场景下可能并未用到,所以接下来将主要从以下几个方面介绍一下在有赞业务场景下升级到Flink1.13的一些收益。1、FlinkSQL相关收益由于目前几乎所有的实时计算... 查看详情

有赞实时计算flink1.13升级实践

作者:李闯郭理想  背景随着有赞实时计算业务场景全部以FlinkSQL的方式接入,对有赞现有的引擎版本—Flink1.10的SQL能力提出了越来越多无法满足的需求以及可以优化的功能点。目前有赞的FlinkSQL是在Yarn上运行,但是在公... 查看详情

有赞的深度需求功能测试

...ao.io&utm_medium=toutiao.io&utm_source=toutiao.io 序:在《有赞.测试团队介绍(一)》曾经提到过,我们在测试需求项目时,会把需求逐级拆解,直到最小粒度。然后,各业务 查看详情

ios组件化/模块化架构设计实践(代码片段)

...赞移动团队自16年起也在不断尝试各种组件化方案,在有赞微信商城,有赞零售,有赞美业等多个应用中进行了实践。我们踩过一些坑,也收获了很多宝贵的经验,并沉淀出iOS相关框架Bifros 查看详情

比起京东有赞的裁员,更让我头秃的是裁员的文章

最近又一次爆发「裁员」热潮,很多朋友跟我反馈裁员焦虑,这过程中,我遇到了一个程序媛,她的观点决定让我做一次采访。「要不要先来个自我介绍?」「大家好,我是小Q。工作4年了,来自某大... 查看详情

有赞tcp网络编程最佳实践|极客分享第34期

...。本期正文原文链接:https://hackershare.dev/weekly\_selections/441.有赞TCP网络编程最佳实践本文是根据有赞中间件团队多年的TCP网络编程实践经验总结而来,目的是为了避免应用因各种网络异常而出现各种非预期行为,从而造 查看详情

有赞服务注册与发现架构演进(代码片段)

有赞服务注册与发现架构演进一、概述二、接口级服务注册与发现2.1架构2.2问题三、接口级服务注册与应用级服务发现3.1架构3.2应用级服务发现解析3.3优化3.3.1服务发现延迟聚合推送3.3.2服务发现预加载3.3.3客户端接口与应用映射... 查看详情

有赞亿级订单同步的探索与实践

有赞亿级订单同步的探索与实践机器不学习 2019-05-1913:54:15一、引子有赞是提供商家SAAS服务,随着越来越多的商家使用有赞,搜索或详情的需求也日益增长,针对需求及场景,之前提到过的订单管理架构演变及AKF... 查看详情

有赞——数据地图实践(代码片段)

关注下面公众号,回复:数据治理 关键字即可获取PPTEND热门内容两年经验斩获蚂蚁/头条/PingCAPOffer,牛逼了快手大数据平台服务化实践深入理解Java内存模型关注我关注我,Java学习不迷路!点个赞+在看࿰... 查看详情

有赞实时数仓建设实践与经验(代码片段)

...时技术的不断发展和商家实时应用场景的不断丰富,有赞在实时数仓建设方面做了大量的尝试和实践。本文主要分享有赞在建设实时数仓过程中所沉淀的经验,内容包括以下五个部分:建设背景应用场景方案设计项目... 查看详情

有赞埋点实践

1.前言大数据应用一般会有采集、加工、存储、计算及可视化这几个环节。其中采集作为源头,在确保全面、准确、及时的前提下,最终加工出来的指标结果才是有价值的。而埋点作为一种重要的采集手段,可以将用... 查看详情

druid在小米公司部分技术实践

...了一席之地。  本文通过对小米公司技术团队对Druid的实践案例与经验的介绍,让大家对Druid有更加全面和深入的了解,希望能够帮助你事半功倍地学习Druid这项年轻的技术。  本文选自《Dr 查看详情

druid在小米公司部分技术实践

...了一席之地。  本文通过对小米公司技术团队对Druid的实践案例与经验的介绍,让大家对Druid有更加全面和深入的了解,希望能够帮助你事半功倍地学习Druid这项年轻的技术。  本文选自《Dr 查看详情

ios组件化/模块化架构设计实践(代码片段)

...赞移动团队自16年起也在不断尝试各种组件化方案,在有赞微信商城,有赞零售,有赞美业等多个应用中进行了实践。我们踩过一些坑,也收获了很多宝贵的经验,并沉淀出iOS相关框架Bifrost(雷神里的彩虹桥)。... 查看详情