介绍

Druid是一个拥有大数据实时查询和分析的高容错、高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分析。尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid仍然能够保持100%正常运行。创建Druid的最初意图主要是为了解决查询延时问题,当时试图使用hadoop来实现交互式查询分析,但是很难满足实时分析的需要。而Druid提供了以交互方式访问数据的能力,并权衡了查询的灵活性和性能二采取了特殊的存储格式。

Druid允许以类似Dremel和PowerDrill的方式进行单表查询,同时还增加了一些新特性,如为局部嵌套数据结构提供列式存储格式、为快速过滤做索引、实时摄取和查询、高容错的分布式体系架构等。

特性

为分析而设计:为OLAP工作流的探索性分析而构建,支持各种过滤、聚合和查询等类;

快速的交互式查询:Druid的低延迟数据摄取架构允许事件在他们创建后毫秒内可被查询到;

高可用性:Druid的数据在系统更新时依然可用,规模的扩大和缩小都不会造成数据丢失;

可扩展:Druid已实现每天能够处理数十亿事件和TB级数据。

使用场景

1、需要交互式聚合和快速探究大量数据时;

2、需要实时查询分析时;

3、具有大量数据时,如每天数亿事件的新增、每天数10T数据的增加;

4、对数据尤其是大数据进行实时分析时;

5、需要一个高可用、高容错、高性能数据库时。

架构

Historical:对非实时数据进行处理存储和查询;

Realtime:实时摄取数据、监听输入数据流

Coordinator:监控historical节点

Broker:接收来自外部客户端的查询,和将查询转发到Realtime和historical

Indexer:负责索引服务

对比

Spark+Redis+Hbase 实时数据探索

代存在下述问题:

  • 流量高峰期处理延迟

  • 纬度交叉分析,不灵活

  • 消耗资源大

  • 系统故障,重算慢

这是第一代、消耗大、系统故障,在大内存情况下很容易导致崩溃。马蜂窝之前就遇到突发,一组三台,每一台 512 个 G,这个时候内存太大了,哪天一个内存条坏的话,这一天的数据可能就要重新算,而且对于现在当前整个实时数据量来看,完全就不符合当前的现状,算一天需要十几个小时。

当时考虑到,在数据量大的情况下,是不是我们可以去牺牲 UV 的计算。所以就引入在 Druid 里面。把 Druid 引入到 MES,误差基本上保持在 2% 左右。后面我们又通过雅虎提供的data sketch,可以精确调控 UV 的计算,它的默认值是 16384,16384 以下可以是精确的。当然这个值是可以控制的,就是 2 的 N 次幂,当前我们是调到特别大,800 多万。但 Druid 里面不支持MES第一代的虚拟 key。

在 Druid 里面对于datasource 有一个按时间密度去分的,我们历史数据在查询力度这个层面,只能让他查到按每小时去查,其他按天去分配。最新的数据就在最近 15 天,我们可以让他精确到一分钟的查询,对于历史数据,力度越精确,数据量到 Druid 里面越大。

在离线批量导入,现在 Druid 支持,T+1 的数据校正。如果在 PSPARK+TRANQUILITY 这一阶段,因为 SPARK 的 task 失败的话,可能会导致这个数据到 Druid 里面 PV 会上升。所以说需要每天凌晨通过批量导入的方法把上一天的数据做一个数据校准。同样的是需要打平在 attr 里打平所有工程师上报的数据制定的值。

|Druid 集群注意事项

在 Druid 里面配置,

1、维度不要太多,像蚂蜂窝最开始 700 多个维度。每天导进去将近 100 个 G,导进去十分耗时。

2、维度大小,不要太大。比如你来一个维度值几兆的,这个不行。

3、要去合理配置比例。在最开始,我们就拿了跟我们之前节点挂上了 10 个 T 的磁盘,作为整个 Druid 节点的数据存储,但是发现在你去查,无论你是去查任务,或者查历史数据。10 个 T 的磁盘跟不上来,查询各种超时,各种响应。

4、磁盘选用。其实采用的固态盘,基本上像我们现在的配置,就是 256 个 G 内存,1.2T 的固态盘。这个配置起来,你去查询整个历史数据,或者无论你查询其他的数据都是很快的。

5、在segment大小,我们最开始是按天的,100个G,后面拆分成每小时去分。这个时候到几个G,几个G也不行,我们就是要在去拆分几个G,到最终查询相当于是在在300-700兆左右。

6、在Druid里面,不支持逗号,因为 Druid 里在底层逗号是用来分隔。

7、优先去升级 Druid 的版本。我们在最早从 0.6 慢慢升级到 0.8,我们现在用的是 0.9。每一次 Druid 的发版,优化了很多东西。你觉得每一个查询有问题,或者说你想要去更快查询这些数据,可以优先考虑一下去 github 上面去看看 Druid 的最新近况。

这个就是今天给大家分享的一些东西。当然我们在使用 Druid 的过程当中,其实还遇到其他很多问题。也希望 Druid 能越来越好。

其他

Druid已基于Apache License 2.0协议开源,代码托管在github,当前最稳定版本是0.7.11,已经有63个代码Contributer和近2000个关注。Druid的主要贡献者包括广告分析创业公司Metamarkets、电影流媒体网站Metflix、Yahoo等公司。Druid官方对Druid通Shark、Vertica、Cassandra、Hadoop、Spark、Elasticsearch等在容错能力、灵活性、查询性能等方面进行了对比说明。

开源分布式系统Druid简谈的更多相关文章

  1. Druid:一个用于大数据实时处理的开源分布式系统

    Druid是一个用于大数据实时查询和分析的高容错.高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分析.尤其是当发生代码部署.机器故障以及其他产品系统遇到宕机等情况时,Druid仍 ...

  2. Druid:一个用于大数据实时处理的开源分布式系统——大数据实时查询和分析的高容错、高性能开源分布式系统

    转自:http://www.36dsj.com/archives/28590 Druid 是一个用于大数据实时查询和分析的高容错.高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分 ...

  3. .NET简谈接口

    自从面向对象开发方式的出现,抽象的概念就开始日新月异的发展,面向对象编程.面向接口编程.面向组件编程等等:这一系列的概念都是软件工程所追求的思想范畴,高类聚低耦合. 今天我要简谈的是面向对象里面非常重 ...

  4. .NET简谈构件系统开发模式

    转自[王清培] http://www.cnblogs.com/wangiqngpei557/archive/2011/06/14/2080416.html 在本人的“.NET简谈插件系统开发模式”一文 ...

  5. .NET简谈——跨进高级编程门槛的必经之路

    我们继续C#基础知识的学习,这篇文章对前面基础知识学习的朋友有着举足轻重的作用:为了延续基础知识学习的热情,我编写了这篇特殊的文章. 本篇文章的中心是想借“.NET简谈反射(动态调用)”一文继续发挥下 ...

  6. 简谈Java语言的继承

    Java语言的继承 这里简谈Java语言的三大特性之二——继承. Java语言的三大特性是循序渐进的.是有顺序性的,应该按照封装-->继承-->多态这样的顺序依次学习 继承的定义 百度百科 ...

  7. 简谈Java语言的封装

    简谈Java语言的封装 封装的定义 封装将复杂模块或系统的逻辑实现细节隐藏,让使用者只需要关心这个模块或系统怎么使用,而不用关心这个模块或系统是怎么实现的. 在面向对象的的编程中,我们一般通过接口来描 ...

  8. MPI简谈

    MPI简谈 MPI是分布式内存系统,区别于OpenMP和Pthreads的共享内存系统.MPI是一种基于消息传递的并行编程技术,是如今最为广泛的并行程序开发方法. MPI前世今生 MPI(Messag ...

  9. Druid :大数据实时处理的开源分布式系统(1)

    引言 Druid 是一个快速,近实时的查询海量只读数据的系统.Druid 的目标是可用性要达到100%,即使在部署新代码,或者某些节点 down 机的情况下. Druid 目前支持的单表查询方式和 D ...

随机推荐

  1. JAVAWEB应用模块(一)登录模块

    java后台代码(MD5加密+token验证): import com.smart.ssai.admin.domain.User; import com.smart.ssai.admin.servic ...

  2. 题解 【Codefoeces687B】Remainders Game

    题意: 给出c1,c2,...cn,问对于任何一个正整数x,给出x%c1,x%c2,...的值x%k的值是否确定; 思路: 中国剩余定理.详见https://blog.csdn.net/acdream ...

  3. IN中超过1000处理

    后台 所有用到IN的方法,都要考虑超过1000的可能 if(cameraIds != null && cameraIds.length > 0){sql.append(" ...

  4. Mybaits的中的对象映射(包含仅有基本数据类型的属性的和对象类型的属性的)

    转:https://blog.csdn.net/cjt20100/article/details/46547617. 1 constructor – 用来将结果反射给一个实例化好的类的构造器    a ...

  5. 怎样判断一个exe可执行程序是32位的还是64位的(转)

    转载自:https://blog.csdn.net/qq_23308823/article/details/54898119 怎样判断一个exe可执行程序是32位的还是64位的

  6. SpringCloud Netflix Feign

    调用其它机器上的服务(远程调用)有2种技术:REST.RPC. REST 注入RestTempalte,服务提供者的url要写成RESTful风格,在url中传递参数. 如果参数很多,url会有一长串 ...

  7. 通过django搭建一个简易的web页面(实现数据的查询、添加、修改、删除)

    一.创建django项目 通过命令创建: django-admin startproject 项目名称 创建app应用 python3 manage.py startapp 应用名 #这里manage ...

  8. ASP.NET + MVC5 入门完整教程四---MVC 中使用扩展方法

    https://blog.csdn.net/qq_21419015/article/details/80433640 1.示例项目准备1)项目创建新建一个项目,命名为LanguageFeatures ...

  9. [C++] JsonCPP 的使用 完整配置过程

    最近准备开发一个程序 需要用到C++ 解析json 原始的C++解析json是不现实的 自己也写不出来json解析方法(主要是不靠谱) 所以找到了jsoncpp 这个库 但是... 因为各种原因 配置 ...

  10. 题解【洛谷P1347】排序

    题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列\(A,B,C,D\) 表示\(A<B,B<C,C<D\).在这道题中,我们将给你一系列 ...