HAWQ与Hive查询性能对比测试

一、实验目的

本实验通过模拟一个典型的应用场景和实际数据量,测试并对比HAWQ内部表、外部表与Hive的查询性能。

二、硬件环境

1. 四台VMware虚机组成的Hadoop集群。
2. 每台机器配置如下:
(1)15K RPM SAS 100GB
(2)Intel(R) Xeon(R) E5-2620 v2 @ 2.10GHz,双核双CPU
(3)8G内存,8GSwap
(4)10000Mb/s虚拟网卡

三、软件环境

1. Linux:CentOS release 6.4,核心2.6.32-358.el6.x86_64
2. Ambari:2.4.1
3. Hadoop:HDP 2.5.0
4. Hive(Hive on Tez):2.1.0
5. HAWQ:2.1.1.0
6. HAWQ PXF:3.1.1

四、数据模型

1. 表结构

实验模拟一个记录页面点击数据的应用场景。数据模型中包含日期、页面、浏览器、引用、状态5个维度表,1个页面点击事实表。表结构和关系如图1所示。

图1

2. 记录数

各表的记录数如表1所示。

表名


行数


page_click_fact


1亿


page_dim


20万


referrer_dim


100万


browser_dim


2万


status_code


70


date_dim


366

表1

五、建表并生成数据

1. 建立hive库表

create database test;
use test;

create table browser_dim(
  browser_sk bigint,
  browser_nm varchar(100),
  browser_version_no varchar(100),
  flash_version_no varchar(100),
  flash_enabled_flg int,
  java_version_no varchar(100),
  platform_desc string,
  java_enabled_flg int,
  java_script_enabled_flg int,
  cookies_enabled_flg int,
  user_language_cd varchar(100),
  screen_color_depth_no varchar(100),
  screen_size_txt string)
row format delimited
  fields terminated by ‘,‘
stored as orc; 

create table date_dim(
  cal_dt date,
  day_in_cal_yr_no int,
  day_of_week_no int,
  start_of_month_dt date,
  start_of_quarter_dt date,
  start_of_week_dt date,
  start_of_year_dt date)
row format delimited
  fields terminated by ‘,‘
stored as orc;

create table page_dim(
  page_sk bigint,
  domain_nm varchar(200),
  reachability_cd string,
  page_desc string,
  protocol_nm varchar(20))
row format delimited
  fields terminated by ‘,‘
stored as orc;

create table referrer_dim(
  referrer_sk bigint,
  referrer_txt string,
  referrer_domain_nm varchar(200))
row format delimited
  fields terminated by ‘,‘
stored as orc;

create table status_code_dim(
  status_cd varchar(100),
  client_error_flg int,
  status_cd_desc string,
  server_error_flg int)
row format delimited
  fields terminated by ‘,‘
stored as orc;

create table page_click_fact(
  visitor_id varchar(100),
  detail_tm timestamp,
  page_click_dt date,
  page_sk bigint,
  client_session_dt date,
  previous_page_sk bigint,
  referrer_sk bigint,
  next_page_sk bigint,
  status_cd varchar(100),
  browser_sk bigint,
  bytes_received_cnt bigint,
  bytes_sent_cnt bigint,
  client_detail_tm timestamp,
  entry_point_flg int,
  exit_point_flg int,
  ip_address varchar(20),
  query_string_txt string,
  seconds_spent_on_page_cnt int,
  sequence_no int,
  requested_file_txt string)
row format delimited
  fields terminated by ‘,‘
stored as orc;

说明:hive表使用ORCfile存储格式。

2. 用Java程序生成hive表数据

ORC压缩后的各表对应的HDFS文件大小如下:

2.2 M   /apps/hive/warehouse/test.db/browser_dim
641     /apps/hive/warehouse/test.db/date_dim
4.1 G   /apps/hive/warehouse/test.db/page_click_fact
16.1 M  /apps/hive/warehouse/test.db/page_dim
22.0 M  /apps/hive/warehouse/test.db/referrer_dim
1.1 K   /apps/hive/warehouse/test.db/status_code_dim

3. 分析hive表

analyze table date_dim compute statistics;
analyze table browser_dim compute statistics;
analyze table page_dim compute statistics;
analyze table referrer_dim compute statistics;
analyze table status_code_dim compute statistics;
analyze table page_click_fact compute statistics;

4. 建立HAWQ外部表

create schema ext;
set search_path=ext;

create external table date_dim(
cal_dt              date,
day_in_cal_yr_no    int4,
day_of_week_no      int4,
start_of_month_dt   date,
start_of_quarter_dt date,
start_of_week_dt    date,
start_of_year_dt    date
)
location (‘pxf://hdp1:51200/test.date_dim?profile=hiveorc‘)
format ‘custom‘ (formatter=‘pxfwritable_import‘); 

create external table browser_dim(
browser_sk              int8,
browser_nm              varchar(100),
browser_version_no      varchar(100),
flash_version_no        varchar(100),
flash_enabled_flg       int,
java_version_no         varchar(100),
platform_desc           text,
java_enabled_flg        int,
java_script_enabled_flg int,
cookies_enabled_flg     int,
user_language_cd        varchar(100),
screen_color_depth_no   varchar(100),
screen_size_txt         text
)
location (‘pxf://hdp1:51200/test.browser_dim?profile=hiveorc‘)
format ‘custom‘ (formatter=‘pxfwritable_import‘); 

create external table page_dim(
page_sk             int8,
domain_nm           varchar(200),
reachability_cd     text,
page_desc           text,
protocol_nm         varchar(20)
)
location (‘pxf://hdp1:51200/test.page_dim?profile=hiveorc‘)
format ‘custom‘ (formatter=‘pxfwritable_import‘); 

create external table referrer_dim(
referrer_sk         int8,
referrer_txt        text,
referrer_domain_nm  varchar(200)
)
location (‘pxf://hdp1:51200/test.referrer_dim?profile=hiveorc‘)
format ‘custom‘ (formatter=‘pxfwritable_import‘); 

create external table status_code_dim(
status_cd           varchar(100),
client_error_flg    int4,
status_cd_desc      text,
server_error_flg    int4
)
location (‘pxf://hdp1:51200/test.status_code_dim?profile=hiveorc‘)
format ‘custom‘ (formatter=‘pxfwritable_import‘); 

create external table page_click_fact(
visitor_id                varchar(100),
detail_tm                 timestamp,
page_click_dt             date,
page_sk                   int8,
client_session_dt         date,
previous_page_sk          int8,
referrer_sk               int8,
next_page_sk              int8,
status_cd                 varchar(100),
browser_sk                int8,
bytes_received_cnt        int8,
bytes_sent_cnt            int8,
client_detail_tm          timestamp,
entry_point_flg           int4,
exit_point_flg            int4,
ip_address                varchar(20),
query_string_txt          text,
seconds_spent_on_page_cnt int4,
sequence_no               int4,
requested_file_txt        text
)
location (‘pxf://hdp1:51200/test.page_click_fact?profile=hiveorc‘)
format ‘custom‘ (formatter=‘pxfwritable_import‘);

说明:HAWQ外部表使用PXF协议,指向相应的hive表。

5. 建立HAWQ内部表

set search_path=public;

create table date_dim(
cal_dt              date,
day_in_cal_yr_no    int4,
day_of_week_no      int4,
start_of_month_dt   date,
start_of_quarter_dt date,
start_of_week_dt    date,
start_of_year_dt    date) with (compresstype=snappy,appendonly=true); 

create table browser_dim(
browser_sk              int8,
browser_nm              varchar(100),
browser_version_no      varchar(100),
flash_version_no        varchar(100),
flash_enabled_flg       int,
java_version_no         varchar(100),
platform_desc           text,
java_enabled_flg        int,
java_script_enabled_flg int,
cookies_enabled_flg     int,
user_language_cd        varchar(100),
screen_color_depth_no   varchar(100),
screen_size_txt         text
) with (compresstype=snappy,appendonly=true); 

create table page_dim(
page_sk             int8,
domain_nm           varchar(200),
reachability_cd     text,
page_desc           text,
protocol_nm         varchar(20)
) with (compresstype=snappy,appendonly=true); 

create table referrer_dim(
referrer_sk         int8,
referrer_txt        text,
referrer_domain_nm  varchar(200)
) with (compresstype=snappy,appendonly=true); 

create table status_code_dim(
status_cd           varchar(100),
client_error_flg    int4,
status_cd_desc      text,
server_error_flg    int4
) with (compresstype=snappy,appendonly=true); 

create table page_click_fact(
visitor_id                varchar(100),
detail_tm                 timestamp,
page_click_dt             date,
page_sk                   int8,
client_session_dt         date,
previous_page_sk          int8,
referrer_sk               int8,
next_page_sk              int8,
status_cd                 varchar(100),
browser_sk                int8,
bytes_received_cnt        int8,
bytes_sent_cnt            int8,
client_detail_tm          timestamp,
entry_point_flg           int4,
exit_point_flg            int4,
ip_address                varchar(20),
query_string_txt          text,
seconds_spent_on_page_cnt int4,
sequence_no               int4,
requested_file_txt        text
) with (compresstype=snappy,appendonly=true);

说明:内部表结构定义与hive表等价,使用snappy压缩的行存储格式。

6. 生成HAWQ内部表数据

insert into date_dim select * from hcatalog.test.date_dim;
insert into browser_dim select * from hcatalog.test.browser_dim;
insert into page_dim select * from hcatalog.test.page_dim;
insert into referrer_dim select * from hcatalog.test.referrer_dim;
insert into status_code_dim select * from hcatalog.test.status_code_dim;
insert into page_click_fact select * from hcatalog.test.page_click_fact;

说明:通过HCatalog直接查询hive表,插入到HAWQ内部表中。snappy压缩后的各表对应的HDFS文件大小如下:

6.2 K   /hawq_data/16385/177422/177677
3.3 M   /hawq_data/16385/177422/177682
23.9 M  /hawq_data/16385/177422/177687
39.3 M  /hawq_data/16385/177422/177707
1.8 K   /hawq_data/16385/177422/177726
7.9 G   /hawq_data/16385/177422/177731

7. 分析HAWQ内部表

analyze date_dim;
analyze browser_dim;
analyze page_dim;
analyze referrer_dim;
analyze status_code_dim;
analyze page_click_fact;

六、执行查询

分别在hive表、HAWQ外部表、HAWQ内部表上执行以下5个查询语句,记录执行时间。

1. 查询给定周中support.sas.com站点上访问最多的目录

-- hive查询
select top_directory, count(*) as unique_visits
  from (select distinct visitor_id, substr(requested_file_txt,1,10) top_directory
          from page_click_fact, page_dim, browser_dim
         where domain_nm = ‘support.sas.com‘
           and flash_enabled_flg=1
           and weekofyear(detail_tm) = 19
           and year(detail_tm) = 2017
       ) directory_summary
 group by top_directory
 order by unique_visits;  

-- HAWQ查询,只是用extract函数代替了hive的weekofyear和year函数,与hive的查询语句等价。
select top_directory, count(*) as unique_visits
  from (select distinct visitor_id, substr(requested_file_txt,1,10) top_directory
          from page_click_fact, page_dim, browser_dim
         where domain_nm = ‘support.sas.com‘
           and flash_enabled_flg=1
           and extract(week from detail_tm) = 19
           and extract(year from detail_tm) = 2017
       ) directory_summary
 group by top_directory
 order by unique_visits;

2. 查询各月从www.google.com访问的页面

-- hive查询
select domain_nm, requested_file_txt, count(*) as unique_visitors, month
  from (select distinct domain_nm, requested_file_txt, visitor_id, month(detail_tm) as month
          from page_click_fact, page_dim, referrer_dim
         where domain_nm = ‘support.sas.com‘
           and referrer_domain_nm = ‘www.google.com‘
       ) visits_pp_ph_summary
 group by domain_nm, requested_file_txt, month
 order by domain_nm, requested_file_txt, unique_visitors desc, month asc;  

-- HAWQ查询,只是用extract函数代替了hive的month函数,与hive的查询语句等价。
select domain_nm, requested_file_txt, count(*) as unique_visitors, month
  from (select distinct domain_nm, requested_file_txt, visitor_id, extract(month from detail_tm) as month
          from page_click_fact, page_dim, referrer_dim
         where domain_nm = ‘support.sas.com‘
           and referrer_domain_nm = ‘www.google.com‘
       ) visits_pp_ph_summary
 group by domain_nm, requested_file_txt, month
 order by domain_nm, requested_file_txt, unique_visitors desc, month asc;

3. 给定年份support.sas.com站点上的搜索字符串计数

-- hive查询
select query_string_txt, count(*) as count
  from page_click_fact, page_dim
 where query_string_txt <> ‘‘
   and domain_nm=‘support.sas.com‘
   and year(detail_tm) = ‘2017‘
 group by query_string_txt
 order by count desc;

-- HAWQ查询,只是用extract函数代替了hive的year函数,与hive的查询语句等价。
select query_string_txt, count(*) as count
  from page_click_fact, page_dim
 where query_string_txt <> ‘‘
   and domain_nm=‘support.sas.com‘
   and extract(year from detail_tm) = ‘2017‘
 group by query_string_txt
 order by count desc;

4. 查询使用Safari浏览器访问每个页面的人数

-- hive查询
select domain_nm, requested_file_txt, count(*) as unique_visitors
  from (select distinct domain_nm, requested_file_txt, visitor_id
          from page_click_fact, page_dim, browser_dim
         where domain_nm=‘support.sas.com‘
           and browser_nm like ‘%Safari%‘
           and weekofyear(detail_tm) = 19
           and year(detail_tm) = 2017
       ) uv_summary
 group by domain_nm, requested_file_txt
 order by unique_visitors desc;  

-- HAWQ查询,只是用extract函数代替了hive的weekofyear和year函数,与hive的查询语句等价。
select domain_nm, requested_file_txt, count(*) as unique_visitors
  from (select distinct domain_nm, requested_file_txt, visitor_id
          from page_click_fact, page_dim, browser_dim
         where domain_nm=‘support.sas.com‘
           and browser_nm like ‘%Safari%‘
           and extract(week from detail_tm) = 19
           and extract(year from detail_tm) = 2017
       ) uv_summary
 group by domain_nm, requested_file_txt
 order by unique_visitors desc;

5. 查询给定周中support.sas.com站点上浏览超过10秒的页面

-- hive查询
select domain_nm, requested_file_txt, count(*) as unique_visits
  from (select distinct domain_nm, requested_file_txt, visitor_id
          from page_click_fact, page_dim
         where domain_nm=‘support.sas.com‘
           and weekofyear(detail_tm) = 19
           and year(detail_tm) = 2017
           and seconds_spent_on_page_cnt > 10
       ) visits_summary
 group by domain_nm, requested_file_txt
 order by unique_visits desc;  

-- HAWQ查询,只是用extract函数代替了hive的weekofyear和year函数,与hive的查询语句等价。
select domain_nm, requested_file_txt, count(*) as unique_visits
  from (select distinct domain_nm, requested_file_txt, visitor_id
          from page_click_fact, page_dim
         where domain_nm=‘support.sas.com‘
           and extract(week from detail_tm) = 19
           and extract(year from detail_tm) = 2017
           and seconds_spent_on_page_cnt > 10
       ) visits_summary
 group by domain_nm, requested_file_txt
 order by unique_visits desc;

七、测试结果

Hive、HAWQ外部表、HAWQ内部表查询时间对比如表2所示。每种查询情况执行三次取平均值。

查询


Hive(秒)


HAWQ外部表(秒)


HAWQ内部表(秒)


1


74.337


304.134


19.232


2


169.521


150.882


3.446


3


73.482


101.216


18.565


4


66.367


359.778


1.217


5


60.341


118.329


2.789

表2

从图2中的对比可以看到,HAWQ内部表比Hive on Tez快的多(4-50倍)。同样的查询,在HAWQ的Hive外部表上执行却很慢。因此,在执行分析型查询时最好使用HAWQ内部表。如果不可避免地需要使用外部表,为了获得满意的查询性能,需要保证外部表数据量尽可能小。同时要使查询尽可能简单,尽量避免在外部表上执行聚合、分组、排序等复杂操作。

图2

时间: 2024-11-23 03:19:23

HAWQ与Hive查询性能对比测试的相关文章

(转)HubbleDotNet 和 Lucene.net 性能对比测试

HubbleDotNet 从 2009 年11月份发布第一个版本以来, 只对 0.7 版本做过一次性能对比测试,原因是近一年来,HubbleDotNet一直在做性能优化,截至2010年9月,性能已经优化的差不多了,索引和查询的性能比 0.7 版本时提高了很多倍.这两天重新对HubbleDotNet 与 Lucene.Net 做了性能对比测试.下面就公布一下我的测试数据. 测试版本 HubbleDotNet 0.9.7.0 Lucene.Net 2.9.2.1 盘古分词 2.3.1.0 测试环境

多级部门查询性能问题解决方案

目录 项目吐槽 遇到的问题 1.mysql函数group_contact()返回值限制 2. Impala使用in语句存在限制 解决方案 优化MySQL函数递归调用方案 将Impala的in查询转换为等值查询 总结 项目吐槽 其实,涉及部门层级关系的问题在很多情形下都会遇到,特别是针对toB的应用开发场景. 但奇葩的是,在我们的项目里头,项目经理在前期需求调研时,预估的用户部门最大数为1k,于是相关的开发同事就按照最大数1k*4=4k的目标进行了设计实现,而真正交付到用户生产环境时同步的数据是1

SQL Server-聚焦计算列或计算列持久化查询性能(二十二)

前言 上一节我们详细讲解了计算列以及计算列持久化的问题,本节我们依然如前面讲解来看看二者查询性能问题,简短的内容,深入的理解,Always to review the basics. 持久化计算列比非持久化计算列性能要好 我们开始创建两个一样的表并都插入100条数据来进行比较,对于计算列我们重新进行创建计算列和非计算列持久化. CREATE TABLE [dbo].[ComputeColumnCompare] (ID INT, FirstName VARCHAR(100), LastName C

《高性能MySQL》读书笔记--查询性能优化

对于高性能数据库操作,只靠设计最优的库表结构.建立最好的索引是不够的,还需要合理的设计查询.如果查询写得很糟糕,即使库表结构再合理.索引再合适,也无法实现高性能.查询优化.索引优化.库表结构优化需要齐头并进,一个不落. 6.1 为什么查询速度会慢 通常来说,查询的生命周期大致可以按照顺序来看:从客户端>>服务器>>在服务器上进行解析>>生成执行计划>>执行>>返回结果给客户端.其中执行可以认为是整个生命周期中最重要的阶段,这其中包括了大量为了检索

MySQL查询缓存设置 提高MySQL查询性能

首先看看MSYQL逻辑框架:图片来自高性能mysql 如果使用了QueryCache,当查询接收到一个和之前同样的查询,服务器将会从查询缓存中检索结果,而不是再次分析和执行相同的查询.这样就能大大提高查询性能. 打开查询缓存,要通过几个步骤来设置: 虽然你设置mysql允许查询缓存,但是如果你设置的查询缓存大小为了0,这和没有允许没什么区别. 所以必须是几个步骤的设置才能真正打开查询缓存这个功能. 下面演示最常用的设置查询缓存 一. query_cache_type 使用查询缓存的方式 一般,我

SQLServer性能优化之 nolock,大幅提升数据库查询性能

公司数据库随着时间的增长,数据越来越多,查询速度也越来越慢.进数据库看了一下,几十万调的数据,查询起来确实很费时间. 要提升SQL的查询效能,一般来说大家会以建立索引(index)为第一考虑.其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善在线大量查询的环境中数据集被LOCK的现象藉此改善查询的效能. 不过有一点千万要注意的就是,WITH (NOLOCK)的SQL SELECT有可能会造成Dirty Read,就是读到无效的数据.

一种更高查询性能的列存储方式MaxMinT 第一部分

简介本文描述了一种列存储方式和对应的查询方法,这种存储方式具有更好的查询性能和更小的存储空间. And查询 本文先用直观的图形方式展示and查询时的方式,这也是算法要解决的问题核心.通常在OLAP数据查询时,需要进行and处理,例如你需要获取 year = 2017 and customer = 13 的数据,这在列存储中实际是对值 year的2017这个列和 customer的13列进行and操作,而这些列一般都使用位图的方式存储.市面上有很多位图的存储方式,比如WAH, EWAH, Conc

新建一个索引能够同时提升三条SQL的查询性能

如题 CREATE TABLE `score` (   `id` int(11) NOT NULL,   `studentid` int(11) NOT NULL,   `subjectid` int(11) NOT NULL,   `score` int(11) NOT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 新建一个索引能够同时提升三条SQL的查询性能 ALTER TABLE `score` AD

聚焦-移除Bookmark Lookup、RID Lookup、Key Lookup提高SQL查询性能(六)

前言 前面几节都是讲的基础内容,本节我们讲讲索引性能优化,当对大数据进行处理时首先想到的就是索引,一旦遇到这样的问题则手忙脚乱,各种查资料,为何平常不扎实基本功呢,我们由浅入深,简短的内容,深入的理解,而非一上来就把问题给框死,立马给出解决方案,抛出问题,再到解决问题,你GET了没有. Bookmark Lookup.RID Lookup.Key Lookup定义 一说到这三者,如果对索引研究不深的童鞋估计是懵逼的,什么玩意,我们姑且将上面三者翻译为:标签查找.行ID查找.键查找.标签查找和键查