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