Kylin配置Spark並構建Cube

HDP版本:2.6.4.0html

Kylin版本:2.5.1java

機器:三臺 CentOS-7,8G 內存node

Kylin 的計算引擎除了 MapReduce ,還有速度更快的 Spark ,本文就以 Kylin 自帶的示例 kylin_sales_cube 來測試一下 Spark 構建 Cube 的速度。git

1、配置Kylin的相關Spark參數

在運行 Spark cubing 前,建議查看一下這些配置並根據集羣的狀況進行自定義。下面是建議配置,開啓了 Spark 動態資源分配:github

<!--more-->shell

## Spark conf (default is in spark/conf/spark-defaults.conf)
kylin.engine.spark-conf.spark.master=yarn
kylin.engine.spark-conf.spark.submit.deployMode=cluster
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.executor.instances=40
kylin.engine.spark-conf.spark.yarn.executor.memoryOverhead=1024
kylin.engine.spark-conf.spark.shuffle.service.enabled=true
kylin.engine.spark-conf.spark.eventLog.enabled=true
kylin.engine.spark-conf.spark.eventLog.dir=hdfs\:///kylin/spark-history
kylin.engine.spark-conf.spark.history.fs.logDirectory=hdfs\:///kylin/spark-history
#kylin.engine.spark-conf.spark.hadoop.yarn.timeline-service.enabled=false
#
#### Spark conf for specific job
#kylin.engine.spark-conf-mergedict.spark.executor.memory=6G
#kylin.engine.spark-conf-mergedict.spark.memory.fraction=0.2
#
## manually upload spark-assembly jar to HDFS and then set this property will avoid repeatedly uploading jar
## at runtime
kylin.engine.spark-conf.spark.yarn.archive=hdfs://node71.data:8020/kylin/spark/spark-libs.jar
kylin.engine.spark-conf.spark.io.compression.codec=org.apache.spark.io.SnappyCompressionCodec
#
## 若是是HDP版本,請取消下述三行配置的註釋
kylin.engine.spark-conf.spark.driver.extraJavaOptions=-Dhdp.version=current
kylin.engine.spark-conf.spark.yarn.am.extraJavaOptions=-Dhdp.version=current
kylin.engine.spark-conf.spark.executor.extraJavaOptions=-Dhdp.version=current

其中 kylin.engine.spark-conf.spark.yarn.archive 配置是指定了 Kylin 引擎要運行的 jar 包,該 jar 包須要本身生成且上傳到 HDFS 。因爲我執行 Kylin 服務的用戶是 kylin,因此要先切換到 kylin 用戶下去執行。命令以下:apache

su - kylin
cd /usr/hdp/2.6.4.0-91/kylin
# 生成spark-libs.jar文件
jar cv0f spark-libs.jar -C $KYLIN_HOME/spark/jars/ ./
# 上傳到HDFS上的指定目錄
hadoop fs -mkdir -p /kylin/spark/
hadoop fs -put spark-libs.jar /kylin/spark/

2、修改Cube的配置

配置好 Kylin 的相關 Spark 參數後,接下來咱們須要將 Cube 的計算引擎修改成 Spark ,修改步驟以下:app

先指定 Kylin 自帶的生成 Cube 腳本:sh ${KYLIN_HOME}/bin/sample.sh ,會在 Kylin Web 頁面上加載出兩個 Cube 。oop

接着訪問咱們的 Kylin Web UI ,而後點擊 Model -> Action -> Edit 按鈕:性能

點擊第五步:Advanced Setting,往下划動頁面,更改 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。

對於沒有」COUNT DISTINCT」 和 「TOPN」 的 cube,請保留默認配置。

3、構建Cube

保存好修改後的 cube 配置後,點擊 Action -> Build,選擇構建的起始時間(必定要確保起始時間內有數據,不然構建 cube 無心義),而後開始構建 cube 。

在構建 cube 的過程當中,能夠打開 Yarn ResourceManager UI 來查看任務狀態。當 cube 構建到 第七步 時,能夠打開 Spark 的 UI 網頁,它會顯示每個 stage 的進度以及詳細的信息。

Kylin 是使用的本身內部的 Spark ,因此咱們還須要額外地啓動 Spark History Server 。

