论文部分内容阅读
目前,工业界各个IT公司面临的数据量急剧增加,且处理的数据类型从单一的结构化类型扩展至复杂的非结构和半结构化的数据类型。在这种背景下,传统型数据库已经不适合这种场景,而以HBase为代表的NoSql数据库越来越受到重视。业界不仅用HBase来存储日志信息,也有不少公司直接用HBase来存储大量的用户信息以及商品信息。于是,如何在HBase上对这些数据进行统计、分析、甚至是多表关联查询,已经成了学术界和工业界的研究热点。 本文主要研究如何在HBase数据库上进行复杂的多表SQL关联分析查询。本文研究了目前已有的开源系统,如Impala,Hive,Phoenix,并对他们的原理和性能做了充分的研究分析。我们发现目前已有的开源系统均不能很好的完成HBase上复杂查询的任务。在分析这些开源系统的优缺点之后,本文提出了一个基于Impala的复杂查询解决方案,该系统可以很好的完成HBase上复杂查询的功能,其性能领先于目前所有已知的HBase复杂查询解决方案或系统。 首先,我们重新设计了HBase与Impala的数据交互层,用Apache Thrift通信框架替换原有的JNI通信方式,解决了原来Impala中存在的JAVA GC问题,以及JNI方式不适合大量数据传输的问题。我们通过Thrift框架,设计了一个独立的数据传输引擎,为了便于表述,后文将该独立进程称为HBaseDataEngine。HBaseDataEngine负责从HBase获取数据,并最终返回给Impala。 其次,我们在用HBaseDataEngine传输数据时,使用了异步内存缓存,将传输时延降至了最低,并充分提高了数据传输的效率。不仅如此,通过这层缓存的设计,可以做到HBaseDataEngine和Impala拉取数据的速度同步。同时,在缓存的设计上,本文发明了一种动态自适应的缓存大小分配算法,在保证速度的前提下,可以动态调整缓存的大小,避免了因缓存太大造成对内存的浪费;同时也可以避免因缓存太小,对速度造成影响。 为了加快HBaseDataEngine从HBase获取数据的速度,我们设计了多路并发扫描。我们充分利用了HBase多分片(region)的特点,实现了多路并发查询扫描,解决了Impala单线程线性查询数据慢的问题。 最后,我们实现了丰富的谓词下推功能。我们做到了单表带有where查询的谓词下推和单表统计的谓词下推。为了完成谓词下推功能,我们设计了一套独立的编码解码规则,摒弃了Impala对HBase数据库的编码规则,在不影响性能的前提下,做到了单表查询的最优设计。 我们在TPC-DS标准测试基准上,选取了多条复杂查询语句进行测试。测试结果表明,与原来的Impala在HBase上的查询效率相比,我们的系统在查询效率上提高了5到10倍。与Phoenix相比,在复杂查询上效率提高了15%至100倍,具体来说,如果是大小表之间的关联查询,我们的系统相对Phoenix有15%到25%的提升,如果是大表之间的关联查询,性能有了100倍的提升。