论文部分内容阅读
随着大数据的持续发展,内存计算技术愈发成熟,SQL-on-Hadoop技术也得到进一步提升,基于分布式数据存储的SQL查询逐渐成为一种新的大数据分析方式。业界也涌现出了多个具有代表性的分布式SQL查询平台或引擎,如Apache Hive、Facebook Beringer、Spark SQL等。这些分布式查询引擎由于应用场景各有差异,在不同查询上体现的效率也各种千秋。本文充分考虑分布式SQL查询的应用场景以及计算平台的效率优势,针对Spark SQL分布式查询优化展开了研究。 本文提出了基于海量Parquet文件构建分布式可拔插索引的方法。Parquet是一种高效的列式存储格式。本文通过将索引和数据分离的策略,离线扫描海量Parquet文件,将文件、文件ID、文件存储路径形成映射关系,压缩存储在Redis集群中。为了保证索引的正确性和一致性,引入了元数据管理模块,并将索引持久化到硬盘。在索引更新过程中,可基于快照快速同步更新,同时保证索引无冗余,减少索引过大对存储的影响。 为实现基于分布式索引的Spark SQL查询优化,本文提出了基于分布式索引的RDD(Resilient Distributed Datasets)分区裁剪策略。在Spark SQL查询过程中,首先基于分布式索引进行查询,然后通过对比返回的命中文件集合与原始RDD文件集合,对RDD分区进行裁剪。通过缩减分区文件数量,减少了Spark SQL需要扫描的数据集,加速了整个Spark SQL查询。 为了连接分布式索引和分布式查询,本文基于Django WEB框架实现了索引查询服务Djindex。对于查询客户端下发的SQL语句,Djindex服务先对SQL进行语义解析,对于不能利用索引加速查询的语句,将直接发送给Spark SQL查询;对于可以利用索引加速的查询,则提取查询谓词,转换成索引服务可识别的查询关系,并分布式下发查询给索引存储服务。在索引返回阶段,对命中的文件进一步去重,精简数据集,然后返回给Spark SQL查询。对于无命中记录的索引查询,Djindex服务会将结果直接返回给客户端,避免数据扫描,提升查询性能。 总的来说,本文基于分布式可拔插索引构建技术和分布式Spark SQL查询规划技术,实现了优化后的Spark SQL查询引擎。实验表明,经过索引优化后的Spark SQL查询引擎在等值查询、集合查询、模糊查询、多表连接查询和多条件组合查询等方面具有明显优势。此外,优化后的分布式Spark SQL查询框架也具有良好的可扩展性和强大的容错能力。