版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1433140
二、Hive、Spark SQL、Impala比较
Hive、Spark SQL和Impala三种分布式SQL查询引擎都是SQL-on-Hadoop解决方案,但又各有特点。前面已经讨论了Hive和Impala,本节先介绍一下SparkSQL,然后从功能、架构、使用场景几个角度比较这三款产品的异同,最后附上分别由cloudera公司和SAS公司出示的关于这三款产品的性能对比报告。
1. Spark SQL简介
Spark SQL是Spark的一个处理结构化数据的程序模块。与其它基本的Spark RDD API不同,Spark SQL提供的接口包含更多关于数据和计算的结构信息,Spark SQL会利用这些额外信息执行优化。可以通过SQL和数据集API与Spark SQL交互,但无论使用何种语言或API向Spark SQL发出请求,其内部都使用相同的执行引擎,这种统一性方便开发者在不同的API间进行切换。
Spark SQL具有如下特性:
Spark SQL架构如下图所示。
此架构包括Language API、Schema RDD、Data Sources三层。
2. Hive、Spark SQL、Impala比较
(1)功能
Hive:
Spark SQL:
Impala:
(2)架构
Hive:
构建在Hadoop之上,查询管理分布式存储上的大数据集的数据仓库组件。底层使用MapReduce计算框架,Hive查询被转化为MapReduce代码并执行。生产环境建议使用RDBMS存储元数据。支持JDBC、ODBC、CLI等连接方式。
Spark SQL:
底层使用Spark计算框架,提供有向无环图,比MapReduce更灵活。Spark SQL以Schema RDD为核心,模糊了RDD与关系表之间的界线。Schema RDD是一个由Row对象组成的RDD,附带包含每列数据类型的结构信息。Spark SQL复用Hive的元数据存储。支持JDBC、ODBC、CLI等连接方式,并提供多种语言的API。
Impala:
底层采用MPP技术,支持快速交互式SQL查询。与Hive共享元数据存储。Impalad是核心进程,负责接收查询请求并向多个数据节点分发任务。statestored进程负责监控所有Impalad进程,并向集群中的节点报告各个Impalad进程的状态。catalogd进程负责广播通知元数据的最新信息。
(3)场景
Hive:
适用场景:
不适用场景:
Spark SQL:
适用场景:
不适用场景:
Impala:
适用场景:
不适用场景:
3. Hive、SparkSQL、Impala性能对比
(1)cloudera公司2014年做的性能基准对比测试,原文链接:http://blog.cloudera.com/blog/2014/09/new-benchmarks-for-sql-on-hadoop-impala-1-4-widens-the-performance-gap/
先看一下测试结果:
下面看看这个测试是怎么做的。
配置:
所有测试都运行在一个完全相同的21节点集群上,每个节点只配有64G内存。之所以内存不配大,就是为了消除人们对于Impala只有在非常大的内存上才有好性能的错误认识:
对比产品:
查询:
结果:
单用户如下图所示。
多用户如下图所示。
查询吞吐率如下图所示。
Impala本身就是cloudera公司的主打产品,因此只听其一面之词未免有失偏颇,下面就再看一个SAS公司的测试。
(2)SAS2013年做的Impala和Hive的对比测试
硬件:
刀片服务器配置
软件:
数据:
数据模型如下图所示。
各表的数据量如下图所示。
PAGE\_CLICK\_FLAT表使用Compressed Sequence文件格式,大小124.59 GB。
查询:
使用了以下5条查询语句
-- What are the most visited top-level directories on the customer support website for a given week and year?
select top_directory, count(*) as unique_visits
from (select distinct visitor_id, split(requested_file, '[\\/]')[1] as top_directory
from page_click_flat
where domain_nm = 'support.sas.com'
and flash_enabled='1'
and weekofyear(detail_tm) = 48
and year(detail_tm) = 2012
) directory_summary
group by top_directory
order by unique_visits;
-- What are the most visited pages that are referred from a Google search for a given month?
select domain_nm, requested_file, count(*) as unique_visitors, month
from (select distinct domain_nm, requested_file, visitor_id, month(detail_tm) as month
from page_click_flat
where domain_nm = 'support.sas.com'
and referrer_domain_nm = 'www.google.com'
) visits_pp_ph_summary
group by domain_nm, requested_file, month
order by domain_nm, requested_file, unique_visitors desc, month asc;
-- What are the most common search terms used on the customer support website for a given year?
select query_string_txt, count(*) as count
from page_click_flat
where query_string_txt <> ''
and domain_nm='support.sas.com'
and year(detail_tm) = '2012'
group by query_string_txt
order by count desc;
-- What is the total number of visitors per page using the Safari browser?
select domain_nm, requested_file, count(*) as unique_visitors
from (select distinct domain_nm, requested_file, visitor_id
from page_click_flat
where domain_nm='support.sas.com'
and browser_nm like '%Safari%'
and weekofyear(detail_tm) = 48
and year(detail_tm) = 2012
) uv_summary
group by domain_nm, requested_file
order by unique_visitors desc;
-- How many visitors spend more than 10 seconds viewing each page for a given week and year?
select domain_nm, requested_file, count(*) as unique_visits
from (select distinct domain_nm, requested_file, visitor_id
from page_click_flat
where domain_nm='support.sas.com'
and weekofyear(detail_tm) = 48
and year(detail_tm) = 2012
and seconds_spent_on_page_cnt > 10;
) visits_summary
group by domain_nm, requested_file
order by unique_visits desc;
结果:
Hive与Impala查询时间对比如下图所示。
可以看到,查询1、2、4Impala比Hive快的多,而查询3、5Impala却比Hive慢很多。这个测试可能更客观一些,而且也从侧面说明了一个问题,不要轻信厂商宣传的数据,还是要根据自己的实际测试情况得出结论。