原创

Druid 特点及基本概念

本文来源《Druic实时大数据分析》


Design Principle

    Druid在设计之初,有三个设计原则:

    1、Fast Query 快速查询:partialAggregate部分数据聚合 + In-Memory 内存化+Index Service 索引服务

    2、Horizontal Scalability 水平扩展能力: Distributed Data 分布式数据+Parallelizable Query 并行化查询、

    3、Realtime Analytics 实时分析:Immutable Past 不可变的过去 + Append-Only Future  只追加的未来

Fast Query  

    对于数据分析场景,大部分情况下,我们只关心一定粒度聚合的数据,而非每一行原始数据的细节情况。因此,数据聚合粒度可以是1min、5min、1hour或者1 day etc。Partial Aggregate给Druid争取了很大的性能优化空间。

    

    数据内存化进一步提高了查询速度。内存和硬盘的访问速度相差近百倍,但是内存的大小是非常有限的,因此在内存使用方面要精细设计,所以在Druid里使用了Bitmap和各种压缩技术。

    另外,为了支持Drill-Down某些纬度,Druid维护了一些倒排索引。这种方式可以加快And 和Or 等计算操作 

Horizontal Scalability

    Druid的查询性能在很大程度上是依赖于内存的优化使用。数据可以分部在多个节点的内存中,因此当数据增长的嘿嘿,可以扩容服务器。为了保持平衡,Druid按照时间范围把聚合数据进行分区处理。对于高基数的纬度,只按照时间切分有时候是不够的(Druid每个Segment不超过2000W行),因此Druid还支持对Segment进一步分区。

    历史Segment数据可以保存在Deep Storage系统中,存储系统可以是本地磁盘、HDFS或者远程云服务。如果某些节点出现故障,则可借助ZK协调其他节点重新计算构造数据。

    Druid的查询模块能够感知和处理集群的状态变化,查询总是在有效的集群架构中进行。集群上的查询可以进行灵活的水平扩展。Druid内存提供了一些容易并行化的聚合操作:Count、Mean、Sum、Variance和其他查询统计。对于一些无法并行化的操作,例如Median,Druid暂时不支持。在支持Histogram直方图方面,Druid也是通过一些近似计算得方法进行支持,以保证Druid整体的查询性能,这些近似计算方法包括HyperLog-log、DataSkeches的一些基数计算。

Realtime Analytics

    Druid提供了包含基于时间维度数据的存储服务,并且任何一行数据都是历史真实事件,因此在设计之初就约定事件一旦进入系统,就不能再改变,即Immutable Past

    对于历史数据Druuid以Segment数据文件的形式组织,并将Sement存储在Deep Storage系统(HDFS、本地磁盘、S3 etc)。当需要查询这些数据的时候,Druid再从Deep Storage中将它们overlord到内存中供查询。

基础概念-数据格式

    Druid在数据摄入之前,首先需要定义一个数据源(DS),这个DS有些类似数据库中Table的概念。每个数据集包括三个部分:Timestamp时间列 、Dimension维度列、Metric指标列

Timestamp

    每个数据集必须有timestamp列,这个列是数据聚合的重要维度,Druid会按照这个时间列进行分区,将时间很近的一些数据聚合在一起,放在一个或多个Segment中。另外,所有的查询都需要指定查询时间范围,你可以理解为就是hive的分区表查询必须指定分区。

Dimension

    这里的维度来自于OLAP(On-Line Analytical Processing)的概念,用来标识一些Event,这些标识主要用于filter过滤或者Sharding、slice切片数据,维度列的字段为字符串类型。

Metric

    Metric对应OLAP中的Fact,用于聚合和计算的列。通常为数据类型,计算操作就是之前提到的Count、Sum、Mean等。Metric通常是业务的关键量化指标,包括收入、使用时长等核心可度量和比较的指标

image.png

基础概念-数据摄入

和现在其他主流分析系统一样,Druid也提供实时数据摄入、批处理数据摄入,详情见下图

image.png



基础概念-数据查询

    Druid原生查询是采用JSON格式,通过HTTP传送。Druid不支持标准的SQL语言查询,因为有些SQL语言并不适用于Druid现在的设计. 为了简化查询的解析,采用自定义JSON格式,方便內外部处理,不过现在imply已经实现支持标准SQL的查询。

    对于Druid的查询访问,除了原生java客户端外,也出现很多支持不同语言客户端访问的开源项目:Python、R、JS、Rubby

~阅读全文~人机检测~

关注下方微信公众号“Java精选”(w_z90110),回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。

Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。

评论

分享:

支付宝

微信