9

开源分布式支持超大规模数据分析型数据仓库Apache Kylin实践-上 - itxiaoshen

 1 year ago
source link: https://www.cnblogs.com/itxiaoshen/p/17107517.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

开源分布式支持超大规模数据分析型数据仓库Apache Kylin实践-上

Apache Kylin 官网中文地址 https://kylin.apache.org/cn/

Apache Kylin 官网中文最新文档 https://kylin.apache.org/cn/docs/

Apache Kylin 源码地址 https://github.com/apache/kylin

Apache Kylin™是一个开源的、分布式的分析型数据仓库,提供Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由 eBay 公司中国团队开发并贡献给Apache,使用神兽麒麟命名,查询速度快能在亚秒内响应。最新版本为v4.0.3

Apache Kylin4.0 是一个重大改革版本,其中4.0之前采用HBase 作为存储引擎来保存 cube 构建后产生的预计算结果,构建引擎为MR,下推引擎采用的是HIVE JDBC;4.0之后采用了全新的 Spark 构建引擎和 Parquet 作为存储,同时使用 Spark 作为查询引擎。版本功能详细对比如下:

image-20230206110856191

使用 Apache Parquet + Spark 来代替 HBase 使用理由如下:

  • HBase 作为 HDFS 之上面向列族的数据库,查询表现已经算是比较优秀,但是它仍然存在以下几个缺点:
    • HBase 不是真正的列式存储;
    • HBase 没有二级索引,Rowkey 是它唯一的索引;
    • HBase 没有对存储的数据进行编码,kylin 必须自己进行对数据编码的过程;
    • HBase 不适合云上部署和自动伸缩;
    • HBase 不同版本之间的 API 版本不同,存在兼容性问题(比如,0.98,1.0,1.1,2.0);
    • HBase 存在不同的供应商版本,他们之间有兼容性问题。
  • Parquet针对上面问题有如下特点
    • Parquet 是一种开源并且已经成熟稳定的列式存储格式;
    • Parquet 对云更加友好,可以兼容各种文件系统,包括 HDFS、S3、Azure Blob store、Ali OSS 等;
    • Parquet 可以很好地与 Hadoop、Hive、Spark、Impala 等集成;
    • Parquet 支持自定义索引。
  • 可扩展超快的基于大数据的分析型数据仓库:为减少在 Hadoop/Spark 上百亿规模数据查询延迟而设计。
  • 交互式查询能力:对 Hadoop 数据实现亚秒级交互响应,在同等的数据规模比 Hive 性能更好。
  • 实时 OLAP:在数据产生时进行实时处理,可在秒级延迟下进行实时数据的多维分析。
  • Hadoop ANSI SQL 接口:作为一个分析型数据仓库(也是 OLAP 引擎),为 Hadoop 提供标准 SQL 支持大部分查询功能。
  • 多维立方体(MOLAP Cube):能够在百亿以上数据集定义数据模型并构建立方体。
  • 与BI工具无缝整合:提供与 BI 工具的整合能力,如Tableau,PowerBI/Excel,MSTR,QlikSense,Hue 和 SuperSet。
  • 其他特性
    • Job管理与监控
    • 压缩与编码
    • 利用HBase Coprocessor
    • 基于HyperLogLog的Dinstinc Count近似算法
    • 友好的web界面以管理,监控和使用立方体
    • 项目及表级别的访问控制安全
    • 支持LDAP、SSO
  • 数据仓库是一个各种数据(包括历史数据、当前数据)的中心存储系统,是BI(business intelligence,商业智能)的核心部件。例如数据包含来自企业各个业务系统的订单、交易、客户、采购、库存、供应商、竞争对手数据。

  • 商业智能通常被理解为将企业中现有的数据转化为知识,帮助企业做出明智的业务经营决策的工具。为了将数据转化为知识,需要利用到数据仓库、联机分析(OLAP)工具和数据挖掘等技术。

  • OLAP是一种软件技术,它使分析人员能够迅速、一致、交互地从各个方面、各个维度观察信息,以达到深入理解数据的目的,OLAP也称为多维分析。

    image-20230206134605903
    • ROLAP(Relational OLAP):基于关系型数据库,不需要预计算。
    • MOLAP(Multidimensional OLAP):基于多维数据集,需要预计算。
  • 星型模型:由一个或多个引用任意数量维表的事实表组成。

  • 事实表:由业务流程的测量、度量或事实组成。

  • 查找表:是一个数组,它用一个更简单的数组索引操作代替运行时计算。

  • 维度:是一种对事实和度量进行分类的结构,以便使用户能够回答业务问题。常用的维度有人物、产品、地点和时间。

  • 度量:是可以进行计算(例如总和、计数、平均、最小值、最大值)的属性。

  • 连接:一个SQL连接子句组合来自关系数据库中两个或多个表的记录。

  • OLAP Cube:OLAP多维数据集是用0维或多维来理解的数据数组;一个多维的数据集称为一个OLAP Cube.给定一个数据模型,我们可以对其上的所有维度进行聚合,对于 N 个维度来说,组合的所有可能性共有 2^n-1种。对于每一种维度的组合,将度量值做聚合计算,然后将结果保存 为一个物化视图,称为 Cuboid。所有维度组合的 Cuboid 作为一个整体,称为 Cube。简单点来讲:就是每一种维度的组合都叫一个Cuboid, 所有的维度的组合就叫做Cube。

    image-20230206135522111
    • Table:这是将蜂窝表定义为多维数据集的源,必须在构建多维数据集之前同步。
    • Data Model:描述了一个STAR SCHEMA数据模型,它定义了事实/查找表和筛选条件。
    • Cube Descriptor:它描述了多维数据集实例的定义和设置,定义使用哪个数据模型,拥有什么维度和度量,如何划分到段以及如何处理自动合并等。
    • Cube Instance:一个多维数据集实例,由一个多维数据集描述符构建,根据分区设置由一个或多个多维数据集段组成。
    • Partition:用户可以在多维数据集描述符上定义DATE/STRING列作为分区列,将一个多维数据集划分为具有不同日期周期的几个段。
    • Cube Segment:Cube数据的实际载体。一个构建作业为多维数据集实例创建一个新段。一旦数据在指定的数据周期内发生变化,可以对相关的数据段进行刷新,从而避免重新构建整个多维数据集。
    • Aggregation Group:每个聚合组是维度的子集,并在其中组合构建长方体。它的目标是修剪优化。
  • 维度与度量

    • Mandotary:此维度类型用于长方体修剪,如果一个维度被指定为“强制”,那么那些没有该维度的组合将被修剪。
    • Hierarchy:其维度类型用于长方体修剪,如果维度A、B、C形成“层次”关系,则只保留与A、AB或ABC的组合。
    • Derived :在查找表中,可以从它的PK生成一些维度,因此它们与事实表中的FK之间存在特定的映射。所以这些维度是衍生的,不参与长方体的生成。
    • Count Distinct(HyperLogLog) :针对Immediate COUNT DISTINCT难以计算的问题,引入了一种近似算法HyperLogLog,使错误率保持在较低的水平。
    • Count Distinct(Precise) - Precise Count Distinct将基于RoaringBitmap预计算,目前只支持int或bigint。
    • Top N:例如使用这种测量类型,用户可以很容易地获得指定的顶级卖家/买家数量等。
  • Cube Actions

    • BUILD:给定分区列的间隔,此操作是构建一个新的多维数据集段。
    • REFRESH:此操作将在某个分区期间重建多维数据集段,用于源表增加的情况。
    • MERGE:这个动作将多个连续的立方体片段合并为一个。这可以通过多维数据集描述符中的自动合并设置来实现。
    • PURGE*:清除-清除多维数据集实例下的段。这只会更新元数据,不会从HBase中删除多维数据集数据。
  • Job Status

    • NEW:这表示刚刚创建了一个作业。
    • PENDING:这表示一个作业被作业调度器暂停并等待资源。
    • RUNNING:这表示一个作业正在进行中。
    • FINISHED:这表示一项工作已成功完成。
    • ERROR:这表示一个作业因错误而中止。
    • DISCARDED:这表示一个作业被最终用户取消了。
  • Job Action

    • RESUME -一旦作业处于ERROR状态,该操作将尝试从最近的成功点恢复它。
    • DISCARD -无论作业的状态如何,用户都可以通过DISCARD动作结束作业并释放资源。