${KYLIN_HOME}/spark/sbin/start-history-server.sh hdfs://<namenode_host>:8020/kylin/spark-history

訪問:http://ip:18080/ ,能夠看到 Spark 構建 Cube 的 job 詳細信息,該信息對疑難解答和性能調整有極大的幫助。

4、FAQ

在使用 Spark 構建 Cube 的過程當中,遇到了兩個錯誤,都解決了,特此記錄一下,讓你們明白,公衆號內都是滿滿的乾貨。

一、Spark on Yarn 配置調整

報錯內容:

Exception in thread "main" java.lang.IllegalArgumentException: Required executor memory (4096+1024 MB) is above the max threshold (4096 MB) of this cluster! Please check the values of 'yarn.scheduler.maximum-allocation-mb' and/or 'yarn.nodemanager.resource.memory-mb'.

問題分析:

根據報錯日誌分析,任務所需的執行內存(4096 + 1024MB)高於了此集羣最大的閾值。能夠調整Spark任務的執行內存或者是Yarn的相關配置。

Spark任務所需的執行內存(4096 + 1024MB)對應的配置分別是:

  • kylin.engine.spark-conf.spark.executor.memory=4G
  • kylin.engine.spark-conf.spark.yarn.executor.memoryOverhead=1024

Yarn相關配置:

  • yarn.nodemanager.resource.memory-mb:NodeManager是YARN中單個節點的代理,它須要與應用程序的ApplicationMaster和集羣管理者ResourceManager交互。該屬性表明該節點Yarn可以使用的物理內存總量。
  • yarn.scheduler.maximum-allocation-mb:表明單個任務可申請的最大物理內存量。該配置值不能大於yarn.nodemanager.resource.memory-mb配置值大小。

解決辦法:

以調整 Yarn 配置爲例,調整 yarn.scheduler.maximum-allocation-mb 大小,因爲依賴於 yarn.nodemanager.resource.memory-mb ,因此兩個配置都調整爲比執行內存(4096+1024 MB)大的數值,好比:5888 MB 。

二、構建 Cube 第八步:Convert Cuboid Data to HFile 報錯

報錯內容:

java.lang.NoClassDefFoundError: Could not initialize class org.apache.hadoop.hbase.io.hfile.HFile

問題分析:

kylin.engine.spark-conf.spark.yarn.archive 參數值指定的 spark-libs.jar 文件缺乏 HBase 相關的類文件。

解決辦法:

因爲缺失 HBase 相關的類文件比較多,參照 Kylin 官網給出的解決方式依舊報找不到類文件,因此我將 HBase 相關的 jar 包都添加到了 spark-libs.jar 裏面。若是你已經生成了 spark-libs.jar 並上傳到了 HDFS,那麼你須要從新打包上傳。具體操做步驟以下:

su - kylin
cd /usr/hdp/2.6.4.0-91/kylin
cp -r /usr/hdp/2.6.4.0-91/hbase/lib/hbase* /usr/hdp/2.6.4.0-91/kylin/spark/jars/
rm -rf spark-libs.jar;jar cv0f spark-libs.jar -C spark/jars/ ./
hadoop fs -rm -r /kylin/spark/spark-libs.jar    
hadoop fs -put spark-libs.jar /kylin/spark/

而後切換到 Kylin Web 頁面,繼續構建 Cube 。

5、Spark與MapReduce的對比

使用 Spark 構建 Cube 共耗時約 7 分鐘,以下圖所示:

使用 MapReduce 構建 Cube 共耗時約 15 分鐘,以下圖所示:

仍是使用 Spark 構建 cube 快,還快很多!

6、總結

本篇文章主要介紹了:

  • 如何配置 Kylin 的相關 Spark 參數
  • 如何更改 Cube 的計算引擎
  • 生成 spark-libs.jar 包並上傳到 HDFS
  • Spark 構建 Cube 過程當中的 FAQ
  • Spark 與 MapReduce 構建 Cube 的速度對比

本文參考連接:

推薦閱讀:


原文出處:https://www.cnblogs.com/createboke/p/11581915.html

相關文章
相關標籤/搜索