介绍一下Mysql和Hivesql的区别?
一方面,可以从底层原理出发回答,例如:
- 查询语言不同:
Hive是hql语言,Mysql是sql语句;
- 存储位置不同:
Hive是建立在 Hadoop 之上的,所有数据存储在hdfs中的,而Mysql数据是存储在自己的本地文件系统中;
- 数据格式:
Hive数据格式可以用户自定义,Mysql有自己的系统定义格式;
- 数据更新:
由于Hive的设计是针对数据仓库的应用而设计,应用场景读多写少。故Hive中不支持对数据的增改。而Mysql中的数据可支持更新修改;
- 索引:
Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些 Key 建立索引,在查询数据时是通过Mapreduce很暴力的把数据都查询一遍,因此访问延迟较高。但由于 MapReduce 的引入,Hive 可以并行访问数据,故即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。而Mysql有索引,对于少量特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。
- 数据规模:
由于 Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此Hive存储的数据量超级大,而Mysql只是存储一些少量的业务数据;
- 底层执行原理:
Hive底层是用的Mapreduce,而Mysql是excutor执行器;
另一方面,也可以从作为使用者角度出发回答,例如:
- Hivesql不支持非等值连接,一般使用left join、right join 或者inner join替代来处理逻辑;
- Hive中不能使用省去join的写法;
- Hive不支持将数据插入现有的表或分区中,仅支持覆盖重写整个表。利用INSERT OVERWRITE 重写覆盖;
- HQL不支持行级别的增、改、删,所有数据在加载时就已经确定,不可更改。
如果查询一个数据很大很慢,该如何解决?
Hive对SQL语句性能问题排查的方式有:
- 使用explain查看执行计划;
- 查看YARN提供的日志。
常用的优化思路有:
- SQL语句优化:例如,是否使用了distinct,是否可以加入一些限定条件过滤等;
- 调参优化:例如设置map、reduce的参数;并行执行,调节parallel参数等;
- 数据格式优化:执行同样的SQL语句及同样的数据,只是数据存储格式不同,执行时长也会不同。
- 以空间换时间:例如,有效地减小数据集,拆写逻辑,建立临时表。
为什么要对数据仓库分层?
操作者:数据仓库分层本质是 以空间换时间。通过数据分层管理可以简化数据清洗的过程,相当于把一项复杂的工作拆成了多个简单步骤的工作,从一个大的黑盒变成了一个透明盒,每一层的处理逻辑相对易理解易操作,较易保证每一个步骤的正确性,当数据发生错误的时候,一般不会牵一发而动全身,只需要局部调整某个步骤即可。若不分层,当源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大,耗时较长。
应用者:提升应用系统的用户(比如BI)体验和效率。例如
- 清洗后的脏数据,简化业务复杂结构数据,具有清晰数据结构,减少重复开发;
- 规范的表&段名称,统一的字段数据格式,完善的注释内容,易于定位和理解。
数仓分层的结构有哪些?每一层的大致作用是什么
常见通用数仓分层设计:ODS、DW、APP
每层主要作用如下:
- ODS:数据源层。主要将各个业务数据导入到大数据平台,作为业务数据的快照存储。
- DW:汇总数据层。
-
- DWD:明细数据层。保留数据的原始粒度,在ODS基础上对数据加工处理,提供清洗后较干净的数据。
- DWS:汇总数据层。主题层,根据业务域划分,存放高度聚合汇总的数据。
- APP:面向业务定制的应用数据层。服务于业务特定场景,复用性不强。