Apache Kylin是一個開源的分布式分析引擎,提供Hadoop之上的SQL查詢接口及多維分析(OLAP)能力以支持超大規模數據,初由eBay公司開發并貢獻至開源社區。它能在亞秒內查詢巨大的Hive表。
本書分為21章,詳細講解Apache Kylin概念、安裝、配置、部署,讓讀者對Apache Kylin構建大數據分析平臺有一個感性認識。同時,本書從應用角度,結合Dome和實例介紹了用于多維分析的Cube算法的創建、配置與優化。后還介紹了Kyligence公司KAP大數據分析平臺,對讀者有極大的參考價值。
本書適合大數據技術初學者、大數據分析人員、大數據架構師等,也適合用于高等院校和培訓學校相關專業師生教學參考。
Kyligence 聯合創始人兼CEO,Apache Kylin項目管理委員會主席(PMC Chair)韓卿
武漢市云升科技發展有限公司董事長,《智慧城市—大數據、物聯網和云計算之應用》作者楊正洪
萬達網絡科技集團大數據中心副總經理,《Spark高級數據分析》中文版譯者龔少成
數據架構師,IT脫口秀(清風那個吹)創始人,《開源大數據分析引擎Impala實戰》作者賈傳青
等等業內專家聯合推薦
Apache Kylin將傳統的數據倉庫及商務智能分析能力帶入到了大數據時代,作為新興的技術已經被廣大用戶所使用。作為創始作者,我非常欣喜能看到關于Apache Kylin相關書籍的出版, 這無疑對中國用戶更好地使用Kylin,解決實際的大數據分析架構及業務問題有很大幫助。
韓卿
Kyligence 聯合創始人兼CEO,Apache Kylin項目管理委員會主席(PMC Chair)
伴隨著大數據發展的三條主線是大數據技術、大數據思維和大數據實踐。因為RDBMS很難處理單表10億行數據,所以大數據技術應需而生。大數據技術從初的解決海量數據的快速存儲和讀取,到今天的海量數據的OLAP,當中衍生出眾多的技術產品,Apache Kylin就是其中的一個產品,目標是解決大數據范疇中的OLAP。
第二條主線是大數據思維。數據處理的近幾十年都被RDBMS的思想所束縛,小表、多表、表的連接、過分注重冗余性的壞處,等等,這些都限制了海量數據上的處理與分析。大數據技術出來之后,隨著而來的大數據思維,給我們帶來了海量數據處理的新思維。這個新思維的核心就是突破表的概念,而采用面向對象的數據模型在數據層上實現。Apache Kylin的Cube模型就是在逐步體現大數據的思維。
后一條主線是大數據實踐。大數據實踐分為數據梳理、數據建模、數據采集、數據管控、數據服務、數據可視化和數據分析。這是一環套一環的步驟,不能跳過。Apache Kylin作為數據分析環節的技術產品,一定要同數據管理的《基于Apache Kylin構建大數據分析平臺》一書淺顯易懂,實操性強,是目前Apache Kylin界不可多得的技術資料,值得細讀和研究。
楊正洪
武漢市云升科技發展有限公司董事長
Apache Kylin是基于MOLAP的實時大數據引擎,與Hadoop生態系統結合更加緊密,先天的優勢注定了其支持更大的數據規模,更好的擴展性,獨有的中國血統較其他開源軟件更具本地化優勢,更符合中國國情。本書包含了守壯多年的實踐經驗 ,系統的介紹了Apache Kylin技術,值得推薦。
賈傳青
數據架構師,IT脫口秀(清風那個吹)創始人
蔣守壯,現就職于萬達網絡科技集團有限公司,博學大數據工程師,大數據實踐者。曾任平安科技博學大數據分析師和架構師,CSDN社區專家,知識庫特邀編輯。目前專注于Docker、Kubernetes、Mesos、Hadoop、Spark和Kylin等技術領域。
及時部分 Apache Kylin基礎部分
第1章 Apache Kylin前世今生 3
1.1 Apache Kylin的背景 3
1.2 Apache Kylin的應用場景 3
1.3 Apache Kylin的發展歷程 4
第2章 Apache Kylin前奏 7
2.1 事實表和維表 7
2.2 星型模型和雪花型模型 7
2.2.1 星型模型 7
2.2.2 雪花型模型 8
2.2.3 星型模型示例 8
2.3 OLAP 9
2.3.1 OLAP分類 9
2.3.2 OLAP的基本操作 10
2.4 數據立方體(Data Cube) 11
第3章 Apache Kylin 工作原理和體系架構 12
3.1 Kylin工作原理 12
3.2 Kylin體系架構 13
3.3 Kylin中的核心部分:Cube構建 15
3.4 Kylin的SQL查詢 16
3.5 Kylin的特性和生態圈 16
第4章 搭建CDH大數據平臺 18
4.1 系統環境和安裝包 19
4.1.1 系統環境 19
4.1.2 安裝包的下載 20
4.2 準備工作:系統環境搭建 21
4.2.1 網絡配置(CDH集群所有節點) 21
4.2.2 打通SSH,設置ssh無密碼登錄(所有節點) 21
4.3 正式安裝CDH:準備工作 29
4.4 正式安裝CDH5:安裝配置 30
4.4.1 CDH5的安裝配置 30
4.4.2 對Hive、HBase執行簡單操作 39
第5章 使用Kylin構建企業大數據分析平臺的4種部署方式 41
5.1 Kylin部署的架構 41
5.2 Kylin的四種典型部署方式 42
第6章 單獨為Kylin部署HBase集群 44
第7章 部署Kylin集群環境 58
7.1 部署Kylin的先決條件 58
7.2 部署Kylin集群環境 61
7.3 為Kylin集群搭建負載均衡器 70
7.3.1 搭建Nginx環境 70
7.3.2 配置Nginx實現Kylin的負載均衡 73
第二部分 Apache Kylin 進階部分
第8章 Demo案例實戰 77
8.1 Sample Cube案例描述 77
8.2 Sample Cube案例實戰 78
8.2.1 準備數據 78
8.2.2 構建Cube 81
第9章 多維分析的Cube創建實戰 89
9.1 Cube模型 89
9.2 創建Cube的流程 90
9.2.1 步驟一:Hive中事實表,以及多張維表的處理 90
9.2.2 步驟二:Kylin中建立項目(Project) 95
9.2.3 步驟三:Kylin中建立數據源(Data Source) 95
9.2.4 步驟四:Kylin中建立數據模型(Model) 98
9.2.5 步驟五:Kylin中建立Cube 104
9.2.6 步驟六:Build Cube 114
9.2.7 步驟七:查詢Cube 118
第10章 Build Cube的來龍去脈 120
10.1 流程分析 120
10.2 小結 134
第三部分 Apache Kylin 高級部分
第11章 Cube優化 137
第12章 備份Kylin的Metadata 142
12.1 Kylin的元數據 142
12.2 備份元數據 143
12.3 恢復元數據 146
第13章 使用Hive視圖 147
13.1 使用Hive視圖 147
13.2 使用視圖實戰 149
第14章 Kylin的垃圾清理 153
14.1 清理元數據 153
14.2 清理存儲器數據 154
第15章 JDBC訪問方式 157
第16章 通過RESTful訪問Kylin 161
第17章 Kylin版本之間升級 179
17.1 從1.5.2升級到近期版本1.5.3 179
17.2 從1.5.1升級到1.5.2版本 180
17.3 從Kylin 1.5.2.1升級到Kylin 1.5.3實戰 181
17.4 補充內容 187
第18章 大數據可視化實踐 189
18.1 可視化工具簡述 189
18.2 安裝Kylin ODBC驅動 190
18.3 通過Excel訪問Kylin 192
18.4 通過Power BI訪問Kylin 194
18.4.1 安裝配置Power BI 194
18.4.2 實戰操作 198
18.5 通過Tableau訪問Kylin 199
18.6 Kylin Mondrian Saiku 205
18.7 實戰演練:通過Saiku訪問Kylin 211
18.7.1 及時個Schema例子:myproject_pvuv_cube的演示 211
18.7.2 第二個Schema例子:kylin_sales_cube的演示 219
18.7.3 Saiku使用的一些問題 223
18.8 通過Apache Zepplin訪問Kylin 229
18.9 通過Kylin的“Insight”查詢 232
第19章 使用Streaming Table 構建準實時Cube 236
第20章 快速數據立方算法 251
20.1 快速數據立方算法概述 251
20.2 快速數據立方算法優點和缺點 253
20.3 獲取Fast Cubing算法的優勢 254
第四部分 Apache Kylin的擴展部分
第21章 大數據智能分析平臺KAP 257
21.1 大數據智能分析平臺KAP概述 257
21.2 KAP的安裝部署 259
第 4 章? 搭建CDH大數據平臺 ?
CDH(Cloudera's Distribution, including Apache Hadoop),是Hadoop眾多分支中的一種,由Cloudera維護,基于穩定版本的Apache Hadoop構建,并集成了很多補丁,可直接用于生產環境。
CM(全稱Cloudera Manager)則是為了便于在集群中進行Hadoop等大數據處理相關的服務安裝和監控管理的組件,對集群中主機、Hadoop、Hive、Spark等服務的安裝配置管理做了極大簡化。
CM部署包括如下的軟件安裝:
? Oracle JDK安裝。
? Cloudera Manager Server和Agent包安裝。
? 存儲相關元數據的數據庫安裝。
? CDH和管理服務的軟件包安裝。
Cloudera官方共給出了3種安裝方式:
? 及時種方法必須要求所有機器都能連網。
? 第二種方法下載很多包。
? 第三種方法對系統侵入性最小,較大優點可實現全離線安裝,而且重裝什么的都非常方便。后期的集群統一升級也非常好。這也是我之所以選擇離線安裝的原因。
在安裝部署CM和CDH之前,說明幾點:
(1)由于我們的生產環境的集群節點比較多,這里為了方便演示,我們搭建了一個只有4個節點CDH集群,沒有搭建ResourceManager的主備,以及沒有HDFS的HA等,如果需要的話,可以通過CM進行動態擴展。
(2)我們的實際環境CM和CDH版本已經從5.6.0升級為5.7.0,為了方便朋友部署CDH 5.7.0版本,我們本章都是基于5.7.0版本部署的集群環境,但是截圖都是5.6.0版本的(請朋友們諒解),這兩個版本的部署界面和安裝步驟都沒什么變化,具體情況,朋友安裝過程中可以進行參考。
(3)后續章節中部署的Kylin集群環境都是基于CDH 5.7.0環境來搭建大數據分析平臺。
4.1 系統環境和安裝包
4.1.1 系統環境
主機環境:
10.20.22.202 SZB-L0020040
10.20.22.204 SZB-L0020041
10.20.22.209 SZB-L0020042
10.20.22.210 SZB-L0020043
操作系統:CentOS 6.7(Final) x64。
CM和CDH的版本號:5.7.0。
組件規劃(根據自己的實際情況,進行組件規劃),如表4-1所示。
表4-1
IP地址 主機名 角色
10.20.22.202 SZB-L0020040 CM管理組件
10.20.22.204 SZB-L0020041 NameNode
ResourceManager
HBase Master
Impala StateStore
Impala Catalog Server
Hive HiveServer2
Hive Metastore Server
ZooKeeper Server
10.20.22.209 SZB-L0020042 DataNode
ZooKeeper Server
NodeManager
HBase RegionServer
Impala Daemon
10.20.22.210 SZB-L0020043 DataNode
ZooKeeper Server
NodeManager
HBase RegionServer
Impala Daemon
CDH集成的組件比較多,比如Spark、Oozie、Solr、Hue等,根據自己的要求動態擴容。同時每個節點部署的組件不宜過多,根據組件的CPU和內存占用,對磁盤讀寫、網絡帶寬等進行合理規劃。
4.1.2 安裝包的下載
1. 安裝說明
官方參考文檔(第三種安裝方式:手工離線安裝方式):
www.cloudera.com/documentation/enterprise/latest/topics/cm_ig_install_path_c.html
2. 相關包的下載地址
Cloudera Manager下載地址:
archive-primary.cloudera.com/cm5/cm/5/cloudera-manager-el6-cm5.7.0_x86_64.tar.gz
CDH安裝包地址:archive.cloudera.com/cdh5/parcels/5.7.0/,由于我們的操作系統為CentOS 6.7,需要下載以下文件:
CDH-5.7.0-1.cdh5.7.0.p0.45-el6.parcel
CDH-5.7.0-1.cdh5.7.0.p0.45-el6.parcel.sha1
manifest.json
CDH 5.6.x支持的JDK版本如表4-2所示:
表4-2
最小支持的版本號 推薦的版本號 說明
1.7.0_55 1.7.0_67,1.7.0_75,1.7.0_80 無
1.8.0_31 1.8.0_60 不推薦使用JDK 1.8.0_40
本環境使用的JDK為:
archive.cloudera.com/cm5/redhat/6/x86_64/cm/5.7.0/RPMS/x86_64/oracle-j2sdk1.7-1.7.0 update67-1.x86_64.rpm
當然如果需要,你也可以直接使用1.7.0_80版本的JDK。
CM和其支持的服務可以使用如下的數據庫:
? MariaDB 5.5
? MySQL - 5.1、5.5和5.6
? PostgreSQL - 8.1、8.3、8.4、9.1、9.2、9.3和9.4
? Oracle 11gR2和12c
Cloudera Manager和CDH支持的Oracle JDBC Driver完整版本號為:使用JDK 6編譯的Oracle 11.2.0.3.0 JDBC 4.0,這個驅動的Jar包名字為ojdbc6.jar。
這里使用的數據庫為MySQL,具體包為:
mysql-advanced-5.6.21-linux-glibc2.5-x86_64.tar.gz
4.2 準備工作:系統環境搭建
本節講解系統環境搭建,以下操作均用root用戶操作。
4.2.1 網絡配置(CDH集群所有節點)
vi /etc/sysconfig/network修改hostname:
NETWORKING=yes
HOSTNAME=SZB-L0020040
HOSTNAME的值要設置為每個主機自己的主機名,你可以通過執行hostname的Linux命令獲取主機名或者其他方式。
通過service network restart重啟網絡服務生效。
在每個節點的/etc/hosts文件中加入集群的所有主機名和IP地址:
127.0.0.1 localhost
10.20.22.202 SZB-L0020040
10.20.22.204 SZB-L0020041
10.20.22.209 SZB-L0020042
10.20.22.210 SZB-L0020043
這里需要將每臺機器的IP及主機名對應關系都寫進去,本機的也要寫進去,否則啟動Agent的時候會提示hostname解析錯誤。
4.2.2 打通SSH,設置ssh無密碼登錄(所有節點)
創建主機之間的互相信任關系方式有好幾種:
1. 及時種(假如是在root用戶下面創建信任關系)
在節點(SZB-L0020040)上執行ssh-keygen -t rsa一路回車,生成無密碼的密鑰對。
將公鑰添加到認證文件中:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
并設置authorized_keys的訪問權限:
chmod 600 ~/.ssh/authorized_keys
除了SZB-L0023776節點外,其他4個節點也執行上面的操作生成無密碼的密鑰對。
復制其他4個節點的公鑰文件內容到SZB-L0020040節點的authorized_keys中。
將節點SZB-L0020040的authorized_keys復制到其他節點的/root/.ssh/下面,這樣CDH集群的所有節點之間都擁有其他節點的公鑰,所以每個節點之間都可以免密碼登錄。
具體實戰操作步驟說明如下。
(1)CDH集群的所有節點都執行如下Linux命令:
ssh-keygen -t rsa
(2)將所有節點(除了SZB-L0020040節點)生成的id_rsa.pub復制到某一個節點(SZB-L0020040)并重命名:
[root@SZB-L0020041 .ssh]# scp ~/.ssh/id_rsa.pub SZB-L0020040:/root/.ssh/id_rsa_41.pub
[root@SZB-L0020042 .ssh]# scp ~/.ssh/id_rsa.pub SZB-L0020040:/root/.ssh/id_rsa_42.pub
[root@SZB-L0020043 .ssh]# scp ~/.ssh/id_rsa.pub SZB-L0020040:/root/.ssh/id_rsa_43.pub
(3)將(2)復制過來的每個節點的id_rsa.pub內容都追加到SZB-L0020040節點的authorized_keys文件中,具體Linux命令如下:
[root@SZB-L0020040 .ssh]# cat id_rsa_41.pub >> authorized_keys
[root@SZB-L0020040 .ssh]# cat id_rsa_42.pub >> authorized_keys
[root@SZB-L0020040 .ssh]# cat id_rsa_43.pub >> authorized_keys
(4)將SZB-L0023776節點的authorized_keys復制到所有節點:
[root@SZB-L0020040 .ssh]# scp authorized_keys SZB-L0020041:/root/.ssh/
[root@SZB-L0020040 .ssh]# scp authorized_keys SZB-L0020042:/root/.ssh/
[root@SZB-L0020040 .ssh]# scp authorized_keys SZB-L0020043:/root/.ssh/
到此所有節點都可以免密碼相互登錄了。
2. 第二種(假如是在root用戶下面創建信任關系)
我們使用ssh-copy-id命令,將本節點的公鑰自動復制到指定的節點的authorized_keys文件中,省去了自己手工復制公鑰的過程了。
具體的操作如下:
(1)在CDH集群的每一個節點執行如下命令:
ssh-keygen -t rsa
一路回車,生成無密碼的密鑰對。
(2)如果從SZB-L0020040節點免密碼登錄到SZB-L0020041節點,則執行如下命令:
[root@SZB-L0020040 .ssh]# ssh-copy-id SZB-L0020041
這個命令執行后會提示輸入SZB-L0020041的root用戶密碼。
如果從SZB-L0020041節點免密碼登錄到SZB-L0020040節點,則執行如下命令:
[root@SZB-L0020041 .ssh]# ssh-copy-id SZB-L0020040
這個命令執行后會提示輸入SZB-L0020040的root用戶密碼。
(3)測試
從SZB-L0020040登錄到SZB-L0020041:
[root@SZB-L0020040 ~]# ssh SZB-L0020041
[root@SZB-L0020041 ~]#
從SZB-L0020041登錄到SZB-L0020040:
[root@SZB-L0020041 ~]# ssh SZB-L0020040
[root@SZB-L0020040~]#
(4)其他節點采用上面的步驟進行操作,這里就省略掉了。
3. 安裝Oracle的Java(所有節點)
CentOS一般默認自帶OpenJDK,不過運行CDH5需要使用Oracle的JDK,需要Java 7的支持。
卸載自帶的OpenJdk,使用rpm -qa | grep java查詢java相關的包,使用rpm -e --nodeps 包名卸載。示例如下(顯示openjdk版本有可能不一樣):
# rpm -qa | grep java
java-1.6.0-openjdk-1.6.0.0-1.21.b17.el6.x86_64
# rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.21.b17.el6.x86_64
我們可以去Oracle的官網下載JDK,這里我是直接從Cloudera上面獲取,下載地址為:
archive.cloudera.com/cm5/redhat/6/x86_64/cm/5.7.0/RPMS/x86_64/oracle-j2sdk1.7-1.7.0 update67-1.x86_64.rpm
執行安裝操作:
# rpm -ivh oracle-j2sdk1.7-1.7.0 update67-1.x86_64.rpm
安裝后的目錄如下:
# cd /usr/java/
# ls
jdk1.7.0_67-cloudera
創建軟鏈接:
# ln -s jdk1.7.0_67-cloudera latest
# ln -s /usr/java/latest default
再次查看:
# ls -l
lrwxrwxrwx 1 root root 16 Apr 7 09:34 default -> /usr/java/latest
drwxr-xr-x 8 root root 4096 Apr 8 11:09 jdk1.7.0_67-cloudera
lrwxrwxrwx 1 root root 30 Apr 7 09:34 latest -> /usr/java/jdk1.7.0_67-cloudera
配置Java的環境變量,添加如下內容到/etc/profile文件的末尾:
export JAVA_HOME=/usr/java/default
export PATH=$JAVA_HOME/bin/:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
查看目前系統的JDK版本號:
# java -version
java version "1.7.0_67"
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)
4. 安裝配置MySQL(SZB-L0020040,SZB-L0020041)
SZB-L0020040存儲CM監控等元數據,SZB-L0020041存儲Hive元數據。
這里只演示在SZB-L0020041部署MySQL數據庫的步驟,SZB-L0020040同理。
(1)從Oracle官網上下載MySQL的安裝包放到/usr/local目錄下,解壓縮和創建日志目錄。
MySQL的安裝目錄根據實際情況,決定部署在什么地方。
# pwd
/usr/local
解壓縮:
# tar -zxvf mysql-advanced-5.6.21-linux-glibc2.5-x86_64.tar.gz
設置軟鏈接:
# ln -s mysql-advanced-5.6.21-linux-glibc2.5-x86_64 mysql
創建日志目錄:
#cd mysql
# mkdir logs
(2)生成my.cnf配置文件。
# cp mysql/support-files/my-default.cnf /etc/my.cnf
配置my.cnf內容為:
[mysqld]
transaction-isolation = READ-COMMITTED
# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links = 0
key_buffer_size = 32M
max_allowed_packet = 32M
thread_stack = 256K
thread_cache_size = 64
query_cache_limit = 8M
query_cache_size = 64M
query_cache_type = 1
max_connections = 550
#expire_logs_days = 10
#max_binlog_size = 100M
#log_bin should be on a disk with enough free space. Replace '/var/lib/mysql/mysql_binary_log' with an appropriate path for your system
#and chown the specified folder to the mysql user.
log_bin=/usr/local/mysql/logs/mysql_binary_log
# For MySQL version 5.1.8 or later. Comment out binlog_format for older versions.
binlog_format = mixed
read_buffer_size = 2M
read_rnd_buffer_size = 16M
sort_buffer_size = 8M
join_buffer_size = 8M
# InnoDB settings
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 64M
innodb_buffer_pool_size = 4G
innodb_thread_concurrency = 8
innodb_flush_method = O_DIRECT
innodb_log_file_size = 512M
explicit_defaults_for_timestamp
[mysqld_safe]
log-error=/usr/local/mysql/logs/mysqld.log
pid-file=/usr/local/mysql/data/mysqld.pid
sql_mode=STRICT_ALL_TABLES
(3)正式創建數據庫。
# pwd
/usr/local/mysql
# scripts/mysql_install_db --user=root
(4)修改/etc/profile文件,添加MySQL環境變量。
export MYSQL_HOME=/usr/local/mysql
export PATH=$MYSQL_HOME/bin:$PATH
使環境變量生效:
# source /etc/profile
(5)啟動數據庫。
mysqld_safe --user=root &
(6)修改MySQL數據庫的root密碼。
# mysqladmin -u root password 'xxxxxx'
# mysqladmin -u root -h SZB-L0020041 password 'xxxxxx'
(7)刪除test 數據庫和匿名用戶等,尤其對于生產環境更要操作。
# mysql_secure_installation