作者:蔣守壯
作者介紹:蔣守壯,現(xiàn)就職于金拱門(中國)有限公司,擔(dān)任大數(shù)據(jù)卓越中心高級工程和平臺經(jīng)理,負責(zé)大數(shù)據(jù)平臺的架構(gòu)和產(chǎn)品研發(fā)。
背景:
對于很多使用Apache Kylin的朋友來說,在生產(chǎn)環(huán)境搭建完成之后,如何在業(yè)務(wù)使用之前通過壓測掌握Kylin的性能是一個必要問題,這樣有助于提前發(fā)現(xiàn)問題、優(yōu)化系統(tǒng)參數(shù)、提高性能,包括Kylin本身的Job和Query調(diào)優(yōu)、并發(fā)構(gòu)建Cube、HBase寫入和查詢性能、以及MapReduce或Spark調(diào)優(yōu)等等。
SSB介紹:
Kyligence官方提供了開源的SSB(Star Schema Benchmark)壓測工具(https://github.com/Kyligence/ssb-kylin),這是基于TPC-H benchmark(http://www.tpc.org/tpch)修改,并專門針對星型模型OLAP場景下的測試工具。
測試的過程會生成5張表,測試的數(shù)據(jù)量可以根據(jù)參數(shù)調(diào)整。SSB的表結(jié)構(gòu)如下圖所示:

其中l(wèi)ineorder為事實表,其他四張為維度表,每張維度表通過primary key與事實表關(guān)聯(lián),標準的星型結(jié)構(gòu)。
本次壓測的環(huán)境是CDH 5.13.3,開啟了Kerberos和OpenLDAP的認證和授權(quán),使用Sentry提供細粒度、基于角色的授權(quán)以及多租戶管理模式。但是官方提供的ssb-kylin沒有涉及到權(quán)限和認證的處理,因此我稍加修改了一下,具體代碼見https://github.com/jiangshouzhuang/ssb-kylin。
先決條件:
這里先把Kylin部署的情況說明一下:
Kylin部署集成OpenLDAP用戶統(tǒng)一認證管理
OpenLDAP中增加Kylin部署的用戶kylin_manager_user(用戶組為kylin_manager_group)
Kylin版本為apache-kylin-2.4.0
Kylin集群情況(VM):
Kylin Job 1個節(jié)點:16GB,8Cores
Kylin Query 2個節(jié)點:32GB,8Cores
SSB壓測之前處理幾點:
Hive數(shù)據(jù)庫中創(chuàng)建ssb數(shù)據(jù)庫
# 使用超級管理員登錄hive數(shù)據(jù)庫
create database SSB;
CREATE ROLE ssb_write_role;
GRANT ALL ON DATABASE ssb TO ROLE ssb_write_role;
GRANT ROLE ssb_write_role TO GROUP ssb_write_group;
# 然后在OpenLDAP中把kylin_manager_user添加到kylin_manager_group中,這樣kylin_manager_user就有權(quán)限訪問ssb數(shù)據(jù)庫
2.把HDFS的目錄/user/kylin_manager_user讀寫權(quán)限賦予kylin_manager_user用戶
3.在kylin_manager_user用戶家目錄下面配置HADOOP_STREAMING_JAR環(huán)境變量
export HADOOP_STREAMING_JAR=/opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-streaming.jar
下載SSB工具和編譯
在linux終端中輸入以下命令,即可迅速下載和編譯完成ssb測試工具。
git clone?https://github.com/jiangshouzhuang/ssb-kylin.git
cd ssb-kylin
cd ssb-benchmark
make clean
make
調(diào)整SSB參數(shù)
在ssb-kylin項目中,bin目錄下面有一個ssb.conf文件,里面定義了事實表和維度表的base數(shù)據(jù)量。當(dāng)我們生成測試數(shù)據(jù)量時,可以指定scale大小,這樣實際的數(shù)據(jù)為base*scale。
ssb.conf文件的部分內(nèi)容為:
# customer base, default value is 30,000
customer_base = 30000
# part base, default value is 200,000
part_base = 200000
# supply base, default value is 2,000
supply_base = 2000
# date base (days), default value is 2,556
date_base = 2556
# lineorder base (purchase record), default value is 6,000,000
lineorder_base = 6000000
當(dāng)然上面的base參數(shù)都是可以根據(jù)自己的實際需求調(diào)整,我采用默認參數(shù)就可以了。
在ssb.conf文件中,還有如下的一些參數(shù)。
# manufacturer max. The value range is (1 .. manu_max)
manu_max = 5
# category max. The value range is (1 .. cat_max)
cat_max = 5
# brand max. The value range is (1 .. brand_max)
brand_max = 40
解釋如下:
manu_max、cat_max和brand_max用來定義層級scale。比如,manu_max=10、cat_max=10和brand_max=10是指總共10個manufactures,每個manufactures最多有10個category parts,而且每個category最多有10個brands。因此manufacture的基數(shù)(cardinality)為10,category基數(shù)為100,brand基數(shù)為1000。
# customer: num of cities per country, default value is 100
cust_city_max = 9
# supplier: num of cities per country, default value is 100
supp_city_max = 9
解釋如下:
cust_city_max 和supp_city_max用來定義在customer和supplier表中每個country的city數(shù)量。如果country總數(shù)為30,并且cust_city_max=100、supp_city_max=10,那么customer表將會有3000個不同的city,supplier表將會有300個不同的city。
提示:
本次壓測中是使用Yarn分配的資源來生成測試數(shù)據(jù),如果生成數(shù)據(jù)過程中遇到內(nèi)存方面的問題,請?zhí)岣遈arn分配container的內(nèi)存大小。
生成測試數(shù)據(jù)
在運行ssb-kylin/bin/run.sh腳本之前,對run.sh解釋幾點:
配置HDFS_BASE_DIR為表數(shù)據(jù)的路徑,因為我賦予kylin_manager_user對/user/kylin_manager_user目錄讀寫權(quán)限,所以這里配置:
HDFS_BASE_DIR=/user/kylin_manager_user/ssb
下面運行run.sh時會在此目錄下面生成臨時和實際數(shù)據(jù)。
2.配置部署Kylin的LDAP用戶和密碼,以及操作HDFS等的keytab文件
KYLIN_INSTALL_USER=kylin_manager_user
KYLIN_INSTALL_USER_PASSWD=xxxxxxxx
KYLIN_INSTALL_USER_KEYTAB=/home/${KYLIN_INSTALL_USER}/keytab/${KYLIN_INSTALL_USER}.keytab
3.配置beeline訪問hive數(shù)據(jù)庫的方式
BEELINE_URL=jdbc:hive2://hiveserve2_ip:10000
HIVE_BEELINE_COMMAND="beeline -u ${BEELINE_URL} -n ${KYLIN_INSTALL_USER} -p ${KYLIN_INSTALL_USER_PASSWD} -d org.apache.hive.jdbc.HiveDriver"
如果你的CDH或其他大數(shù)據(jù)平臺不是使用beeline,而是hive cli,請自行修改。
一切準備妥當(dāng)之后,我們開始運行程序,生成測試數(shù)據(jù):
cd ssb-kylin
bin/run.sh --scale 20
我們設(shè)置scale為20,程序會運行一段時間,最大的lineorder表數(shù)據(jù)有1億多條。程序執(zhí)行完成后,我們查看hive數(shù)據(jù)庫里面的表以及數(shù)據(jù)量:
use ssb;
show tables;
select count(1) from lineorder;
select count(1) from p_lineorder;