架构和组件

Kylin 提供与多种数据可视化工具的整合能力,如 Tableau、PowerBI 等,很方便使用 BI 工具对 Hadoop 数据进行分析。

image-20230203162825752
  • REST Server:是面向应用程序开发的入口点,此类应用程序可以提供查询、获取结果、触发Cube构建任务、获取元数据及用户权限等,还可以通过Restful接口实现SQL查询。
  • Query Engine(查询引擎):当 cube 准备就绪后,查询引擎就能够获取并解析用户查询。随后会与系统中的其它组件进行交互,从而向用户返回对应的结果。4.0版本采用Spark作为查询引擎。
  • Routing(路由器):在最初设计时曾考虑过将 Kylin 不能执行的查询引导去 Hive 中继续执行,但在实践后 发现 Hive 与 Kylin 的速度差异过大,导致用户无法对查询的速度有一致的期望,很可能大 多数查询几秒内就返回结果了,而有些查询则要等几分钟到几十分钟,因此体验非常糟糕。 最后这个路由功能在发行版中默认关闭。
  • Metadata(元数据管理工具):Kylin 是一款元数据驱动型应用程序。元数据管理工具是一大关键性组件,用于对保存 在 Kylin 当中的所有元数据进行管理,其中包括最为重要的 cube 元数据。其它全部组件的 正常运作都需以元数据管理工具为基础。 Kylin 4.0的元数据存储在 MySQL 中。
  • Build Engine(构建引擎):Kylin4.0的构建引擎从MR改为Spark,使用户能否快速得到想要的Cube数据,构建引擎最终得到的数据存放在Parquet文件中,然后Spark更够更好读取Parquet文件数据。
  • Kylin 核心:Kylin 基础框架,包括元数据(Metadata)引擎,查询引擎,Job引擎及存储引擎等,同时包括REST服务器以响应客户端请求。
  • 扩展:支持额外功能和特性的插件。
  • 整合:与调度系统,ETL,监控等生命周期管理系统的整合。
  • 用户界面:在Kylin核心之上扩展的第三方用户界面。
  • 驱动:ODBC 和 JDBC 驱动以支持不同的工具和产品,比如Tableau。

