Druid是一个开源的、分布式的、列存储系统,特别适用于大数据上的(准)实时分析统计。且具有较好的稳定性(Highly Available)。 其相对比较轻量级,文档非常完善,也比较容易上手。

Druid vs 其他系统

Druid vs Impala/Shark

Druid和Impala、Shark 的比较基本上可以归结为需要设计什么样的系统

Druid被设计用于:

  1. 一直在线的服务
  2. 获取实时数据
  3. 处理slice-n-dice式的即时查询

查询速度不同:

  • Druid是列存储方式,数据经过压缩加入到索引结构中,压缩增加了RAM中的数据存储能力,能够使RAM适应更多的数据快速存取。索引结构意味着,当添加过滤器来查询,Druid少做一些处理,将会查询的更快。
  • Impala/Shark可以认为是HDFS之上的后台程序缓存层。 但是他们没有超越缓存功能,真正的提高查询速度。

数据的获取不同:

  • Druid可以获取实时数据。
  • Impala/Shark是基于HDFS或者其他后备存储,限制了数据获取的速度。

查询的形式不同:

  • Druid支持时间序列和groupby样式的查询,但不支持join。
  • Impala/Shark支持SQL样式的查询。

Druid vs Elasticsearch

Elasticsearch(ES) 是基于Apache Lucene的搜索服务器。它提供了全文搜索的模式,并提供了访问原始事件级数据。 Elasticsearch还提供了分析和汇总支持。根据研究,ES在数据获取和聚集用的资源比在Druid高。

Druid侧重于OLAP工作流程。Druid是高性能(快速聚集和获取)以较低的成本进行了优化,并支持广泛的分析操作。Druid提供了结构化的事件数据的一些基本的搜索支持。

Segment: Druid中有个重要的数据单位叫segment,其是Druid通过bitmap indexing从raw data生成的(batch or realtime)。segment保证了查询的速度。可以自己设置每个segment对应的数据粒度,这个应用中广告流量查询的最小粒度是天,所以每天的数据会被创建成一个segment。注意segment是不可修改的,如果需要修改,只能够修改raw data,重新创建segment了。

架构

Druid本身包含5个组成部分:Broker nodes, Historical nodes, Realtime nodes, Coordinator Nodes和indexing services. 分别的作用如下:

  • Broker nodes: 负责响应外部的查询请求,通过查询Zookeeper将请求划分成segments分别转发给Historical和Real-time nodes,最终合并并返回查询结果给外部;
  • Historial nodes: 负责’Historical’ segments的存储和查询。其会从deep storage中load segments,并响应Broder nodes的请求。Historical nodes通常会在本机同步deep storage上的部分segments,所以即使deep storage不可访问了,Historical nodes还是能serve其同步的segments的查询;
  • Real-time nodes: 用于存储和查询热数据,会定期地将数据build成segments移到Historical nodes。一般会使用外部依赖kafka来提高realtime data ingestion的可用性。如果不需要实时ingest数据到cluter中,可以舍弃Real-time nodes,只定时地batch ingestion数据到deep storage;
  • Coordinator nodes: 可以认为是Druid中的master,其通过Zookeeper管理Historical和Real-time nodes,且通过Mysql中的metadata管理Segments
  • Druid中通常还会起一些indexing services用于数据导入,batch data和streaming data都可以通过给indexing services发请求来导入数据。

Druid还包含3个外部依赖

  • Mysql:存储Druid中的各种metadata(里面的数据都是Druid自身创建和插入的),包含3张表:”druid_config”(通常是空的), “druid_rules”(coordinator nodes使用的一些规则信息,比如哪个segment从哪个node去load)和“druid_segments”(存储每个segment的metadata信息);
  • Deep storage: 存储segments,Druid目前已经支持本地磁盘,NFS挂载磁盘,HDFS,S3等。Deep Storage的数据有2个来源,一个是batch Ingestion, 另一个是real-time nodes;
  • ZooKeeper: 被Druid用于管理当前cluster的状态,比如记录哪些segments从Real-time nodes移到了Historical nodes;

查询

Druid的查询是通过给Broker Nodes发送HTTP POST请求(也可以直接给Historical or Realtime Node),具体可见Druid官方文档。查询条件的描述是json文件,查询的response也是json格式。Druid的查询包含如下4种:

  • Time Boundary Queries: 用于查询全部数据的时间跨度
  • groupBy Queries: 是Druid的最典型查询方式,非常类似于Mysql的groupBy查询。query body中几个元素可以这么理解:
    • “aggregation”: 对应mysql”select XX from”部分,即你想查哪些列的聚合结果;
    • “dimensions”: 对应mysql”group by XX”,即你想基于哪些列做聚合;
    • “filter”: 对应mysql”where XX”条件,即过滤条件;
    • “granularity”: 数据聚合的粒度;
  • Timeseries queries: 其统计满足filter条件的”rows”上某几列的聚合结果,相比”groupBy Queries”不指定基于哪几列进行聚合,效率更高;
  • TopN queries: 用于查询某一列上按照某种metric排序的最常见的N个values;

