1. 概述
Apache Kylin™是一個開源的分布式分析引擎,提供Hadoop之上的SQL查詢接口及多元分析(OLAP)能力以支援超大規模資料,最初由eBay Inc. 開發并貢獻至開源社群。它能在亞秒内查詢巨大的Hive表。
2. 内容
在內建Kylin到CDH Hadoop環境中時,發現新版本Kylin-2.2.0無法內建到CDH Hadoop。環境資訊如下:
- Hadoop:CDH-5.4.2,Hadoop-2.6
- Hive:Hive-2.1.1
- HBase:CDH-5.4.2,HBase-1.0.0
上述版本,如果使用apache-kylin-2.2.0-bin-cdh57.tar.gz內建,Kylin系統可以正常啟動,但是在預編譯Cube,将編譯的結果寫入HBase時會出現對應的類找不到。去翻閱CDH-HBase-1.0.0的源代碼确實沒有對應的類。在Kylin的JIRA中也有記錄該現象,大家可以翻閱問題單:[
KYLIN-1089]2.1 Patch
針對該問題可以編輯源代碼後,重新編譯。需要注意的是,如果你想将pom.xml檔案中的屬性“hbase-hadoop2.version”改為“1.0.0-cdh5.4.2”,在編譯的時候會出現“org.apache.hadoop.hbase.regionserver.ScannerContext.java”找不到。确實,在CDH版的HBase-1.0.0版本中該類不存在,在CDH中最低支援5.5.4,對應的Patch代碼如下所示:
From c0e053d16fc8fa36947e6181589505b722ea54dd Mon Sep 17 00:00:00 2001 From: shaofengshi <[email protected]> Date: Fri, 11 Nov 2016 08:41:57 +0800 Subject: [PATCH] KYLIN-1089 support CDH 5.5/hbase1.0 --- pom.xml | 12 ++++++------ .../v1/coprocessor/observer/AggregateRegionObserver.java | 4 ++-- .../hbase/cube/v1/filter/TestFuzzyRowFilterV2EndToEnd.java | 3 +-- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 9b84f23..8352e97 100644 --- a/pom.xml +++ b/pom.xml @@ -46,19 +46,19 @@ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <!-- Hadoop versions --> - <hadoop2.version>2.6.0-cdh5.7.0</hadoop2.version> - <yarn.version>2.6.0-cdh5.7.0</yarn.version> + <hadoop2.version>2.6.0-cdh5.5.4</hadoop2.version> + <yarn.version>2.6.0-cdh5.5.4</yarn.version> <!-- Hive versions --> - <hive.version>1.1.0-cdh5.7.0</hive.version> - <hive-hcatalog.version>1.1.0-cdh5.7.0</hive-hcatalog.version> + <hive.version>1.1.0-cdh5.5.4</hive.version> + <hive-hcatalog.version>1.1.0-cdh5.5.4</hive-hcatalog.version> <!-- HBase versions --> - <hbase-hadoop2.version>1.2.0-cdh5.7.0</hbase-hadoop2.version> + <hbase-hadoop2.version>1.0.0-cdh5.5.4</hbase-hadoop2.version> <kafka.version>0.8.1</kafka.version> <!-- Hadoop deps, keep compatible with hadoop2.version --> - <zookeeper.version>3.4.5-cdh5.7.0</zookeeper.version> + <zookeeper.version>3.4.5-cdh5.5.4</zookeeper.version> <curator.version>2.7.1</curator.version> <jackson.version>2.2.4</jackson.version> <jsr305.version>3.0.1</jsr305.version> diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v1/coprocessor/observer/AggregateRegionObserver.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v1/coprocessor/observer/AggregateRegionObserver.java index 7e25e4c..7139ca7 100644 --- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v1/coprocessor/observer/AggregateRegionObserver.java +++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/cube/v1/coprocessor/observer/AggregateRegionObserver.java @@ -26,7 +26,7 @@ import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver; import org.apache.hadoop.hbase.coprocessor.ObserverContext; import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; -import org.apache.hadoop.hbase.regionserver.Region; +import org.apache.hadoop.hbase.regionserver.HRegion; import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost; import org.apache.hadoop.hbase.regionserver.RegionScanner; import org.apache.kylin.gridtable.StorageSideBehavior; @@ -99,7 +99,7 @@ public class AggregateRegionObserver extends BaseRegionObserver { // start/end region operation & sync on scanner is suggested by the // javadoc of RegionScanner.nextRaw() // FIXME: will the lock still work when a iterator is returned? is it safe? Is readonly attribute helping here? by mhb - Region region = ctxt.getEnvironment().getRegion(); + HRegion region = ctxt.getEnvironment().getRegion(); region.startRegionOperation(); try { synchronized (innerScanner) { diff --git a/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/cube/v1/filter/TestFuzzyRowFilterV2EndToEnd.java b/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/cube/v1/filter/TestFuzzyRowFilterV2EndToEnd.java index 04e2e8b..4e87093 100644 --- a/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/cube/v1/filter/TestFuzzyRowFilterV2EndToEnd.java +++ b/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/cube/v1/filter/TestFuzzyRowFilterV2EndToEnd.java @@ -44,7 +44,6 @@ import org.apache.hadoop.hbase.filter.FilterList; import org.apache.hadoop.hbase.filter.FilterList.Operator; import org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy; import org.apache.hadoop.hbase.regionserver.HRegion; -import org.apache.hadoop.hbase.regionserver.Region; import org.apache.hadoop.hbase.regionserver.RegionScanner; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Pair; @@ -225,7 +224,7 @@ public class TestFuzzyRowFilterV2EndToEnd { scan.addFamily(cf.getBytes()); scan.setFilter(filter); List<HRegion> regions = TEST_UTIL.getHBaseCluster().getRegions(table.getBytes()); - Region first = regions.get(0); + HRegion first = regions.get(0); first.getScanner(scan); RegionScanner scanner = first.getScanner(scan); List<Cell> results = new ArrayList<Cell>(); -- 2.7.2
安裝上述Patch檔案中的内容,修改Kylin源代碼檔案中的内容後,在apache-kylin-2.2.0-bin/build/script/目錄中運作package.sh腳本進行編譯打包。
2.2 更新HBase版本
由于apache-kylin-2.2.0使用的是HBase1.1.x版本進行編譯的,如果不編譯Kylin源代碼,可以通過更新HBase版本到1.1.x以上。比如,将CDH版的hbase-1.0.0-cdh5.4.2更新到hbase-1.2.0-cdh5.7.0版本。具體更新步驟比較簡單這裡就不多贅述了。
3. 實戰演練
在Kylin-2.2.0中,省略了很多繁瑣的配置,許多配置項都改為預設的配置屬性了。隻需在$KYLIN_HOME/conf目錄中,編輯kylin.properties檔案,配置如下屬性值:
kylin.rest.servers=0.0.0.0:7070 kylin.job.jar=/data/soft/new/kylin/lib/kylin-job-2.2.0.jar kylin.coprocessor.local.jar=/data/soft/new/kylin/lib/kylin-coprocessor-2.2.0.jar
在$KYLIN_HOME/bin目錄中運作sample.sh腳本,加載批處理Cube。會在Hive倉庫中生成如下表:
kylin_account kylin_cal_dt kylin_category_groupings kylin_country kylin_sales
這裡隻是演練MapReduce批處理Cube,對于Spark和Kafka這類流式資料暫不操作。可以在$KYLIN_HOME/bin目錄編輯kylin.sh腳本,将Kafka和Spark依賴注釋掉。内容如下所示:
# .... function retrieveDependency() { #retrive $hive_dependency and $hbase_dependency source ${dir}/find-hive-dependency.sh source ${dir}/find-hbase-dependency.sh source ${dir}/find-hadoop-conf-dir.sh #source ${dir}/find-kafka-dependency.sh #source ${dir}/find-spark-dependency.sh #retrive $KYLIN_EXTRA_START_OPTS if [ -f "${dir}/setenv.sh" ]; then echo "WARNING: ${dir}/setenv.sh is deprecated and ignored, please remove it and use ${KYLIN_HOME}/conf/setenv.sh instead" source ${dir}/setenv.sh fi # ...
然後,運作check-env.sh腳本檢測Kylin系統所需要環境依賴,比如Hadoop、Hive、HBase環境變量配置。在啟動Kylin系統之前,需要将HBase的hbase-site.xml檔案複制到$KYLIN_HOME/conf目錄中,并修改該檔案的Zookeeper用戶端連接配接位址。在Kylin系統中,讀取hbase-site.xml配置檔案中的Zookeeper用戶端位址時不需要指定2181端口,比如:之前的用戶端位址為“dn1:2181,dn2:2181,dn3:2181”,改為“dn1,dn2,dn3”即可。
最後,執行kylin.sh start啟動Kylin系統,系統預設登入使用者名和密碼為ADMIN/KYLIN。
3.1 預編譯Cube
在Model中,選擇 kylin_sales_cube批處理Cube進行編譯,然後在Monitor子產品中檢視Cube編譯的進度,如下圖所示:

如果在編譯Cube的過程中可能會出現連接配接異常,如下所示:
account.jetbrains.com:10020 failed on connection exception
出現這類問題,是Hadoop的historyserver服務沒有啟動,執行以下指令啟動該程序服務:
mr-jobhistory-daemon.sh start historyserver
在編譯成功後,在Model子產品中,對應的Cube由Disable狀态編譯Ready狀态,如下圖所示:
從上圖中可以知道,預編譯之後的結果是存儲在HBase中的,如表名為:KYLIN_Y8ASHHZ0GY
最後,在Insight子產品中的SQL編輯區域,編寫SQL代碼查詢對應的結果,如下圖所示:
4.總結
在內建的過程當中需要注意版本的相容性問題。在新版本的Kylin中引入的新特性Diagnosis,如果在預編譯Cube中出現錯誤,在解決不了的情況下,可以使用Diagnosis功能,将編譯産生的結果,通過Diagnosis導出發送給Kylin官方尋求解決方式。
5.結束語
這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行讨論或發送郵件給我,我會盡我所能為您解答,與君共勉。
聯系方式:
Twitter:
https://twitter.com/smartloliQQ群(Hadoop - 交流社群1):
424769183溫馨提示:請大家加群的時候寫上加群理由(姓名+公司/學校),友善管理者稽核,謝謝!