非结构化数据上进行结构化查询的方法

[TOC]

目标

灵活:强大的分析能力

高效:满足交互式分析的时效性要求,以及降低系统资源消耗。

技术方案

主要包括四个部分部分:

查询条件Pushdown优化

涉及到查询计划(QL)的选择优化,不知道是不是类似Calcite的基于成本的优化(Cost-based Optimize).

如果没有Pushdown优化,基本上就是原始的MR计算模式。

Pushdown优化可以分为两级:

  • Partition/Segment/Region/Chunk层级的过滤,可以考虑采用的技术包括:
    • 布隆过滤器(Boolean Filter)
    • 分区(Partitioning、Sharding)
    • Min-Max Filter
  • 存储引擎层级的过滤,比如用到了全文索引、主键索引、二级索引、列存储:
    • 可以进行Query Rewrite,进行Pushdown。

这两级过滤都不支持的部分,就只能逐条处理,在Map阶段进行处理了。

比如PostgreSQL的pg_trgm索引、Regex Search Index技术都是采用了Query Rewrite技术;Google Code Search项目的Regex搜索也是采用了Query Rewrite技术。

动态字段提取

由于这个需求的存在,列存储方案(如Apache Druid、InfluxDB)无法满足需求。

列存储的前提在于,数据已经前置处理好成为结构化数据(一般通过ETL、流计算等方式)。

Hive的UDF可以某种程度上实现这个,不过灵活性比较差。

Pipeline式处理流

算是MR的多Stage优化,比如Storm的Topology、Spark的DAG、Tez的DAG等。

基于Segment的MR式分布式计算

也就是支持Scater/Gather计算模式,从而发挥分布式并行计算的能力。

必须把计算(也就是执行计划Query Plan)推送到数据节点上,然后汇总数据;相反的,如果把数据汇总再统一处理,是不可行的。

技术难点

架构设计

基于ES的方案

基于Kafka的方案

基于CarbonData的方案

参考资料

[1] Splunk专利US8751486

此文作者:Benjamin Tan, 分类: bigdata, 标签: unstructurequery-engine, 发布于:2016-10-11 00:00:00 +0000。
转载须以超链接形式标明文章原始出处和作者信息及版权声明.