Mysql查询+hiveSQL查询+SparkSQL查询对比(个人总结)

1.首先讲下Mysql吧,适用于实时性的查询,一般使用场景都是通过走B+树索引,来让查询效率维持在毫秒级。但是缺点也很明显,举个例子查询的量过大,有百万级别,Mysql直接OOM了。存在性能的瓶颈。而hiveSQL和sparkSQL的查询不存在这种问题,计算完成后的数据都是分布式存储的。

 

2.所以和Mysql对比,hiveSQL查询和sparkSQL查询都是分布式上的操作了,假设两种查询都是查询的hive表,hive表底层存储的数据方式依赖于HDFS(一个分布式的文件存储系统),hiveSQL会转化为Map-Reduce程序,通过Yarn的资源调度,来完成Map的并行处理,然后传递给下一批节点完成Reduce的并行处理,最后批量导出结果或者分布式存储数据。

==>不得不提的是hive其实用了Mysql作为meta数据的存储:

元数据存储:通常是存储在关系数据库如 mysql/derby 中。Hive 将元数据存储在数据库中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。

==>不得不提的是,hive在某个版本之后增加了索引机制,而索引在hive中就是一张索引表,在表里面存储索引列的值,值对应HDFS的文件路径,该值在数据文件中的偏移量。

 

3.spark SQL,底层其实是RDD的计算,spark整体架构就三个特点。

1.分布式

2.基于内存

3.迭代式计算

RDD代表的意思是弹性分布式数据集,初始RDD(也就是数据源)可以是hdfs上的文件,也可以是hive表中数据,都是分布式分片存储的,第一步就是让这些分布式节点将数据都存在内存中,然后进行算子计算,将结果发送给其他节点。第二步,其他节点将接受到的数据也存入内存,经过算子计算,重复操作,直至最后一个RDD。

==> 需要注意的和hiveSQL底层的不同

1.spark SQL底层的RDD计算多少次迭代是控制的,不像hiveSQL底层的Map-Reduce计算一个Job只能两阶段。

2.RDD尽量会将数据都读入内存中,内存不够会存入磁盘,所以其计算,包括发送数据等操作都比MR快。

3.RDD迭代计算的时候,如果某个阶段的内存数据丢了,他会自动重新从源数据那里取出重新计算,整个过程透明。

4.RDD迭代计算,第一个RDD计算的节点们,可能后续会变成第4个RDD计算的节点,是一个循环覆盖的流程。

你可能感兴趣的:(烦人的中间件)