本文小结

  1. Druid是一个开源的,分布式的,列存储的,适用于实时数据分析的系统,文档详细,易于上手;

    • Druid在设计时充分考虑到了Highly Available,各种nodes挂掉都不会使得druid停止工作(但是状态会无法更新);
    • Druid中的各个components之间耦合性低,如果不需要streaming data ingestion完全可以忽略realtime node;
    • Druid的数据单位Segment是不可修改的,我们的做法是生成新的segments替换现有的;
    • Druid使用Bitmap indexing加速column-store的查询速度,使用了一个叫做CONCISE的算法来对bitmap indexing进行压缩,使得生成的segments比原始文本文件小很多;
  2. 在我们的应用场景下(一共10几台机器,数据大概100列,行数是亿级别),平均查询时间<2秒,是同样机器数目的Mysql cluter的1/100 ~ 1/10;
  3. Druid的一些“局限”:
    • Segment的不可修改性简化了Druid的实现,但是如果你有修改数据的需求,必须重新创建segment,而bitmap indexing的过程是比较耗时的;
    • Druid能接受的数据的格式相对简单,比如不能处理嵌套结构的数据

转载于:https://www.cnblogs.com/bonelee/p/6248172.html

Druid(准)实时分析统计数据库——列存储+高效压缩相关推荐

  1. predicate 列存储索引扫描_ColumnStore index (列存储索引)解析

    简介 首先介紹列存储的概念: 传统的数据库存储是行存储.对于SQL Server来说,每个page是8K:往page里面塞数据,假设该表每条数据长度是500字节,那么这个page 先塞第一条数据,然后 ...

  2. SQL Server列存储实现方案

    SQL Server从2012版本开始支持列存储,但2012版本使用列存储会导致表进入只读状态:2014版本使用可更新聚集列存储索引技术解决了只读的问题,使用列存储的表支持修改:2016版本列存储支持 ...

  3. 行存储索引改换成列存储索引_列存储索引增强功能–数据压缩,估计和节省

    行存储索引改换成列存储索引 Data compression is required to reduce database storage size as well as improving perf ...

  4. 数据库索引统计信息不一致_列存储索引增强功能–克隆数据库中的索引统计信息更新

    数据库索引统计信息不一致 SQL Server was launched in 1993 on WinNT and it completed its 25-year anniversary recen ...

  5. 在 Kubernetes 上快速测试 Citus 分布式 PostgreSQL 集群(分布式表,共置,引用表,列存储)...

    准备工作 这里假设,你已经在 k8s 上部署好了基于 Citus 扩展的分布式 PostgreSQL 集群. 查看 Citus 集群(kubectl get po -n citus),1 个 Coor ...

  6. openGauss存储技术(三)——列存储引擎

    上一篇内容我们介绍了openGauss存储技术--行存储引擎,本文重点介绍openGauss列存储引擎. openGauss列存储引擎 传统行存储数据压缩率低,必须按行读取,即使读取一列也必须读取整行 ...

  7. 腾讯Hermes设计概要——数据分析用的是列存储,词典文件前缀压缩,倒排文件递增id、变长压缩、依然是跳表-本质是lucene啊...

    转自:http://data.qq.com/article?id=817 三.Hermes设计概要 架构描述 系统核心进程均采用分散化设计,根据业务发展需求,可随意扩缩容机器; 周期性数据直接通过td ...

  8. SQL Server 2016 列存储技术做实时分析

    title: SQL Server 2016 列存储技术做实时分析 author: 风移 摘要 数据分析指导商业行为的价值越来越高,使得用户对数据实时分析的要求变得越来越高.使用传统RDBMS数据分析 ...

  9. lucene底层数据结构——FST,针对field使用列存储,delta encode压缩doc ids数组,LZ4压缩算法...

    参考: http://www.slideshare.net/lucenerevolution/what-is-inaluceneagrandfinal http://www.slideshare.ne ...

最新文章

  1. java mysql 是否插入 成功_您如何确定使用Java和MySQL插入或更新是否成功?
  2. python 数据库表结构转为类_顺序表数据结构在python中的应用
  3. scrapy分布式爬虫爬取淘车网
  4. javascript-各种取值的操作-样式操作
  5. (转)Hibernate快速入门
  6. introduction of servlet filter
  7. ELK详解(三)——Elasticsearch部署优化
  8. regsvr32.exe是什么东西
  9. 使用For XML与XSL(XSLT)配套快速输出查询结果到Web页面
  10. sqlyog 64位linux版本,linux安装mysql+sqlyog可视化(示例代码)
  11. usb声卡驱动_香蕉猴Monkeybanana Hapa系列USB麦克风 测评
  12. 充电w数测试软件,充电功率检测(cn.nowtool.battery) - 1.3.0 - 应用 - 酷安
  13. matlab零阶保持器的作用,5.8 记忆模块、零阶保持器、一阶保持器
  14. 手动给tabcontrol的tabPage加图标图片方法
  15. 网工软考中级数据通信技术
  16. 如何使用计算机搜索文件,win7系统如何使用搜索筛选功能快速查找文件
  17. 人鱼之伤的怪物原型=克苏鲁的deep one
  18. l003 Driller Augmenting Fuzzing Through Selective Symbolic Execution_2016_NDSS学习笔记
  19. allergro音乐术语什么意思_音乐术语里面fz是什么意思?
  20. 如何修炼java内功

热门文章

  1. 怎样在计算机页面加密,怎么给文件加密并加密后隐藏起来?
  2. mysql 工具图形学_[计算机图形学]贝塞尔曲线
  3. java web编码详解_java web 开发 编码问题详解
  4. adding oracle jvm 慢,java – 什么JVM优化导致这些性能结果?
  5. 每天一个linux命令目录
  6. php之工作积累 (一)
  7. 三面蚂蚁金服(交叉面)定级阿里P6
  8. MLIR(Multi-Level Intermediate Representation)概述
  9. php多维数组打印出最长的数组,将php中的多维数组打印到html表中
  10. 计算机专业会比投档线高多少,比投档线高多少安全 投档线和录取线差多少