当前位置: 首页 > news >正文

《从0开始学大数据》之如何自己开发一个大数据SQL引擎

背景

大数据仓库 Hive,作为一个成功的大数据仓库,它将 SQL 语句转换成 MapReduce 执行过程,并把大数据应用的门槛下降到普通数据分析师和工程师就可以很快上手的地步。

但是 Hive 也有自己的问题,由于它使用自己定义的 Hive QL 语法,这对已经熟悉 Oracle 等传统数据仓库的分析师来说,还是有一定的上手难度。特别是很多企业使用传统数据仓库进行数据分析已经由来已久,沉淀了大量的 SQL 语句,并且这些 SQL 经过多年的修改打磨,非常庞大也非常复杂。这样的 SQL 光是完全理解可能就要花很长时间,再转化成 Hive QL 就更加费力,还不说转化修改过程中可能引入的 bug。

要想那些在 Oracle 上运行良好的 SQL 可以直接运行在 Hadoop 上,而不需要重写成 Hive QL,必须要自己开发一款能够支持标准数据库 SQL 的大数据仓库引擎,就比如李智慧老师曾经参与的Panthera项目。

Hive QL 的主要处理过程

  1. 将输入的 Hive QL 经过语法解析器转换成 Hive 抽象语法树(Hive AST)。
  2. 将 Hive AST 经过语义分析器转换成 MapReduce 执行计划。
  3. 将生成的 MapReduce 执行计划和 Hive 执行函数代码提交到 Hadoop 上执行。

再看Panthera设计

Panthera 的设计思路是保留 Hive 语义分析器不动,替换 Hive 语法解析器,使其将标准 SQL 语句转换成 Hive 语义分析器能够处理的 Hive 抽象语法树。用图形来表示的话,是用红框内的部分代替黑框内原来 Hive 的部分。
极客时间《从0开始学大数据》
红框内的组件我们重新开发过,浅蓝色的是我们使用的一个开源的 SQL 语法解析器,将标准 SQL 解析成标准 SQL 抽象语法树(SQL AST),后面深蓝色的就是团队自己开发的 SQL 抽象语法树分析与转换器,将 SQL AST 转换成 Hive AST。

标准 SQL 和 Hive QL 的差别在哪里

差别1:语法表达方式
Hive QL 语法和标准 SQL 语法略有不同;

差别2: Hive QL 支持的语法元素比标准 SQL 要少很多;
比如,数据仓库领域主要的测试集TPC-H所有的 SQL 语句 Hive 都不支持。尤其是 Hive 不支持复杂的嵌套子查询,而对于数据仓库分析而言,嵌套子查询几乎是无处不在的。比如下面这样的 SQL,在 where 查询条件 existes 里面包含了另一条 SQL 语句。

select o_orderpriority, count(*) as order_count 
from orders 
where o_orderdate >= date '[DATE]' 
and o_orderdate < date '[DATE]' + interval '3' month 
and exists 
( select * from lineitem 
where l_orderkey = o_orderkey and l_commitdate < l_receiptdate ) 
group by o_orderpriority order by o_orderpriority;

所以开发支持标准 SQL 语法的 SQL 引擎的难点,就变成如何将复杂的嵌套子查询消除掉,也就是 where 条件里不包含 select。

简而言之,就是先得出原始SQL的AST(抽象语法树),程序通过使用装饰模式的设计来不断扩展支持更多语法,再使用组合模式对抽象语法树进行遍历,从而等价转换成Hive格式的AST,就可以交给 Hive 的语义分析器去处理了,从而也就实现了对标准 SQL 的支持。

思考题

SQL 注入是一种常见的 Web 攻击手段,如下图所示,攻击者在 HTTP 请求中注入恶意 SQL 命令(drop table users;),服务器用请求参数构造数据库 SQL 命令时,恶意 SQL 被一起构造,并在数据库中执行。
极客时间《从0开始学大数据》

但是 JDBC 的 PrepareStatement 可以阻止 SQL 注入攻击,MyBatis 之类的 ORM 框架也可以阻止 SQL 注入,请从数据库引擎的工作机制解释 PrepareStatement 和 MyBatis 的防注入攻击的原理。

来自极客时间的精选留言

大神1

因为SQL语句在程序运行前已经进行了预编译,在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析,编译和优化,对应的执行计划也会缓存下来并允许数据库已参数化的形式进行查询,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1’也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令,如此,就起到了SQL注入的作用了

大神2

基于SQL的大数据仓库引擎panthera的核心任务是把SQL语义与Hive AST对应起来。难点是SQL的语义远比Hive AST丰富,而幸运的事SQL丰富的表意逻辑主要源于它的嵌套子语句,这在Hive AST中是不存在的。但是SQL的嵌套子语句可以等价于若干jion操作。

为了在工程上降低实现难度,特意为每个语法点设计一个对象(类),这就将复杂问题分解为无数个小步骤,可以持续交付,不用长期等待,从而将不可能有条件的变为可能。而且每个类的代码十分简洁,遇到问题也便于各个击破。

该笔记摘录自极客时间课程
《从0开始学大数据》

相关文章:

  • websoket是干么的如何基于websoket实现一个简单的消息通信。
  • nacos 服务发现获取列表源码分析
  • 【MySQL】过年没有回老家,在出租屋里整理了一些思维导图
  • 《流浪地球 2》 Deepfake 小试牛刀,45+ 吴京「被」年轻,变身 21 岁小鲜肉
  • C++工程实践必备技能
  • GitHub访问问题与FastGithub下载及使用(详细篇)
  • <使用Python自定义生成简易二维码>——《Python项目实战》
  • Spring Boot 热部署(热加载)
  • 又一个开源工具搞完了,工作效率直接翻倍
  • 入职-环境安装篇
  • 自动驾驶感知——毫米波雷达
  • MySQL运维(二)MySQL分库分表概念及实战、读取分离详解
  • K8s简介之什么是K8s
  • webgl绘制图形API——drawArrays、drawElements
  • 不平衡数据集的建模的技巧和策略
  • C++入门教程(10):for 语句
  • CentOS从零开始部署Nodejs项目
  • javascript 哈希表
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Python 基础起步 (十) 什么叫函数?
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Webpack 4 学习01(基础配置)
  • 成为一名优秀的Developer的书单
  • 分享几个不错的工具
  • 数据结构java版之冒泡排序及优化
  • 微信开放平台全网发布【失败】的几点排查方法
  • 微信小程序设置上一页数据
  • 小程序开发中的那些坑
  • 组复制官方翻译九、Group Replication Technical Details
  • ​MySQL主从复制一致性检测
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ###项目技术发展史
  • #传输# #传输数据判断#
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET使用存储过程实现对数据库的增删改查
  • /bin/rm: 参数列表过长"的解决办法
  • @Async注解的坑,小心
  • @property @synthesize @dynamic 及相关属性作用探究
  • @Transaction注解失效的几种场景(附有示例代码)
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [C++]C++入门--引用