Broker负责接收查询请求,请求处理过程如下:
- Broker首先会检查哪些segment拥有可以用于处理该查询的数据,这时候会通过查询时间以及datasource的其他partition信息来裁剪掉没有用的segment;
- Broker会检查哪些Historical和MiddleManager进程拥有这些segment,并将子查询请求发送个这些相应的进程;
- Historical/MiddleManager进程执行所收到的子请求,处理完以后返回结果给borker;
- Broker收到结果以后合并所有查询结果,将合并后的查询结果返回给最初的请求者。
通过查询时间裁剪数据是Druid用来减少查询所需要数据扫描量的重要方式,Druid还通过其他方式来进一步减少查询所需要扫描的数据:查询所用的过滤条件是比时间更细粒度的裁剪机会,Druid会进一步利用内部的索引结果来找出符合过滤条件的行;然后找出需要被访问的列,在处理列时只会扫描符合条件的行,避免访问那些不符合过滤条件的数据。
总之,Druid采用三种不同的技术来最大化查询性能:
- 根据查询时间,裁剪不需要被访问到的segment;
- 在segment内部,使用索引识别符合查询条件的行;
- 在segment内部,只访问那些被查询的列在符合条件的行上的数据。
本文翻译自:http://druid.io/docs/latest/design/
更多内容请访问:Druid.IO介绍系列之汇总篇