上一篇对druid做了简单的介绍,这一篇我介绍一下druid的基本概念,druid的数据结构以及druid的集群架构;
Data
druid的数据格式和关系型数据库数据较为类似, 如下:
timestamp             publisher          advertiser  gender  country  click  price
2011-01-01T01:01:35Z  bieberfever.com    google.com  Male    USA      0      0.65
2011-01-01T01:03:63Z  bieberfever.com    google.com  Male    USA      0      0.62
2011-01-01T01:04:51Z  bieberfever.com    google.com  Male    USA      1      0.45
2011-01-01T01:00:00Z  ultratrimfast.com  google.com  Female  UK       0      0.87
2011-01-01T02:00:00Z  ultratrimfast.com  google.com  Female  UK       0      0.99
2011-01-01T02:00:00Z  ultratrimfast.com  google.com  Female  UK       1      1.53

熟悉OLAP的同学,对以下这些概念一定不陌生,druid也把数据分为以下三个部分:

Timestamp Column:将时间单独处理,是因为druid所有的操作都是围绕时间轴来进行的。
Dimension Columns:维度字段,是数据的属性, 一般被用来过滤数据。上面的例子,我们有四个维度, publisher, advertiser, gender, country.  他们每一个都可以看是数据立方体的一个轴,都可以用来用来做横切。
Metric Columns: 度量字段,是用来做聚合或者相关计算的。 上边的数据, click和price是俩个度量。度量是可以衡量的数据,一般可以有如下的操作,count ,sum等等
ROLL-UP
roll-up (上卷)是olap的基本操作(除此之外还有下钻,切片等, 基本理论是一样的)。  在数据统计里,由于数据量太多,一般对细分的数据不是特别干兴趣,或者说没有太大关注的意义。
但是按照维度的汇总或者统计,确实很有用的。druid通过一个roll-up的处理,将原始数据在注入的时候就进行汇总处理。roll-up 是在维度过滤之前的第一层聚合操作,如下:
GROUP BY timestamp, publisher, advertiser, gender, country:: impressions = COUNT(1),  clicks = SUM(click),  revenue = SUM(price)

聚合后数据就变成了如下的样子
timestamp             publisher          advertiser  gender country impressions clicks revenue2011-01-01T01:00:00Z  ultratrimfast.com  google.com  Male   USA     1800        25     15.702011-01-01T01:00:00Z  bieberfever.com    google.com  Male   USA     2912        42     29.182011-01-01T02:00:00Z  ultratrimfast.com  google.com  Male   UK      1953        17     17.312011-01-01T02:00:00Z  bieberfever.com    google.com  Male   UK      3194        170    34.01

我们可以看到,roll-up可以压缩我们需要保存的数据量。 druid 通过roll-up 减少了 我们存储在后台的数据量。  但这种缩减是有损失的, 当我们做了roll-up, 我们就无法查询细分的数据了。 或许,我们在可以在rollup的时候,将其粒度控制在我们可以查询到我们需要查看的最细数据为止。druid可以通过 queryGranularity 来控制注入数据的粒度。 最小的queryGranularity 是 millisecond(毫秒级)
Sharding the Data
druid的数据分片称为 segments,  一般的,druid会通过时间来进行分片, 上面例子中我们聚合后的数据,可以按小时分为俩片,如下

Segment sampleData_2011-01-01T01:00:00:00Z_2011-01-01T02:00:00:00Z_v1_0 contains

 2011-01-01T01:00:00Z  ultratrimfast.com  google.com  Male   USA     1800        25     15.702011-01-01T01:00:00Z  bieberfever.com    google.com  Male   USA     2912        42     29.18

Segment sampleData_2011-01-01T02:00:00:00Z_2011-01-01T03:00:00:00Z_v1_0 contains

 2011-01-01T02:00:00Z  ultratrimfast.com  google.com  Male   UK      1953        17     17.312011-01-01T02:00:00Z  bieberfever.com    google.com  Male   UK      3194        170    34.01

