版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1433079
Oushu Database 2.2版本的执行器基于Apache HAWQ的执行器,而Apache HAWQ的执行器起源于Greenplum Database和PostgreSQL,是一个很成熟的执行器,经过多年的优化和沉淀。而Oushu Database 3.0是一个Major Release,最大的一个亮点功能是完全重新设计的新执行器,性能比2.2版本的执行器要快10倍左右。新执行器充分利用了新的CPU硬件指令,比如SIMD等,可以做到不浪费CPU的每一个时钟周期。
具体来说,Oushu Database 3.0版本比Oushu Database 2.2.0版本有如下性能增强:
Oushu Database 3.0.1版本比Oushu Database 3.0版本有如下新特性增强:
Oushu Database 3.1.0版本比Oushu Database 3.0.1版本有如下新特性增强:
目前最新版本的Oushu Database 3.1.1版本比Oushu Database 3.1.0版本在性能上是相同的,所做的增强为主节点(master)故障时,备用主节点(standby)可自动切换为主节点,维持集群正常运行。OushuDB各版本新增特性信息,参考[http://www.oushu.io/docs/ch/release-notes.html](http://www.oushu.io/docs/ch/release-notes.html)。
本实验通过模拟一个典型的应用场景和实际数据量,测试对比OushuDB内部表、外部表的读写性能。
四台VMware虚机组成的HDP集群,每台机器配置如下:
(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
(3)典型查询
(1)资源相关配置
查看资源管理类型,该值缺省值为none,表示使用独立模式管理资源。保持缺省值none。
hawq config -s hawq_global_rm_type
查看每个segment的最大虚拟内存。使用独立模式(hawq\_global\_rm\_type=none)时,可以限制每个HAWQ segment所能使用的资源。保持初始安装值6GB。
hawq config -s hawq_rm_memory_limit_perseg
查看每个segment的最大cpu核数。hawq\_rm\_nvcore\_limit\_perseg参数设置每个HAWQ segment使用的最大CPU虚拟核数。保持初始安装值4。
hawq config -s hawq_rm_nvcore_limit_perseg
查看一条语句可以使用的最大虚拟段数量。hawq\_rm\_nvseg\_perquery\_limit参数在服务器级别上限制执行一条语句可以使用的最大虚拟段数量,缺省值为512。保持缺省值none
hawq config -s hawq_rm_nvseg_perquery_limit
关于HAWQ的资源管理,参考[https://blog.csdn.net/wzy0623/article/details/70314393](https://blog.csdn.net/wzy0623/article/details/70314393)。
(2)执行器相关配置
查看优化器设置。保持缺省值off。
hawq config -s optimizer
为了避免查询因为新的执行器不支持而报错,将执行器从缺省的ON修改为AUTO。
# 设置new_executor参数
hawq config -c new_executor -v AUTO
# 重载配置
hawq stop cluster -u
# 确认new_executor设置为AUTO
hawq config -s new_executor
关于HAWQ的查询优化,参考[https://blog.csdn.net/wzy0623/article/details/70167990](https://blog.csdn.net/wzy0623/article/details/70167990)。
psql
create role wxy login password '123456' ;
alter role wxy with createdb;
alter role wxy with createexttable (type='readable',protocol='gpfdist') ;
alter role wxy with createexttable (type='writable',protocol='gpfdist') ;
alter role wxy with createexttable (type='readable',protocol='hdfs') ;
alter role wxy with createexttable (type='writable',protocol='hdfs') ;
\q
psql -U wxy -h hdp3 -d postgres
create database test;
\c test;
create schema wxy authorization wxy;
\q
说明:
基础数据表用于向其它测试表中装载数据。
psql -U wxy -h hdp3 -d test
drop external table if exists date_dim;
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 ('hdfs://hdp1:8020/hawq_data/test_data/date_dim')
format 'text' (delimiter E'\t');
drop external table if exists browser_dim;
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 ('hdfs://hdp1:8020/hawq_data/test_data/browser_dim')
format 'text' (delimiter E'\t');
drop external table if exists page_dim;
create external table page_dim(
page_sk int8,
domain_nm varchar(200),
reachability_cd text,
page_desc text,
protocol_nm varchar(20)
)
location ('hdfs://hdp1:8020/hawq_data/test_data/page_dim')
format 'text' (delimiter E'\t');
drop external table if exists referrer_dim;
create external table referrer_dim(
referrer_sk int8,
referrer_txt text,
referrer_domain_nm varchar(200)
)
location ('hdfs://hdp1:8020/hawq_data/test_data/referrer_dim')
format 'text' (delimiter E'\t');
drop external table if exists status_code_dim;
create external table status_code_dim(
status_cd varchar(100),
client_error_flg int4,
status_cd_desc text,
server_error_flg int4
)
location ('hdfs://hdp1:8020/hawq_data/test_data/status_code_dim')
format 'text' (delimiter E'\t');
drop external table if exists page_click_fact;
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 ('hdfs://hdp1:8020/hawq_data/test_data/page_click_fact')
format 'text' (delimiter E'\t');
(1)把程序生成的文本文件传到hdfs上,作为测试的基础表数据。
chown hdfs:hdfs /home/hdfs/*
su - hdfs
hdfs dfs -put -f date_dim /hawq_data/test_data/date_dim/
hdfs dfs -chown -R gpadmin:gpadmin /hawq_data/test_data/date_dim/
hdfs dfs -put -f browser_dim /hawq_data/test_data/browser_dim/
hdfs dfs -chown -R gpadmin:gpadmin /hawq_data/test_data/browser_dim/
hdfs dfs -put -f page_dim /hawq_data/test_data/page_dim/
hdfs dfs -chown -R gpadmin:gpadmin /hawq_data/test_data/page_dim/
hdfs dfs -put -f referrer_dim /hawq_data/test_data/referrer_dim/
hdfs dfs -chown -R gpadmin:gpadmin /hawq_data/test_data/referrer_dim/
hdfs dfs -put -f status_code_dim /hawq_data/test_data/status_code_dim/
hdfs dfs -chown -R gpadmin:gpadmin /hawq_data/test_data/status_code_dim/
hdfs dfs -put -f page_click_fact /hawq_data/test_data/page_click_fact/
hdfs dfs -chown -R gpadmin:gpadmin /hawq_data/test_data/page_click_fact/
(2)确认基础表数据
select count(*) from date_dim;
select count(*) from browser_dim;
select count(*) from page_dim;
select count(*) from referrer_dim;
select count(*) from status_code_dim;
select count(*) from page_click_fact;
(3)分析表
analyze date_dim;
analyze browser_dim;
analyze page_dim;
analyze referrer_dim;
analyze status_code_dim;
analyze page_click_fact;
(1)建表
(2)批量装载数据,记录时间
insert into date_dim_orc select * from date_dim;
insert into browser_dim_orc select * from browser_dim;
insert into page_dim_orc select * from page_dim;
insert into referrer_dim_orc select * from referrer_dim;
insert into status_code_dim_orc select * from status_code_dim;
insert into page_click_fact_orc select * from page_click_fact;
各表的装载时间如图2所示
图2
最大的事实表1亿行数据用时176秒。
(3)分析表
analyze date_dim_orc;
analyze browser_dim_orc;
analyze page_dim_orc;
analyze referrer_dim_orc;
analyze status_code_dim_orc;
analyze page_click_fact_orc;
(4)执行查询(每种查询执行三次取平均值)
查询1执行时间(秒):6.798
查询2执行时间(秒):107.117
查询3执行时间(秒):26.496
查询4执行时间(秒):9.215
(1)建表
建立CSV格式的表:
(2)批量装载数据,记录时间
insert into date_dim_csv select * from date_dim;
insert into browser_dim_csv select * from browser_dim;
insert into page_dim_csv select * from page_dim;
insert into referrer_dim_csv select * from referrer_dim;
insert into status_code_dim_csv select * from status_code_dim;
insert into page_click_fact_csv select * from page_click_fact;
各表的装载时间如图3所示
图3
最大的事实表1亿行数据用时160秒。
(3)分析表
analyze date_dim_csv;
analyze browser_dim_csv;
analyze page_dim_csv;
analyze referrer_dim_csv;
analyze status_code_dim_csv;
analyze page_click_fact_csv;
(4)执行查询(每种查询执行三次取平均值)
查询1执行时间(秒):56.559
查询2执行时间(秒):151.704
查询3执行时间(秒):85.791
查询4执行时间(秒):5.698
(1)建表
建立TEXT格式的表:
(2)批量装载数据,记录时间
insert into date_dim_text select * from date_dim;
insert into browser_dim_text select * from browser_dim;
insert into page_dim_text select * from page_dim;
insert into referrer_dim_text select * from referrer_dim;
insert into status_code_dim_text select * from status_code_dim;
insert into page_click_fact_text select * from page_click_fact;
各表的装载时间如图4所示
图4
最大的事实表1亿行数据用时182秒。
(3)分析表
analyze date_dim_text;
analyze browser_dim_text;
analyze page_dim_text;
analyze referrer_dim_text;
analyze status_code_dim_text;
analyze page_click_fact_text;
(4)执行查询(每种查询执行三次取平均值)
查询1执行时间(秒):8.633
查询2执行时间(秒):100.266
查询3执行时间(秒):26.809
查询4执行时间(秒):7.366
(1)建表
建立ORC格式的外部表:
(2)批量装载数据,记录时间
insert into date_dim_orc_ext select * from date_dim;
insert into browser_dim_orc_ext select * from browser_dim;
insert into page_dim_orc_ext select * from page_dim;
insert into referrer_dim_orc_ext select * from referrer_dim;
insert into status_code_dim_orc_ext select * from status_code_dim;
insert into page_click_fact_orc_ext select * from page_click_fact;
各表的装载时间如图5所示
图5
最大的事实表1亿行数据用时171秒。
(3)分析表
analyze date_dim_orc_ext;
analyze browser_dim_orc_ext;
analyze page_dim_orc_ext;
analyze referrer_dim_orc_ext;
analyze status_code_dim_orc_ext;
analyze page_click_fact_orc_ext;
(4)执行查询(每种查询执行三次取平均值)
查询1执行时间(秒):6.513
查询2执行时间(秒):96.986
查询3执行时间(秒):22.373
查询4执行时间(秒):7.131
(1)建表
建立CSV格式的外部表:
(2)批量装载数据,记录时间
insert into date_dim_csv_ext select * from date_dim;
insert into browser_dim_csv_ext select * from browser_dim;
insert into page_dim_csv_ext select * from page_dim;
insert into referrer_dim_csv_ext select * from referrer_dim;
insert into status_code_dim_csv_ext select * from status_code_dim;
insert into page_click_fact_csv_ext select * from page_click_fact;
各表的装载时间如图6所示
图6
最大的事实表1亿行数据用时167秒。
(3)分析表
analyze date_dim_csv_ext;
analyze browser_dim_csv_ext;
analyze page_dim_csv_ext;
analyze referrer_dim_csv_ext;
analyze status_code_dim_csv_ext;
analyze page_click_fact_csv_ext;
(4)执行查询(每种查询执行三次取平均值)
查询1执行时间(秒):59.686
查询2执行时间(秒):160.208
查询3执行时间(秒):78.640
查询4执行时间(秒):55.496
(1)建表
建立TEXT格式的外部表:
(2)批量装载数据,记录时间
insert into date_dim_text_ext select * from date_dim;
insert into browser_dim_text_ext select * from browser_dim;
insert into page_dim_csv_text select * from page_dim;
insert into referrer_dim_text_ext select * from referrer_dim;
insert into status_code_dim_text_ext select * from status_code_dim;
insert into page_click_fact_text_ext select * from page_click_fact;
各表的装载时间如图7所示
图7
最大的事实表1亿行数据用时170秒。
(3)分析表
analyze date_dim_text_ext;
analyze browser_dim_text_ext;
analyze page_dim_text_ext;
analyze referrer_dim_text_ext;
analyze status_code_dim_text_ext;
analyze page_click_fact_text_ext;
(4)执行查询(每种查询执行三次取平均值)
查询1执行时间(秒):54.668
查询2执行时间(秒):301.859
查询3执行时间(秒):78.356
查询4执行时间(秒):57.425
(1)建表
建立缺省存储格式的表:
(2)批量装载数据,记录时间
insert into date_dim_default select * from date_dim;
insert into browser_dim_default select * from browser_dim;
insert into page_dim_default select * from page_dim;
insert into referrer_dim_default select * from referrer_dim;
insert into status_code_dim_default select * from status_code_dim;
insert into page_click_fact_default select * from page_click_fact;
各表的装载时间如图8所示
图8
最大的事实表1亿行数据用时166秒。
(3)分析表
analyze date_dim_default;
analyze browser_dim_default;
analyze page_dim_default;
analyze referrer_dim_default;
analyze status_code_dim_default;
analyze page_click_fact_default;
(4)执行查询(每种查询执行三次取平均值)
查询1执行时间(秒):15.461
查询2执行时间(秒):85.345
查询3执行时间(秒):22.741
查询4执行时间(秒):17.678
以上测试了OushuDB ORC、CSV、TEXT内外部表,以及HAWQ缺省存储格式表,共7中格式表的读写性能。批量插入的性能对比如表2所示。查询时间对比如表3所示。
| ORC内表 | CSV内表 | TEXT内表 | ORC外表 | CSV外表 | TEXT外表 | append only |
---|---|---|---|---|---|---|---|
每秒插入行数 | 568182 | 625000 | 549451 | 584795 | 598802 | 588235 | 602409 |
表2
查询 | ORC内表 | CSV内表 | TEXT内表 | ORC外表 | CSV外表 | TEXT外表 | append only |
---|---|---|---|---|---|---|---|
1 | 6.798 | 56.559 | 8.633 | 6.513 | 59.686 | 54.668 | 15.461 |
2 | 107.117 | 151.704 | 100.266 | 96.986 | 160.208 | 301.859 | 85.345 |
3 | 26.496 | 85.791 | 26.809 | 22.373 | 78.640 | 78.356 | 22.741 |
4 | 9.215 | 5.698 | 7.366 | 7.131 | 55.496 | 57.425 | 17.678 |
表3
从表2可以看到,各种格式表的批量插入性能表现相差不是很大,差不多都在每秒6万条左右。从图9中的对比可以看到:
图9
另外,OushuDB 会比Hive快至少一个数量级,相关测试可参考:[HAWQ与Hive查询性能对比测试](https://blog.csdn.net/wzy0623/article/details/71479539)。
从以上实验的4个查询语句的执行时间看,OushuDB 3.1.1并没有比Apache HAWQ 2.1.1有明显提高,原因是这些查询使用的还是老的执行器。目前新执行器还不支持多表join查询。关于新执行器的性能与限制,参考[http://www.oushu.io/docs/ch/release-notes.html#oushu-database-3-0-2017920](http://www.oushu.io/docs/ch/release-notes.html#oushu-database-3-0-2017920)。