Docker部署

为了让用户轻松试用麒麟,并方便开发人员在修改源代码后进行验证和调试。可以通过麒麟的docker镜像快速部署。该镜像包含麒麟所依赖的每个服务:

  • JDK 1.8
  • Hadoop 2.8.5
  • Hive 1.2.1
  • Spark 2.4.7
  • Kafka 1.1.1
  • MySQL 5.1.73
  • Zookeeper 3.4.6
# 拉取镜像,dcoker hub上已有kylin 5.0.0版本镜像,二进制未更新
docker pull apachekylin/apache-kylin-standalone:5.0.0
# 运行容器
docker run -d \
-m 8G \
-p 7070:7070 \
-p 8088:8088 \
-p 50070:50070 \
-p 8032:8032 \
-p 8042:8042 \
-p 2181:2181 \
apachekylin/apache-kylin-standalone:5.0.0

以下服务在容器启动时自动启动:NameNode、 DataNode、ResourceManager、NodeManager、Kylin,相关web UI地址如下:

基于hadoop环境安装

  • HDFS,YARN,MapReduce,Hive,Zookeeper 等服务的 Hadoop 集群;建议单独部署在Hadoop client 节点上,该节点上 Hive,HDFS 等命令行已安装好;运行 Kylin 的 Linux 账户要有访问 Hadoop 集群的权限,包括创建/写入 HDFS 文件夹,Hive 表的权限。
  • 硬件要求:运行 Kylin 的服务器建议最低配置为 4 core CPU,16 GB 内存和 100 GB 磁盘。
  • 操作系统要求:Linux only、CentOS 6.5+ 或Ubuntu 16.0.4+。
  • 安装环境软件要求
    • Hadoop: cdh5.x, cdh6.x, hdp2.x, EMR5.x, EMR6.x, HDI4.x
    • Hive: 0.13 - 1.2.1+
    • Spark: 2.4.7/3.1.1
    • Mysql: 5.1.7 及以上
    • JDK: 1.8+
  • 下载解压文件
