【運維篇】如何使用SSB壓測Apache Kylin

作者:蔣守壯

作者介紹:蔣守壯,現(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壓測就完成后,但是對于正在看文章的你,一切才剛剛開始。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容