segment 是个包含数据的独立的容器, 内部的数据以时间分割。 segment 为聚合的列做索引,数据依赖索引,按列方式存储。 所以druid得查询就转为了如何扫描segments了。
segment 由datasource, interval, version, 和一个可选的分区号唯一的确定。 例如上面例子中,我们的segment的名字就是这种格式dataSource_interval_version_partitionNumber
写到这里,大家应该也有了初步的了解,druid 在注入的数据的时候,就已经将索引按照指定的格式处理好,并保存在deepstore中, 其余的查询都转换为了对数据的扫描过程。 所以druid是典型的MOLAP
Indexing the Data
druid能达到这样的速度,主要取决于数据的存储格式。 druid为数据创建了不可变的数据镜像, 并已便于分析搜索的的结构存储下来。 druid是列存储的, 也就是说,每一个单独的列都是分开存储的。查询过程中,也只有与查询有关联的列参与。 druid对于只有扫描的查询更有优势。 不同的列可以调用不同的压缩方式。不同的列也可以有不同的索引。
druid的索引是segment级别的。
Loading the Data

 
druid有俩种数据load的方式,一种是realtime的,一种是batch的。 druid的实时数据注入是很费力的。 Exactly once semantics are not guaranteed with real-time ingestion in Druid, although we have it on our roadmap to support this. Batch ingestion provides exactly once guarantees and segments created via batch processing will accurately reflect the ingested data。常用的做法是通过real-time 方式来管理实时的数据分析,通过batch 方式来管理精确备份的数据。
Querying the Data
druid原生的查询是以json参数调用http接口,社区也分享了各种其他语言的查询库, 包括sql
druid 主要是为单表的数据操作儿设计的,所以目前不支持join操作。 很多产品需要在etl阶段做join, 可以把join放在数据注入druid之前来进行。
The Druid Cluster
druid集群是由很多功能不同的节点组成的。
Historical Nodes:historical nodes 可以看做是druid集群的脊椎, 它将segment固话到本地,供集群查询时使用。 historical nodes 采用了一个无共享架构设计, 它知道如何去加载segment, 删除segment以及如果基于segment查询。
Broker Nodes:broker Nodes 是客户端和相关应用从druid集群上查询数据的节点,它的职责是对客户端过来的查询做负载,聚集和合并查询结果。 broker节点知道每个segment都在哪儿
Coordinator Nodes:coordinator nodes 用来管理druid集群放在historical nodes上的segment。coordinatenodes 告诉historical nodes去加载新的segment, 移除就得segment, 对节点上的segment做均衡
Real-time Processing:实时数据处理可以在单点实时节点或者索引服务(indexing service)完成, 实时的逻辑在这二者上是很常见的。实时处理主要包括加载数据,创建索引(创建segment), 以及将segment迁移到historical nodes。经过实时处理后的数据及可查询。迁移处理也是无损的, 迁移后数据仍然是可以查询的。
overload Nodes: 主要是用于批量索引服务,我会在druid-索引服务中详细讲解
External Dependencies
druid集群需要依赖
Zookeeper  用于集群内部通讯
Metadata Storage  用户存储segment,configuration 等的metadata信息; 服务创建segments后,会向metadatastore中写一个新的标记, coordinatenode监控metadatastore来获取有哪些新的数据需要被重新load,或者有哪些旧的数据需要被去除。查询的时候并不需要metadatastor的数据。 在生产集群中,mysql 和postgresql是比较常用的metadatastor, derby可以用于单机测试环境
Deep Storage deepstorage作为segments一种持久的备份。 服务创建segments后,上传到deepstore。 coordinatenode从deepstorage下载segments。查询的时候也不会用到deepstorage。 常用的deepstorage有S3和hdfs。
欢迎关注GoingIO公众号