# 下载最新版本v4.0.3 for Apache Spark 3.1.x
wget https://dlcdn.apache.org/kylin/apache-kylin-4.0.3/apache-kylin-4.0.3-bin-spark3.tar.gz
# 解压文件
tar -zxvf  apache-kylin-4.0.3-bin-spark3.tar.gz
# 进入kylin根目录
cd apache-kylin-4.0.3-bin-spark3
# 根目录结构说明如下
bin:启动/停止Kylin服务、备份/恢复元数据的shell脚本,以及一些实用脚本。
conf: XML配置文件,这些xml文件的功能可以在配置页面中找到。
lib:对外使用的Kylin jar文件,如Hadoop作业jar、JDBC驱动程序、HBase协处理器jar等。
meta_backups:执行" bin/metastore.sh backup "命令时的默认备份文件夹;
sample_cube:用于创建样例多维数据集及其表的文件。
spark: spark由$KYLIN_HOME/bin/download.sh下载。
tomcat:运行Kylin应用程序的tomcat web服务器。
tool:命令行工具的jar文件。
# 配置麒麟环境变量
vim /etc/profile
export KYLIN_HOME=/home/commons/apache-kylin-4.0.3-bin-spark3
# 执行环境变量生效
source /etc/profile
  • 下载和配置Spark。
# 前面用apache-kylin-4.0.3-bin-spark3使用spark3需要下载spark-3.1.1版本
wget https://archive.apache.org/dist/spark/spark-3.1.1/spark-3.1.1-bin-hadoop3.2.tgz
# 解压
tar -xvf spark-3.1.1-bin-hadoop3.2.tgz
# 进入目录
mv spark-3.1.1-bin-hadoop3.2 spark-yarn
# 由于需要用到yarn作为资源管理器,配置spark使用yarn的资源
vim conf/spark-env.sh
YARN_CONF_DIR=/home/commons/hadoop/etc/hadoop

并将MySQL连接驱动拷贝到spark的jars目录下,让spark能够正常连接MySQL。

image-20230207142226382

将可使用的hive-site.xml拷贝到spark的conf目录,用于spark操作hive的元数据等。

image-20230209134230490

将上面spark-yarn目录分发到所有的yarn的node manager上,并且修改所有node manager的spark环境变量

vim /etc/profile
export SPARK_HOME=/home/commons/spark-yarn
export PATH=$SPARK_HOME/bin:$PATH
# 执行环境变量生效
source /etc/profile
  • 配置MySQL元数据

    • 创建数据库及用户
    -- 创建一个kylin数据库
    CREATE DATABASE kylin DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
    -- 创建一个kylin用户
    CREATE USER 'kylin'@'%' IDENTIFIED BY 'kylin';
    -- 向用户授予刚刚创建的数据库的所有权限
    GRANT ALL PRIVILEGES ON kylin.* TO kylin@'%' WITH GRANT OPTION;
    ALTER USER 'kylin'@'%' IDENTIFIED WITH mysql_native_password BY 'kylin';
    FLUSH PRIVILEGES;
    
    • 下载MySQL JDBC驱动程序(MySQL -connector-java-.jar),这里使用MySQL8,驱动程序mysql-connector-java-8.0.28.jar,并将其放在$KYLIN_HOME/ext/目录下,先 mkdir ext创建ext文件夹

    image-20230207093113906

    • 如果需要加密数据库用户密码,可使用kylin自带工具加密mysql密码,并在kylin.metadata.url中增加passwordEncrypted=true
    java -classpath kylin-server-base-4.0.3.jar\
    :kylin-core-common-4.0.3.jar\
    :spring-beans-5.2.22.RELEASE.jar\
    :spring-core-5.2.22.RELEASE.jar\
    :commons-codec-1.6.jar \
    org.apache.kylin.rest.security.PasswordPlaceholderConfigurer \
    AES kylin
    
  • 修改kylin的配置文件,vim conf/kylin.properties

