1 引入Spark引擎
Kylin v2開始引入了Spark引擎,可以在構建Cube步驟中替換MapReduce。 關於配置spark引擎的文檔,下面給出官方鏈接以便查閱:
http://kylin.apache.org/docs20/tutorial/cube_spark.html
以下是配置步驟:
1.在kylin的安裝目錄下,新建目錄hadoop_conf
mkdir $KYLIN_HOME/hadoop_conf
2.將core-site.xml,hdfs-site.xml,hbase-site.xml,hive-site.xml,yarn-site.xml 5個配置文件放入剛才建立的目錄。
(如果使用的是Apache的Hadoop,hbase,hive等,去配置文件目錄復制或者建立軟連接,我使用的是CDH管理集群,那么配置文件就在/etc/hadoop/conf,/etc/hive/conf,/etc/hbase/conf路徑下,直接復制過去)
cp /etc/hadoop/conf/hdfs-site.xml $KYLIN_HOME/hadoop_conf
cp /etc/hadoop/conf/yarn-site.xml $KYLIN_HOME/hadoop_conf
cp /etc/hadoop/conf/core-site.xml $KYLIN_HOME/hadoop_conf
cp /etc/hbase/conf/hbase-site.xml $KYLIN_HOME/hadoop_conf
cp /etc/hive/conf/hive-site.xml $KYLIN_HOME/hadoop_conf
3.修改kylin.properties,添加以下配置(這里寫hadoop-conf的全路徑,路徑根據自己hadoo_conf目錄所在位置決定)
kylin.env.hadoop-conf-dir= $KYLIN_HOME/hadoop_conf
4 . 檢查 Spark 配置
Kylin 在KYLIN_HOME/spark 中嵌入一個 Spark binary (v2.1.2),所有使用 “kylin.engine.spark-conf.” 作為前綴的 Spark 配置屬性都能在 $KYLIN_HOME/conf/kylin.properties 中進行管理。這些屬性當運行提交 Spark job 時會被提取並應用;例如,如果您配置 “kylin.engine.spark-conf.spark.executor.memory=4G”,Kylin 將會在執行 “spark-submit” 操作時使用 “–conf spark.executor.memory=4G” 作為參數。
運行 Spark cubing 前,建議查看一下這些配置並根據您集群的情況進行自定義。
下面是建議配置,開啟了 Spark 動態資源分配:
kylin.engine.spark-conf.spark.master=yarn
kylin.engine.spark-conf.spark.submit.deployMode=cluster
kylin.engine.spark-conf.spark.dynamicAllocation.enabled=true
kylin.engine.spark-conf.spark.dynamicAllocation.minExecutors=1
kylin.engine.spark-conf.spark.dynamicAllocation.maxExecutors=1000
kylin.engine.spark-conf.spark.dynamicAllocation.executorIdleTimeout=300
kylin.engine.spark-conf.spark.yarn.queue=default
kylin.engine.spark-conf.spark.driver.memory=2G
kylin.engine.spark-conf.spark.executor.memory=4G
kylin.engine.spark-conf.spark.yarn.executor.memoryOverhead=1024
kylin.engine.spark-conf.spark.executor.cores=1
kylin.engine.spark-conf.spark.network.timeout=600
kylin.engine.spark-conf.spark.shuffle.service.enabled=true
kylin.engine.spark-conf.spark.executor.instances=1
kylin.engine.spark-conf.spark.eventLog.enabled=true
kylin.engine.spark-conf.spark.hadoop.dfs.replication=2
kylin.engine.spark-conf.spark.hadoop.mapreduce.output.fileoutputformat.compress=true
kylin.engine.spark-conf.spark.hadoop.mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.DefaultCodec
kylin.engine.spark-conf.spark.io.compression.codec=org.apache.spark.io.SnappyCompressionCodec
kylin.engine.spark-conf.spark.eventLog.dir=hdfs\:///kylin/spark-history
kylin.engine.spark-conf.spark.history.fs.logDirectory=hdfs\:///kylin/spark-history
5.重啟kylin
bin/kylin.sh stop
bin/kylin.sh start
注意:
1.如果直接使用bin/kylin.sh restart重啟,有可能配置會不生效,我就遇到了,用上面的方式重啟就沒問題。
2.在kylin的web頁面上,有system選項卡,里面有reload config,本來我以為修改配置文件后可以點擊此按鈕,不用重啟,但是實驗證明這樣配置也無法生效。所以保險的方法就是按照上面的方式重啟。
2 創建和修改樣例 cube
Kylin 啟動后,訪問 Kylin 網站,在 “Advanced Setting” 頁,編輯名為 “kylin_sales” 的 cube,將 “Cube Engine” 由 “MapReduce” 換成 “Spark”:


點擊 “Next” 進入 “Configuration Overwrites” 頁面,點擊 “+Property” 添加屬性 “kylin.engine.spark.rdd-partition-cut-mb” 其值為 “500” (理由如下):

樣例 cube 有兩個耗盡內存的度量: “COUNT DISTINCT” 和 “TOPN(100)”;當源數據較小時,他們的大小估計的不太准確: 預估的大小會比真實的大很多,導致了更多的 RDD partitions 被切分,使得 build 的速度降低。500 對於其是一個較為合理的數字。點擊 “Next” 和 “Save” 保存 cube。
3 用 Spark 構建 Cube
點擊 “Build”,選擇當前日期為 end date。Kylin 會在 “Monitor” 頁生成一個構建 job,第 7 步是 Spark cubing。Job engine 開始按照順序執行每一步。

第 7 步是 Spark cubing,當 Kylin 執行這一步時,您可以監視 Yarn 資源管理器里的狀態. 點擊 “Application Master” 鏈接將會打開 Spark 的 UI 網頁,它會顯示每一個 stage 的進度以及詳細的信息。

查看Spark 的 UI

所有步驟成功執行后,Cube 的狀態變為 “Ready” 且您可以像往常那樣進行查詢。
4 MapReduce和Spark引擎構建Cube時間對比
默認MapReduce引擎構建Cube,耗時15.97分鍾;

引入Spark引擎構建Cube,耗時6.78分鍾

5 進一步
如果您是 Kylin 的管理員但是對於 Spark 是新手,建議您瀏覽 Spark 文檔,別忘記相應地去更新配置。您可以開啟 Spark 的 Dynamic Resource Allocation ,以便其對於不同的工作負載能自動伸縮。Spark 性能依賴於集群的內存和 CPU 資源,當有復雜數據模型和巨大的數據集一次構建時 Kylin 的 Cube 構建將會是一項繁重的任務。如果您的集群資源不能夠執行,Spark executors 就會拋出如 “OutOfMemorry” 這樣的錯誤,因此請合理的使用。對於有 UHC dimension,過多組合 (例如,一個 cube 超過 12 dimensions),或耗盡內存的度量 (Count Distinct,Top-N) 的 Cube,建議您使用 MapReduce engine。如果您的 Cube 模型較為簡單,所有度量都是 SUM/MIN/MAX/COUNT,源數據規模小至中等,Spark engine 將會是個好的選擇。