Presto、SparkSQL、Hive的⽐较
⼀、Presto
Presto是Facebook开源的,完全基于内存的并⾏计算,分布式SQL交互式查询引擎是它被设计⽤来专门处理⾼速,实时的数据分析。Presto本⾝不存储数据,但是可以接⼊多种数据源,并且⽀持跨数据源的级联查询。
与MySQL对⽐:MySQL⾸先是⼀个单点关系型数据库,其具有存储和计算分析能⼒,⽽Presto只有计算分析能⼒;在数据量⽅⾯,MySQL 不能满⾜当前⼤数据量的分析需求,在这样的背景下,Facebook开发出Presto这样⼀个可以满⾜⼤数据量分析需求的⼯具。
Presto只有计算分析能⼒但可以连接多种数据源,包括Hive,Oracle,MySQL,Kafka,MongoDB,Redis等,并且可以将多个不同数据源进⾏联合分析。可以通过show catalogs 命令看到Presto连接的所有数据源。
Presto是⼀个低延迟⾼并发的内存计算引擎,相⽐Hive,执⾏效率要⾼很多。
擅长:
1、轻量快速,⽀持近乎实时的查询
2、Facebook内部⼴泛使⽤,有好的扩展性和稳定性
3、和impala同样使⽤分布式查询引擎,和传统的Mapreduce相⽐,消除了延迟和磁盘IO开销
4、有完善的⽂档
⼆、Hive
Apache Hive数据仓库软件可以使⽤SQL⽅便地阅读、编写和管理分布在分布式存储中的⼤型数据集。结构可以投射到已经存储的数据上。提供了⼀个命令⾏⼯具和JDBC驱动程序来将⽤户连接到Hive。Hive是基于Hadoop的⼀个数据仓库⼯具,可以将结构化的数据⽂件映射为⼀张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进⾏运⾏。其优点是学习成本低,可以通过类SQL 语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应⽤,⼗分适合数据仓库的统计分析。
Hive是建⽴在 Hadoop 上的数据仓库基础构架。它提供了⼀系列的⼯具,可以⽤来进⾏数据提取转化加载(ETL),这是⼀种可以存储、查询和分析存储在 Hadoop 中的⼤规模数据的机制。Hive 定义了简单的类 SQL 查询语⾔,称为 HQL,它允许熟悉 SQL 的⽤户查询数据。同时,这个语⾔也允许熟悉 MapReduce 开发者的开发⾃定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer ⽆法完成的复杂的分析⼯作。
Hive 没有专门的数据格式。 Hive 可以很好的⼯作在 Thrift 之上,控制分隔符,也允许⽤户指定数据格式
Hive执⾏HQL语句有以下三种⽅式:
1:直接命令⾏执⾏SQL语句:hive -e "select from table…
2:执⾏HQL⽂件中的语句:hive -f temp.hql
3:打开调试模式:hive --hiveconf
hbase主要用来储存什么数据优点:
运⾏在Mapreduce框架之上,⾮常好的⽀持⽤户⾃定义函数,可以⽅便的和hbase等系统结合使⽤。
缺点:
拥有MapReduce所有缺点,包含昂贵的Shuffle操作和磁盘IO操作,不⽀持多个reduce操作group by和order by查询,对⽐相关竞品查询速度较慢
三、Spark SQL
SparkSQL的前⾝是Shark,给熟悉RDBMS但⼜不理解MapReduce的技术⼈员提供快速上⼿的⼯具,我们上⾯提到,Hive是基于hadoop 之上的⼀个开源的⼯具,提供的就是类似于SQL的⼀种HQL语⾔,它的好处就是可以直接把你的SQL语句转换成mapreduce作业,然后提交在集上运⾏,好处就是我们不需要基于mapreduce的api进⾏编程,只需要写SQL语句就能完成⼤数据的统计和分析。
在上⾯我们提到,Hive是把SQL翻译成MapReduce作业,所以底层还是基于MapReduce,那么MapReduce框架的缺点就是效率太低,那么这样的话我们Hive的效率肯定不会⾼,对于批处理的作业Hive进⾏实现的话,如果很⼤的话,耗时会很时间,甚⾄⼗⼏个⼩时。
那么如何改进呢?
⽅法就是换掉底层的执⾏引擎,后来就产⽣的TEZ还有Spark这些底层的执⾏引擎,也就是说Hive可以跑在TEZ、SPARK上⾯。后来慢慢发展就推出了Spark,Spark是⼀个基于内存的分布式计算框架,他的执⾏效率⽐MapReduce提⾼了很多!
Spark SQL的⼀⼤⽤处就是执⾏SQL查询语句,Spark SQL也可以⽤来从Hive中读取数据,当我们使⽤其它编程语⾔来运⾏⼀个SQL语句,结果返回的是⼀个Dataset或者DataFrame,可以使⽤命令⾏,JDBC或者ODBC的⽅式来与SQL进⾏交互。
四、三者对⽐
Hive是⼀个数据仓库,是⼀个交互式⽐较弱⼀点的查询引擎,交互式没有presto那么强,⽽且只能访问hdfs的数据;
Presto是⼀个交互式查询引擎,可以在很短的时间内返回查询结果,秒级,分钟级,能访问很多数据源;
Hive在查询100Gb级别的数据时,消耗时间已经是分钟级了;但是Presto是取代不了Hive的,因为Presto全部的数据都是在内存中,限制
了在内存中的数据集⼤⼩,⽐如多个⼤表的join,这些⼤表是不能完全放进内存的,实际应⽤中,对于在Presto的查询是有⼀定规定条件的,⽐如说⼀个查询在Presto查询超过30分钟(此时适合在SparkSQL运⾏),那就kill掉吧,说明不适合在Presto上使⽤,主要原因是,查询过⼤的话,会占⽤整个集的资源,这会导致你后续的查询是没有资源进⾏查询的,这跟Presto的设计理念是冲突的,就像是你进⾏⼀个查询,但是要等个5分钟才有资源继续查询,这是很不合理的,交互式就变得弱了很多。
因此,在数据源的级联查询时,⽤Presto写SQL语句进⾏查询。在进⾏简单的数据查询时,可以⽤HQL进⾏建表,查询,关联等。当数据量较⼤时,可⽤SparkSQL进⾏建表,查询,关联等。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。