Hadoop - Kylin On OLAP

哥不是小蘿莉發表於2016-01-04

1.概述

  Apache Kylin是一個開源的分散式分析引擎,提供SQL介面並且用於OLAP業務於Hadoop的大資料集上,該專案由eBay貢獻於Apache。

2.What is Kylin

  在使用一種模型,我們得知道她是幹什麼的,那麼首先來看看Kylin的特性,其內容如下所示:

  • 可擴充套件超快的OLAP引擎:Kylin是為減少在Hadoop上百億級別資料查詢延遲而設計的。
  • Hadoop ANSI SQL介面:Kylin為Hadoop提供標準的SQL,其支援大部分查詢功能。
  • 出色的互動式查詢能力:通過Kylin,使用者可以於Hadoop資料進行亞秒級互動,在同樣的資料集上提供比Hive更好的效能。
  • 多維度Cube:使用者能夠在Kylin裡為百億以上的資料集定義資料模型並構建Cube。
  • 和BI工具無縫整合:Kylin提供與BI工具,如商業化的Tableau。另外,根據官方提供的資訊也在後續逐步提供對其他工具的支援。
  • 其他特性:
    • 對Job的管理和監控
    • 壓縮和編碼的支援
    • 增量更新Cube
    • 利用HBase Coprocessor去查詢
    • 基於HyperLogLog的Distinct Count近似演算法
    • 友好的Web介面用於管理、監控和使用Cube
    • 專案及Cube級別的訪問控制安全
    • 支援LDAP

3.ECOSYSTEM

  Kylin有其自己的生態圈,如下圖所示:

  從上圖中,我們可以看到,Kylin的核心包含:Kylin OLAP引擎基礎框架,Metadata引擎,查詢引擎,Job引擎以及儲存引擎等等,同時還包括REST伺服器以響應客戶端請求。另外,還擴充套件支援額外功能和特性的外掛,同時整合與排程系統、ETL、監控等生命週期管理系統。在Kylin核心之上擴充套件的第三方使用者介面,ODBC和JDBC驅動用以支援不同的工具和產品,如:Tableau。

4.Architecture

  Kylin的架構概述圖如下所示:

  圖中的執行流程很清楚,客戶端(REST API或JDBC/ODBC)傳送SQL請求,將其交給Kylin的執行引擎去處理,Kylin去拉去對應的資料來做處理,並返回處理結果,這裡Kylin需要依賴HBase。複雜的事情,Kylin的引擎都給我們處理了,我們只需要負責去編寫我們的業務SQL。

5.How TO Works

  在Kylin中,我們可以處理三維的業務查詢,如下圖所示:

  在明白了業務處理方向,其生態群和架構。我們要如何去整合該系統到Hadoop叢集?關於Kylin的整合過程是比較方便的,Kylin需要Hadoop、Hive、HBase、JDK,另外,對版本也是有要求的。本版要求如下:

  • Hadoop:2.4 - 2.7
  • Hive:0.13 - 0.14
  • HBase:0.98(這裡若是選擇Kylin-1.2,需要用到HBase-1.1+以上)
  • JDK1.7+

  另外,安裝Kylin步驟也是比較簡單的,步驟如下所示:

  • 下載最新的安裝包,地址如下:[Kylin.tar.gz
  • 設定KYLIN_HOME環境變數
  • 確保使用者有許可權去訪問Hadoop、Hive和HBase,如果不確定的話,我們可以在安裝包的bin目錄下執行check-env.sh指令碼,如果我們有問題的話,她會列印詳細的資訊。
  • 最後,我們可以通過kylin.sh start去啟動Kylin,或者使用kylin.sh stop去停止Kylin

  在Kylin啟動之後,我們可以通過輸入http://node_hostname:7070/kylin去訪問Kylin,登入預設使用者名稱和密碼為:ADMIN/KYLIN

  預覽截圖如下所示:

  另外,我們可以通過JDBC去操作,程式碼片段如下所示:

Driver driver = (Driver) Class.forName("org.apache.kylin.jdbc.Driver").newInstance();
Properties info = new Properties();
info.put("user", "ADMIN");
info.put("password", "KYLIN");
Connection conn = driver.connect("jdbc:kylin://dn1:7070/kylin_project_name", info);
Statement state = conn.createStatement();
ResultSet resultSet = state.executeQuery("select * from test_table");
while (resultSet.next()) {
  assertEquals("foo", resultSet.getString(1));
  assertEquals("bar", resultSet.getString(2));
  assertEquals("tool", resultSet.getString(3));
}

6.總結

  在使用Kylin時,我們有必要去首先熟悉其架構,這能讓我們更加熟悉其應用場景和業務場景。在整合和使用的過程當中會遇到一些問題,我們可以分析其異常日誌,然後利用搜尋引擎得到解決。關於Kylin的詳細使用,大家可以參考官方撰寫的文件。

7.結束語

  這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行討論或傳送郵件給我,我會盡我所能為您解答,與君共勉!

相關文章