Druid-基本概念相关推荐

  1. Druid基本概念及架构介绍

    Druid基本概念及架构介绍 学习参考:https://www.apache-druid.cn/ Apache Druid是一个高性能的实时分析型数据库 作者:it_zzy 链接:https://ww ...

  2. Apache Druid历险记

    1. Druid简介 1. 1 概述 Druid是一个快速的列式分布式的支持实时分析的数据存储系统.它在处理PB级数据.毫秒级查询.数据实时处理方面,比传统的OLAP系统有了显著的性能改进. OLAP ...

  3. 实时分析数据库 Druid,Mark 一下

    本文已收录github:https://github.com/BigDataScholar/TheKingOfBigData,里面有大数据高频考点,Java一线大厂面试题资源,上百本免费电子书籍,作者 ...

  4. 学习java框架-J2EE体系-Spring-IOC-AOP-Bean-事务-

    文章目录 ==整体架构== ==J2EE== 概述 SSM设计模型 传统web开发 ==Spring概述== 使用Spring框架的好处? 框架是什么? Spring概念? ==BeanFactory ...

  5. 电商数仓描述_笔记-尚硅谷大数据项目数据仓库-电商数仓V1.2新版

    架构 项目框架 数仓架构 存储压缩 Snappy与LZO LZO安装: 读取LZO文件时,需要先创建索引,才可以进行切片. 框架版本选型Apache:运维麻烦,需要自己调研兼容性. CDH:国内使用最 ...

  6. Spring+SpringMVC+Mybatis SSM框架详解

    一.JDBC编程 1.JDBC 简介 JDBC其实就是 Java 官方提供的一套规范(接口),用于帮助开发人员快速实现不同关系型数据库的连接. 程序运行的时候,数据都是在内存中的.当程序终止的时候,通 ...

  7. 山东大学JAVA课程设计 —— JAVA开发桌面应用之开发自己的闲鱼交易市场,能聊天,能买卖商品哦!

    文章目录 一.结论分析与体会 1.1.技术部分 1.1.1.swing 1.1.2.多线程 1.1.3.数据库 1.1.4.网络 1.1.5.集合与泛型 1.1.6.接口与内部类 1.2.内心感悟 二 ...

  8. rust druid概念

    druid-shell Druid 工具包使用 Druid-shell 作为平台抽象应用程序 shell.Druid-shell 负责启动本机平台运行循环,监听事件,将它们转换为与平台无关的表示,并用 ...

  9. Druid数据库连接池超时问题com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 1000, active 10

    问题描述: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 1000, active 10at com.alibab ...

  10. Flink 基本原理与生产实践分享【入门必读,概念清晰】

    Flink 基本原理与生产实践分享[入门必读,概念清晰] https://zh.wikipedia.org/zh-hans/Apache_Flink Apache Flink是由Apache软件基金会 ...

最新文章

  1. 用Python统计分析290种零食,谁能唤起80、90后的童年回忆?
  2. 面向对象中类和类的关系
  3. python培训班靠谱的-Python培训机构就业靠不靠谱?
  4. Hadoop中-put和-copyFromLocal的区别
  5. Android微信自动回复功能
  6. 云服务器怎么装mysql_云服务器(windows环境)安装mysql图文教程
  7. [原创]Scala学习:编写Scala脚本
  8. 4月升级鸿蒙,华为鸿蒙系统4月升级适配名单一览
  9. 用Java写一个随机排序的功能
  10. 配置jetson的usb转串口驱动
  11. 两个通宵熬出来的互联网大厂最新面试题收集整理1000道(三-Memcached),欢迎点赞收藏!!!
  12. XP IIS5.1安装文件
  13. 密码库LibTomCrypt学习记录——(2.25)分组密码算法的工作模式——EAX加密认证模式
  14. 浏览器实现pdf下载、ms http下载、IE不兼容
  15. [bzoj1003]物流运输trans
  16. 如何看待简书大V饱醉豚 写的《为什么程序员是出轨率最高的群体》?
  17. 高数 | 复合函数、幂指函数中等价无穷小替换的问题
  18. 有限元分析的基本知识
  19. 电工作业2021电气试验考试题库
  20. 英伟达 VLSI PD 面经

热门文章

  1. Displaying Bitmaps Efficiently (一)-----Loading Large Bitmaps Efficiently(二)
  2. Git本地仓库与远程仓库关联
  3. Flutter:Navigator2.0介绍及使用
  4. SpringMVC执行流程源码分析
  5. win10 uwp 线程池
  6. 一款可视化的在线制作H5
  7. UGUI 下拉滚动框
  8. C# 得到本机局域网IP地址
  9. Delphi Menu Designer(菜单设计器)之一
  10. Quartz.Net - Lesson 1: 使用Quartz