kylin.metadata.url=kylin_metadata@jdbc,url=jdbc:mysql://mysqlserver:3306/kylin,username=kylin,password=kylin,maxActive=10,maxIdle=10,driverClassName=com.mysql.cj.jdbc.Driver
# HDFS工作空间
kylin.env.hdfs-working-dir=/kylin
# kylin在zookeeper的工作目录
kylin.env.zookeeper-base-path=/kylin
# 不使用kylin自带的zookeeper
kylin.env.zookeeper-is-local=false
# 外部zookeeper连接字符串配置
Kylin.env.zookeeper-connect-string=zk1:2181,zk2:2181,zk3:2181
# SPARK BUILD ENGINE CONFIGS,hadoop conf目录位置
kylin.env.hadoop-conf-dir=/home/commons/hadoop/etc/hadoop
  • 环境检查,Kylin运行在Hadoop集群上,对各个组件的版本、访问权限和CLASSPATH有一定的要求。
# 为了避免遇到各种环境问题,可以运行$KYLIN_HOME/bin/check-env.sh脚本进行环境检查,查看是否存在问题。如果识别出任何错误,脚本将打印出详细的错误消息。如果没有错误消息,说明您的环境适合Kylin操作。
$KYLIN_HOME/bin/check-env.sh
image-20230206170816236
  • 由于hadoop和hive依赖冲突报类找不到
image-20230209092143687
  • 将commons-configuration-1.6.jar上传到$KYLIN_HOME/tomcat/webapps/kylin/WEB-INF/lib/下。

image-20230207141055236

  • 启动Kylin
# 启动
$KYLIN_HOME/bin/kylin.sh start
# 麒麟启动的默认端口为7070。可以使用$KYLIN_HOME/bin/kylin-port-replace-util.sh set number修改端口。修改后的端口号为“7070 +编号”。
$KYLIN_HOME/bin/kylin-port-replace-util.sh set number 1
# 停止
$KYLIN_HOME/bin/kylin.sh start
# 重启
$KYLIN_HOME/bin/kylin.sh restart
image-20230207140514960
# 可以查看运行日志
tail -f logs/kylin.log
image-20230207140309909
image-20230207103522261

Apache Kylin™ 令使用者仅需三步就可实现超大数据集上的亚秒级查询。

  • 定义数据集上的一个星型或雪花模型。
  • 在定义的数据表上构建cube。
  • 使用标准 SQL 通过 ODBC、JDBC 或 RESTFUL API 进行查询,仅需亚秒级响应时间即可获得查询结果。

官方样例Cube说明

# 使用Kylin安装目录下示例快速体验Kylin,先执行一个脚本来创建一个示例多维数据集
$KYLIN_HOME/bin/sample.sh

执行脚本完成后,查看hive default默认数据库下已经有相应的

image-20230207143058169

通过kylin的WebUI click System -> Configuration -> Reload Metadata 加载元数据信息

image-20230207104429590

重新加载元数据后,可以在左上角的project中看到一个名为learn_kylin的项目,这个项目包含一个批处理多维数据集kylin_sales_cube和一个流数据集kylin_streaming_cube。

image-20230207104839476

可以直接构建kylin_sales_cube,并且可以在构建完成后查询它。

image-20230207142715284

准备演示数据

  • hive中创建kylin数据库,并创建dept部门表和emp员工表
create database kylin;
use kylin;
create external table if not exists dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by '\t';

create external table if not exists emp(
empno int,
ename string,
job string,
mgr int,
hiredate string, 
sal double, 
comm double,
deptno int)
row format delimited fields terminated by '\t';
  • 制作示例数据