可以看到,一共創(chuàng)建了5張表和一張視圖。
加載Cube的元數(shù)據(jù)以及構(gòu)建Cube
ssb-kylin項目中已經(jīng)幫我們提前建好了project、model以及cube,只需要像learn_kylin示例一樣,直接導(dǎo)入Kylin即可。Cube Metadata的目錄為cubemeta,因為我們的kylin集成OpenLDAP,沒有ADMIN用戶,所以將cubemeta/cube/ssb.json中的owner參數(shù)設(shè)為null。
執(zhí)行如下命令導(dǎo)入cubemeta:
cd ssb-kylin
$KYLIN_HOME/bin/metastore.sh restore cubemeta
然后登錄Kylin,執(zhí)行Reload Metadata。這樣就在Kylin中創(chuàng)建新的project、model和cube。再構(gòu)建cube之前,先Disable,然后再Purge,刪除舊的臨時文件。
使用MapReduce構(gòu)建結(jié)果如下:

這里我再測試Spark構(gòu)建Cube性能,將之前創(chuàng)建的Cube Disable,然后再Purge。由于Cube被Purge后,無用的HBase表以及HDFS文件需要刪除,這里再手動清理一下垃圾文件,首先執(zhí)行如下命令:
${KYLIN_HOME}/bin/kylin.sh org.apache.kylin.tool.StorageCleanupJob --delete false
然后查看列出的HBase表以及HDFS文件是否無用,確定無誤后,執(zhí)行刪除操作:
${KYLIN_HOME}/bin/kylin.sh org.apache.kylin.tool.StorageCleanupJob --delete true
使用Spark構(gòu)建Cube時,耗用內(nèi)存還是比較多的,畢竟使用內(nèi)存資源提升Cube構(gòu)建速度。這里我將kylin.properties配置文件中對Spark的部分參數(shù)列一下:
kylin.engine.spark-conf.spark.master=yarn
kylin.engine.spark-conf.spark.submit.deployMode=cluster
kylin.engine.spark-conf.spark.yarn.queue=root.kylin_manager_group
# config Dynamic resource allocation
kylin.engine.spark-conf.spark.dynamicAllocation.enabled=true
kylin.engine.spark-conf.spark.dynamicAllocation.minExecutors=10
kylin.engine.spark-conf.spark.dynamicAllocation.maxExecutors=1024
kylin.engine.spark-conf.spark.dynamicAllocation.executorIdleTimeout=300
kylin.engine.spark-conf.spark.shuffle.service.enabled=true
kylin.engine.spark-conf.spark.shuffle.service.port=7337
kylin.engine.spark-conf.spark.driver.memory=4G
kylin.engine.spark-conf.spark.executor.memory=4G
kylin.engine.spark-conf.spark.executor.cores=1
kylin.engine.spark-conf.spark.network.timeout=600
kylin.engine.spark-conf.spark.executor.instances=1
上面的參數(shù)可以滿足絕大部分需求,這樣用戶在設(shè)計Cube時就基本上不用再配置了,當(dāng)然如果情況比較特殊,依然可以在Cube層面設(shè)置Spark相關(guān)的調(diào)優(yōu)參數(shù)。
在執(zhí)行Spark構(gòu)建Cube之前,需要在Advanced Setting中設(shè)置Cube Engine值為Spark,然后執(zhí)行Build。構(gòu)建完成后結(jié)果如下:

對比一下MapReduce和Spark 構(gòu)建 Cube的時間如下(Scale=20):
可以看到構(gòu)建速度基本快1倍,其實Spark還有很多其他方面的調(diào)優(yōu)(性能可以提升1-4倍及以上),這里暫不涉及,感興趣的朋友再交流。
查詢
ssb-kylin提供了13個SSB查詢SQL列表,查詢條件可能隨著scale因子不同而不一樣,大家根據(jù)實際情況修改,下面的例子在scale為10和20情況下的測試結(jié)果:
Scale=10的查詢結(jié)果如下:

Scale=20的查詢結(jié)果如下:

從結(jié)果中可以看出,所有的查詢都在1s以內(nèi)完成,有力證明了Apache Kylin的亞秒級查詢能力。此外,查詢平均性能隨著數(shù)據(jù)量的翻倍增加并未顯著下降,這也是Cube預(yù)計算的理論所決定的。
注:每個查詢語句的詳細內(nèi)容請查看ssb-kylin項目中的README.md說明。
到這里,本次Kylin的SSB壓測就完成后,但是對于正在看文章的你,一切才剛剛開始。