2019独角兽企业重金招聘Python工程师标准>>>

druid.io剖析

简介

druid作为现在最有潜力的海量数据实时分析系统,在优酷广告团队中扮演者非常重要的角色

整体架构

现在已经用tranquility+indexing service替换realtime

实时数据经由tranquility被推送到Indexing Service,然后生成索引(Segment),同时提供来自用户的 查询请求。当索引所在的时间段过去以后,Indexing Service会将索引推送到deep storage。 索引信息会被注册到metadata中。协调节点定时同步metadata,感知新生成的Segment, 并通过Zookeeper去通知历史节点加载索引。

除了实时加载数据,Druid也支持批量导入数据。导入的数据生成索引segment,写入deep storage, 经与上述同样的步骤,通过修改metadata信息将segment加载到历史节点。

Lambda架构思想

Lamda架构用来同时处理离线和实时数据

druid借助lambda思想,很好的解决了实时处理逻辑会丢弃时间窗口以外的数据的问题。

  • 实时:通过tranquility拉取数据并导入druid
  • 离线:通过druid提供的Hadoop Indexer(实际上是mr任务)获取hdfs数据,生成segment并导入hdfs,并将索引元信息导入mysql。druid定时轮询mysql并获取最新索引数据,最后通过指定负载均衡算法分配给工作节点

依赖

kafka(16c32g480gx8)

TT日志-->storm etl-->kafka

kafka作为storm和druid之间的缓冲

tranquility(4c8g120gx9)

/home/admin/druid-tranquility/default

config目录存储了很多json文件,定义了数据源的schema,也就是druid表结构,所有schema中配置的segmentGranularity都是hour级别, queryGranularity有hour也有minute级别

重要参数

segmentGranularity不等于queryGranularity

  • segmentGranularity:索引粒度,也就是一个segment文件包含的数据时间范围
  • queryGranularity:查询粒度,也就是最小聚合粒度,代表数据存储的时候,在维度相同的情况下,同一查询粒度范围内的数据会自动被聚合,导致查询的时候只能查到该粒度级别的数据
  • intermediatePersistPeriod:定时持久化增量索引的周期,目前大多是5min
  • windowPeriod:时间窗口,表示如果数据时间比当前时间老或者比当前时间新,超过该窗口范围之外的全部被丢弃,目前大多是10min,也有5min

推荐配置:intermediatePersistPeriod ≤ windowPeriod < segmentGranularity,queryGranularity<= segmentGranularity

tranquility工作流程:

简而言之,tranquility会做两件事:

  • 建立索引任务并发给overlord:tranquility发送的task会被overlord接受,最后会占用middle-manager的一个空闲slot。为防止太多task,tranquility会为同一个segmentGranularity范围之内的task分配同一个id,这个所有发送过去的task都会被合并。还有两个配置项影响task数量,tranquility可以在schema中为每个数据源配置partitions和replicants,一个小时以内请求的task数量= partitions * replicants。目前middle-manager的所有slot数量都可以在overlord UI查看,可以根据剩余slot数量来修改配置中的partitions和replicants参数。建立的task主要目的是明确每个tranquility该往哪个peon发送实时数据,即实时数据在众多peon中负载均衡的策略(稍后讨论handoff阶段
  • 将实时数据发送给peon进程:peon会通过EventReceiverFirehose服务暴露一个http接口,tranquility通过zookeeper获取task的分配信息,明确实时数据该往哪个peon发,并将peon暴露的接口发起post请求,提交实时数据

内部组件

indexing service

indexing service分为三个组件(工作进程),用类似storm的nimbus->supervisor->worker的方式工作

  • overlord(4c8g120gx2):接收tranquility请求的实时索引task,选择slot空闲最多的middle-manager,通过zk将task分配给middle-manager,填满为止。目前overlord两台机器,master-slave结构
  • middle-manager(4c8g120gx51):通过zk获取task,启动本地进程peon执行task
  • peon:获取实时数据,执行task,完成索引建立。peon本身还负责索引查询服务

index service接收tranquility请求并处理的整个流程:

peon完成了索引build,merge,handoff的整个生命周期

每个middle-manger有N个slot,对应N个peon,每次分配一个索引task就会创建一个peon进程,这个小时以内peon会占据这个slot,等完成handoff之后才释放

这个小时以内,peon会不断生成增量索引,定时持久化索引,合并索引生成segment,最后handoff segment

handoff流程:

historical(16c32g480gx10)

historical提供索引加载和查询服务

历史节点在从下载segment前,会从本地缓存检查是否存在,如果不存在才从hdfs下载。下载完成之后,会根据zk获取到的压缩信息进行解压处理并加载到内存,这时就能提供查询服务。

可以通过配置给历史节点划分不同的层,然后在coordinator配置规则来加载指定数据源到某个层。这样可以实现冷热数据划分处理,热数据查询多存量小,采用更好的cpu和内存机型配置,冷数据查询少存量大,采用更大的硬盘机型配置

broker(16c32g480gx2)

broker负责查询索引,目前是master-master结构

broker是查询节点,负责接受查询请求,解析查询对象中的时间范围,根据时间范围将实时索引请求(当前小时)路由到peon节点,将历史索引请求(1小时之前)路由到historical节点。接收peon和historical查询返回的数据,在做一次合并,最后返回结果

为了提高查询效率,broker会将查询结果缓存(LRU),目前提供了两种方式:

  • heap memory(目前使用)
  • kv存储,如memcached

只会缓存历史节点返回的数据,因为peon返回的实时数据经常改变,没有缓存的价值

coordinator(4c8g120gx2)

coordinator会协调历史节点中segment的分配

  • rules:每分钟从mysql拉取druid_rules和druid_segments,rules用来告知historical将如何load和drop索引文件,coordinator会读取这些rules,然后修改zk,通知historical加载删除指定的segment,这些都可以在coordinator的UI配置
  • load balance:根据zk中每个historical node负责的segment量,做负载均衡
  • replication:在coordinator的UI中配置rules时,可以同时配置加载segment的备份数量,这些备份数量会以load balance的形式,分配到多个historical上面。这个备份数量与hdfs的segment备份数量不一样,hdfs那个保证深度存储的数据不会丢失,historical上面备份是为了保证当某个historical挂掉的时候,其他存储了备份segment的节点能接着提供查询服务

外部依赖

zookeeper

druid依赖zk实现集群之间的交互

druid采用shard-nothing架构,每个节点之间不直接和其他打交道,而是采用zk来沟通。这样保证了druid本身的HA特性

peon和historical发布索引

  • /druid/announcements:声明所有peon和historical的host
  • /druid/segments:记录所有peon和historical的host,以及他们负责的索引

提供indexing service相关数据(overlord页面数据来源)

  • /druid/indexer
  • leaderLatchPath:overlord选主
  • tasks:运行的peon任务
  • status:peon任务状态
  • announcements:声明middle-manager的capacity

coordinator用来通知historical加载卸载索引

  • /druid/loadQueue/_historical_host/_segement_id:记录历史节点所负责的segment

coordinator选主

  • coordinator:记录coordinator信息

集群通信

  • discovery:集群中所有服务

附属功能

  • /druid/listeners:存储lookup数据

deep storage —— hdfs

存储索引文件

metadata storage —— mysql

存储元数据

  • druid_segments:索引元数据,数据源、是否可用、大小、维度、指标
  • druid_rules:通知historical该如何加载、卸载索引的规则,可以在coordinator配置
  • druid_config:存放运行时配置信息
  • druid_audit:记录配置、规则的变化
  • druid_task(相关的几张表):overlord用来存放索引task数据,防止overlord挂掉导致task丢失

索引文件

segment就是压缩后的索引文件,命名方式为datasource_intervalStart_intervalEnd_version_partitionNum。如dsp_report_2011-01-01T01:00:00Z_2011-01-01T02:00:00Z_v1_0,代表dsp_report数据源,从2011-01-01那天1点到2点的数据,版本号为v1,分区数为0

深入剖析segment存储结构

  • version.bin:4字节,记录segment version
  • XXXXX.smoosh:该文件存放多个逻辑意义上的子文件,通过记录offset来管理这些子文件。有的子文件存放了column信息,有的存放了索引元信息。column信息也就是真实存储的数据
  • meta.smoosh:上面这些子文件名称以及他们出现的offset都记录在meta.smoosh中

XXXXX.smoosh中存放的column是最重要的,可以分为Timestamp, Dimensions, Metrics三部分。

timestamp domain advertiser device city click cost
2015-11-25T10:00:00Z youku.com BMW Android Peking 9 0.9
2015-11-25T10:00:00Z youku.com BMW Iphone HongKong 3 0.3
2015-11-25T10:00:00Z tudou.com PANDORA Iphone HongKong 2 0.2
2015-11-25T10:00:00Z tudou.com PANDORA Iphone Peking 1 0.1
  • Timestamp:用时间戳来表示时间,可以用一系列时间戳表示该segment所有Timestamp列信息,采用LZ4算法压缩
  • Metrics:也是数字,存放方法同上,压缩算法同上
  • Dimensions:由于Dimensions大多是字符串,采用上面的存放方式无法很好压缩。目前Dimensions拆分成多个结构进行存储。

Dimensions结构:

  1. 将字符串映射为整数id的字典
  2. 记录该dimension每一行的值,值用上述字典编码
  3. 为每个不同dimension的值,定义一个bitmap,存储该值出现的行号,采用roaring压缩算法

上述结构中,1可以有效减少索引文件的大小,2的基础上做排序可以很方便的做groupby合并处理,3是快速完成where条件查询的利器。

内存管理

druid使用了三种不同类型的内存:

  • 堆内存:broker用来缓存查询结果、简单计算
  • 直接内存:一般用来存储聚合操作中所产生的临时数据
  • MMap:历史节点用来加载segment,快速,减少一次系统复制操作。memory_for_segments = total_memory - heap - direct_memory - jvm_overhead,segment可用的内存越小,mmap操作就会导致更多的内存换页操作

参考资料

  • http://druid.io/
  • http://static.druid.io/docs/druid.pdf
  • https://book.douban.com/subject/26954670/
  • https://github.com/druid-io/druid
  • https://www.slideshare.net/seoeun25/druid-realtime-indexing

转载于:https://my.oschina.net/u/1378920/blog/900657

druid.io剖析相关推荐

  1. druid.io 海量实时OLAP数据仓库 (翻译+总结) (1)——分析框架如hive或者redshift(MPPDB)、ES等...

    介绍 我是NDPmedia公司的大数据OLAP的资深高级工程师, 专注于OLAP领域, 现将一个成熟的可靠的高性能的海量实时OLAP数据仓库介绍给大家: druid.io NDPmedia在2014年 ...

  2. druid.io mysql 配置_druid.io 使用mysql存储metadata overlord启动出错

    这是druid.io批量导入数据时出现的问题,当启动overlord节点时,运行的命令如下: java -Xmx2g -Duser.timezone=UTC -Dfile.encoding=UTF-8 ...

  3. druid.io 海量实时OLAP数据仓库 (翻译+总结) (1)

    介绍 我是NDPmedia公司的大数据OLAP的资深高级工程师, 专注于OLAP领域, 现将一个成熟的可靠的高性能的海量实时OLAP数据仓库介绍给大家: druid.io NDPmedia在2014年 ...

  4. ioprofile mysql_使用pt-ioprofile对MySQL作IO剖析

    使用pt-ioprofile对MySQL作IO剖析 [root@mysql1 db_application]# /usr/local/pt-tookit/bin/pt-ioprofile Fri Ju ...

  5. Druid.io index_realtime实时任务源码分析

    目录 前言 以[消防]工作来形象类比 实时任务大体流程介绍 Ingest 阶段 Persist 阶段 Merge 阶段 Hand off 阶段 任务的提交到启动 任务的提交 相关源码分析 任务队列和o ...

  6. druid.io集群与tranquility对zookeeper的使用(2)

    目录 前言 middleManager启动 : znode创建,workers维护 overlord接收任务并分配一个worker middleManager监听新增任务去启动peon进程 peon进 ...

  7. druid.io index_realtime任务的hand off:仍然是源码+log说清楚

    目录 前言 源码 + log 说明流程 总结 前言 之前的博文:Druid.io index_realtime实时任务源码分析 介绍了整个index_realtime任务运行的流程,但是对于某些细节还 ...

  8. druid.io中文版文档

    最近我们公司另一个大牛已经在进行druid.io文档的翻译并增加了自己的一些注解,后续翻译还在进行中,如有错误多多反馈. 链接地址如下: 中文版文档 列表地址

  9. Druid.io系列(一):简介

    Druid.io(以下简称Druid)是面向海量数据的.用于实时查询与分析的OLAP存储系统.Druid的四大关键特性总结如下: 亚秒级的OLAP查询分析.Druid采用了列式存储.倒排索引.位图索引 ...

最新文章

  1. 华为日志服务器文档,免费日志服务器
  2. 使用keras构建LSTM分类器
  3. aop springboot 传入参数_java相关:springboot配置aop切面日志打印过程解析
  4. 2011考研数学复习注意三点 不提倡题海战术
  5. python调整数组顺序使奇数位于偶数前面
  6. 网络监听listen技术是什么原理?
  7. 请珍惜应届生的身份,这是你这辈子最大的一次优势,也是最后一次!
  8. Linux学习之系统编程篇:编写一个守护进程
  9. Eclipse中导入外部jar包
  10. 掐头法和去尾法记音标
  11. 设计模式 总揽 通过这篇随笔可以访问所需要了解的设计模式
  12. ffdshow 源代码分析1 : 整体结构
  13. 高清优质PPT模板20篇下载(金融投资系列)
  14. [Proteus8]使用proteus8对单片机进行模拟仿真,记录方波图出现的过程
  15. 【Elasticsearch源码】 GET分析
  16. EF Core 日志跟踪sql语句
  17. python把汉字变成拼音英文_Python把汉字转换成拼音
  18. Localization-Aware Active Learning for Object Detection (ACCV)
  19. java 导入excel 日期格式转换
  20. 装柜设计软件MaxLoad Pro3 出售

热门文章

  1. 无需注册试用ChatGPT
  2. GOTC 2023全球开源技术峰会
  3. 盘点那些恶搞C++小程序
  4. 计算机系英文简历常用的词汇,计算机专业英文简历词汇
  5. 墙裂推荐ShapeView二
  6. wps里ppt怎么换另一个的模板_从没想过,这个基础的PPT数据图表,原来还是排版神器!...
  7. Java 如何判断一个字符串中是否包含某一 子字符串
  8. 本田思域自动挡挡位图解,思域换挡操作技巧
  9. Allegro PCB Design GXL (legacy) 从dxf文件中导入板框
  10. Unite 2017 Shanghai 四大技术专场全面解锁