mkdir tmpdata
# 制作部门表(dept.txt)数据
vim tmpdata/dept.txt
100	ACCOUNTING	1700
200	RESEARCH	1800
300	SALES	1900
400	OPERATIONS	1700
# 制作员工表(emp.txt)数据
vim tmpdata/emp.txt
1336	SMITH	CLERK	1869	2016-01-03	2800.0	1000.0	200
1466	ALLEN	SALESMAN	1665	2016-03-08	5600.0	1500.0	300
1488	WARD	SALESMAN	1665	2016-03-10	4375.0	2500.0	300
1533	JONES	MANAGER	1806	2016-04-18	10412.5	6000.0	200
1621	MARTIN	SALESMAN	1665	2016-10-14	4375.0	7000.0	300
1665	BLAKE	MANAGER	1806	2016-05-17	9975.0	4000.0	300
1749	CLARK	MANAGER	1806	2016-06-25	8575.0	3500.0	100
1755	SCOTT	ANALYST	1533	2022-05-05	10500.0	6800.0	200
1806	KING	PRESIDENT	NULL	2016-12-03	17500.0	20000.0	100
1811	TURNER	SALESMAN	1665	2016-09-24	5250.0	3000.0	300
1843	ADAMS	CLERK	1755	2022-06-08	3850.0	2500.0	200
1867	JAMES	CLERK	1665	2016-12-19	3325.0	2400.0	300
1869	FORD	ANALYST	1533	2016-12-19	10500.0	8000.0	200
1901	MILLER	CLERK	1749	2017-02-08	4550.0	3200.0	100
  • 加载示例数据到hive相应表中
load data local inpath '/home/commons/apache-kylin-4.0.3-bin-spark3/tmpdata/dept.txt' into table dept;
load data local inpath '/home/commons/apache-kylin-4.0.3-bin-spark3/tmpdata/emp.txt' into table emp;

点击左上角的+来创建一个Project,输出项目名称和描述点击提交按钮

image-20230207105150988

选择数据源

  • 选择加载数据源方式,选择第二个可以从hive中加载数据,第三个可以从 csv 文件加载数据。

image-20230208142251323

  • 同步要作为数据源的表,上面点击后第一次需要加载元数据会有点慢,加载过后续就快了
image-20230208142415229
image-20230208142658177

创建Model

在Models页面的左边点击New按钮后点击New Model,填写Model名称及描述后Next

image-20230208150209297

选择员工作为Fact Table事实表,添加部门作为Lookup Table维度表

image-20230208162555712
image-20230208162707304

选择维度信息

image-20230208151641750

选择度量信息

image-20230208151752879

添加分区信息(这里没有做分区表)及过滤条件这里我们暂时不填写保持默认,点击“Save”并确认保存模型。

创建Cube

在Models页面的左边点击New按钮后点击New Cube,选择员工Model及填写Cube Name,点击next

image-20230208152307634

添加真正维度字段,(将来会影响 Cuboid 的个数,并且只能从 model 维度字段里面选择),点击ok并点击下一步

image-20230208165126691
image-20230208165155179

添加真正度量值字段(将来预计算的字段值,只能从 model 度量值里面选择),点击度量添加按钮“+ Measure”,填写信息并点击ok,并选择next

image-20230208153747247
image-20230208153901365

接着刷新设置、高级设置、配置覆盖都先保持默认的,最后查看概览点击save按钮并确定保存

image-20230208165325552

Cube构建

在上面创建的cube上点击build构建action动作,并确认开始构建

image-20230208154551460

查看当前正在构建的情况

image-20230209134925839

等待一会后构建完成

image-20230209134953928

与Hive查询对比

在Insight洞察页面新查询框中输入sql语句

select dept.dname,sum(emp.sal) from emp join dept on emp.deptno = dept.deptno group by dept.dname;
image-20230209135136872

第一次之后的查询都是秒级响应

image-20230209135320896

相比下面在hive中执行查询快了非常多

image-20230209140028790

可以针对查询结果点击Grid按钮实现图形可视化,选择图标类型、维度和度量信息展示,还可以选择导出csv文件结果

image-20230209135545681
  • 本人博客网站IT小神 www.itxiaoshen.com

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK