☰
Apache Kylin快速入门:用预计算加速大数据OLAP查询
2026/10/16 11:42:48 网站建设 项目流程

如果你做数据分析平台,大概率遇到过这种场景:底层表小几个亿行,业务方要按几十个维度组合出报表,一条 group by 的 SQL 扔到 Hive 上要跑十来分钟,报表工具等不起,业务骂街。这时候有人会提 Apache Kylin。Kylin 是个开源的分布式 OLAP 引擎,核心思路非常朴素:把聚合结果提前算好存起来,查询时直接取现成答案。这篇是整个 Kylin 快速入门系列的第一篇,我会先聊聊 Kylin 到底解决什么问题,再带着你从零部署一套能用的环境,目标很明确:看完这篇,你能打开 Kylin 的 Web 管理页面,导入样例数据,跑通一次 Cube 构建和查询。适合刚接触大数据数仓、想给 Hadoop 生态加一个加速层的朋友,也适合那些已经在用 Hive 但被查询性能折腾得头疼的人。

1. Kylin 是什么:一个用空间换时间的 OLAP 引擎

1.1 传统大数据查询慢在哪儿

Hive 不是为高并发交互式查询设计的。它每次执行 group by,都要对底层数据做一次全表扫描,然后 shuffle、聚合,几十亿行数据一进来,跑几十分钟属于正常现象。我在某零售数据分析项目里见过一个简单按天统计销售额的报表,基础表 30 多亿行,Hive 跑一次要 25 分钟,业务根本没法用。

这个问题的本质是:Hive 适合批量处理,不适合重复、在线、低延迟的分析查询。更麻烦的是,报表场景的查询往往是“同一条 SQL,每天换参数跑很多遍”,比如按天查、按品类查、按区域查。如果每次都重新扫一遍明细,理论上可行,实际上没人受得了。

这里可以用一个生活类比喻:Hive 就像一家没有备菜的后厨,客人来了才去买菜、洗菜、切菜、下锅,味道可以,但上菜太慢。而 Kylin 的思路,是提前把所有可能被点的菜都做好,客人点完直接出餐。

传统加速手段不是没有:提高机器性能、建索引、换 MPP 数据库、上 Spark。但很多团队已经有 Hadoop 数仓,不希望把数据搬家,又想保留标准 SQL 的查询习惯,这时候 Kylin 就进入视野了。

1.2 核心思路:把聚合结果提前算好

Kylin 做的事情并不神秘:在数据准备好之后,按照你定义好的维度和度量,提前把所有维度组合的聚合结果都算一遍,存到 HBase 里。这个“所有维度组合”的结果集合,就是 Cuboid。

举个例子。假设你的模型里只有两个维度:时间和品类,度量是销售额。那么理论上会有四种聚合结果:只按时间汇总、只按品类汇总、按时间和品类汇总、什么都不分的全局汇总。真实场景会有十几个维度,候选组合数量非常庞大,所以建模时要做裁剪,而不是真的把所有组合全部生成。

查询的时候,你写一条 SQL,Kylin 的查询引擎会解析它,判断这条 SQL 想按什么维度汇总、求什么度量,然后定位到已经算好的 Cuboid,直接从 HBase 里读结果。因为存储结构是按维度预先组织好的,所以查询非常快。

这就是“空间换时间”:预计算会产生大量冗余数据,但换来了查询延迟从分钟级降到秒级甚至毫秒级。

这里有一个关键点必须提前说:查询必须能命中预计算好的模型。如果你查的维度组合在建模时没有覆盖,Kylin 会明确告诉你处理不了,而不是现场现算。很多新人第一次用 Kylin 就栽在这个地方。

1.3 它适合什么场景,又不适合什么场景

适合的场景很明确:结果集是数据仓库里的固定模型,同一套业务口径反复以不同维度组合发问,需要对接 BI 工具做看板,并且数据量大到传统方案扛不住。

不适合的场景也很清楚:

  • 需要看明细数据的临时即席查询。Kylin 里存的是聚合结果,不是明细,所以你想“拉出某天所有订单明细”,它无能为力。
  • 数据量不大的场景,比如几百万行,构建 Cube 的时间和资源可能比直接查还贵,没必要上 Kylin。
  • 业务模型三天两头改的场景。每次改模型都要重新设计、重新构建,成本不低。

我的观点是,技术选型先认清边界。Kylin 不是万能的加速器,它是为“多维度组合分析 + 高并发查询”这一类场景精心设计的专用引擎。选错场景,再好的工具也是负担。

2. 部署前必须理解的角色划分:Hadoop、Hive、HBase 各干什么

2.1 Hadoop、Hive、HBase、Zookeeper 各自扮演什么角色

Kylin 和很多独立数据库不一样,它本身不存原始数据,也不是孤零零一个进程就能跑起来。完整部署需要一套 Hadoop 生态环境。

组件在 Kylin 这条链路里干什么缺了会怎样
HDFS存储数仓原始表和 Hive 的底层文件数据无处存放
YARN承接构建 Cube 时的计算作业构建任务无法运行
Hive提供事实表和维表的 SQL 化定义,作为 Cube 构建的数据源Kylin 没有数据可读,元数据也拿不到
HBase存储 Cube 预计算结果,查询时从中点查查询结果无法保存
Zookeeper协调 HBase 及 Kylin 相关集群状态HBase 起不来,或者状态混乱

简单概括两条链路:

构建链路:Hive 读表 -> 构建引擎跑 MapReduce 或 Spark -> 产出 Cube 写到 HBase。

查询链路:Kylin 接收 SQL -> 解析并定位 Cuboid -> HBase 扫描 -> 返回结果。

所以部署 Kylin 之前,先确认你这台机器能访问 HDFS、能执行 Hive 查询、有正常的 HBase,Zookeeper 状态健康。没有这套基础环境,Kylin 装得再顺利也是空壳。

2.2 版本选择与硬件环境建议

我接触过的项目里,用得最久的是 3.x 系列。4.x 对构建引擎做了不少升级,也把存储层做成了可插拔,但整体架构没有跳出“预计算 + HBase”这套思路。这篇以 3.x 为例说明,你拿 4.x 来对照时,个别配置项名称有差异,但部署流程基本一致。

环境方面,入门阶段最好找一台 Linux 虚拟机或云主机,4 核 8G 起步,建议 16G。Kylin 本身不重,但它依赖的 HBase、Hive、Hadoop 三个进程都非常吃内存。我见过有人用 4G 内存的机器强行跑全套,结果 YARN 的 NodeManager 一启动,系统就开始疯狂 swap,Kylin 构建任务也被 Kill,排查半天才确定是资源不够。

另外,有些发行版自带整套大数据组件,用那种环境可以省掉很多手动衔接的问题,适合先把 Kylin 跑通再说。

2.3 维度、度量、Cube 等术语速览

在建 Cube 之前,界面上会冒出一堆术语:维度(Dimension)、度量(Measure)、事实表(Fact Table)、维表(Dimension Table)、星型模型(Star Schema)、Cube Segment、构建(Build)。

对应的关系其实很直接:

  • 报表里 select 之后 group by 的字段,就是维度。比如按天、按品类、按区域汇总。
  • select 里的 sum(price)、count(distinct user_id) 这些聚合字段,就是度量。
  • 记录业务事实的大表叫事实表,描述维度属性的表叫维表,事实表通过外键关联维表,这个模型结构就是星型模型。
  • Cube 是预计算结果的容器,每一次增量或全量产生的数据段叫一个 Segment。
  • 构建(Build)就是跑一次预计算任务。

第一次接触的人不用被术语吓住,先把“维度 = 分组字段,度量 = 聚合值,Cube = 提前算好的结果集合”记下来就够了。后面建模和调优再逐步深入。

3. Kylin 单机安装部署完整实操:从下载到跑通样例数据

3.1 动手之前的环境检查清单

部署这件事,90% 的问题其实出在环境而不是 Kylin 本身,所以我不建议一上来就下载安装包,先按清单过一遍:

  • 操作系统建议用 CentOS 7 这类 Linux 发行版,Windows 不推荐。Kylin 的启停脚本、依赖的 Hadoop 生态在 Windows 上有太多兼容性问题,别给自己添堵。
  • 确认 Java 8:执行java -version。Kylin 官方长期基于 JDK 8 验证,你装 JDK 11 大概率会踩坑。
  • 确认 Hadoop、Hive、HBase、Zookeeper 都已启动。至少hdfs dfs -ls /不报错,hive -e "show databases;"能返回,echo "status" | hbase shell能连上。
  • 确认 hostname 合法。Kylin 对主机名很敏感,hostname 不要带下划线,最好把当前机器的 IP 和 hostname 写进 /etc/hosts。
  • 确认内存充足。执行free -h看一下,如果剩余内存不到 4G,建议先加内存或关掉一些服务。

这些都确认了,再进下一步。不要嫌这一步麻烦,我在 hostname 带下划线的机器上启动过 Kylin,HBase 集群一直报错,折腾了半天才发现是主机名的问题。

3.2 下载解压与环境变量配置

从 Apache 官网或者维护的镜像站下载二进制包。注意要选 bin.tar.gz,不要选源码包,源码包还需要自己编译,入门阶段没必要。

tar -zxvf apache-kylin-3.1.3-bin.tar.gz -C /opt/module/ cd /opt/module mv apache-kylin-3.1.3-bin kylin

然后把 KYLIN_HOME 写进 ~/.bashrc:

export KYLIN_HOME=/opt/module/kylin export PATH=$PATH:$KYLIN_HOME/bin

写完之后执行 source ~/.bashrc,再 echo $KYLIN_HOME 确认。这里有一个细节要专门强调:别只图方便在当前 session 里 export,因为启动 Kylin 的进程会继承当前 shell 的环境变量,你关掉终端再开就没了。写到 ~/.bashrc 里,下次启动也不慌。

3.3 修改配置并运行环境检查脚本

进入 $KYLIN_HOME/conf,找到 kylin.properties。入门阶段需要改的不多,最关键的是 HDFS 工作目录。这篇以 3.x 为例,最常改的是:

kylin.env.hdfs-working-dir=/kylin kylin.env.hbase-working-dir=/kylin_hbase

/kylin 是 Kylin 在 HDFS 上保存元数据和中间结果的工作目录,必须保证启动 Kylin 的用户对它有读写权限。HBase 工作目录类似,是 Kylin 在你 HBase 里创建相关表的命名空间基础。

如果你拿不准配置项,可以先保持默认,看后面环境检查脚本的反馈再改。不同小版本的配置项略有差异,不要照搬网上一份配置就完事。

配置完之后,强烈建议先跑环境检查脚本:

$KYLIN_HOME/bin/check-env.sh

这个脚本会去探测 Java、Hadoop、Hive、HBase 这些组件,并对 Kylin 需要的环境变量做检查。输出里出现 ERROR,说明有一项没满足,必须先解决;全部 OK 再启动,能省掉很多次“为什么起不来”的困惑。

3.4 启动 Kylin 服务并验证 Web 页面

确认 check-env 通过后,执行:

$KYLIN_HOME/bin/kylin.sh start

第一次启动 Kylin 要初始化元数据,这个过程中 7070 端口可能不会立刻监听,别急着判断启动失败。正确做法是看日志:

tail -f $KYLIN_HOME/logs/kylin.log

看到类似Kylin has been started successfully的日志,才说明真正起来了。

然后访问http://<hostname>:7070/kylin。这里尽量用 hostname 访问,因为 Kylin 默认绑定主机名,你用 IP 或 localhost 可能出现连接不上的情况。不同版本行为略有不同,但用 hostname 最稳。如果页面正常,会看到登录界面,默认账号 ADMIN,默认密码 KYLIN。登录后系统会引导你重置密码,这步别跳过,改一个自己记得住的密码。

命令行也可以验证:

curl -I http://<hostname>:7070/kylin

有 HTTP 200 返回,就说明 Web 服务正常。

3.5 导入样例数据,跑通第一次 Cube 构建

部署完不能只看一个页面,我建议立刻把样例数据跑一遍。在 3.x 里直接执行:

$KYLIN_HOME/bin/sample.sh

它会往 Hive 里导入几张示例表,在 Kylin 里创建一个样例项目,并生成一个示例 Cube。不同版本入口略有差别,但套路都一样:同步示例表、创建项目、创建 Cube、构建。

接着在 Web UI 里切到对应项目,进入 Model 页面,能看到已经同步的事实表和维表;进入 Cube 页面,找到示例 Cube,点击 Build。构建任务会包装成一个 MapReduce 或 Spark 作业提交到 YARN,在 Jobs 页面能看到执行进度。

构建完成后,到 Insight 页面执行 SQL:

select sum(price) from kylin_sales group by part_dt

如果返回结果是秒级甚至毫秒级,说明整条链路已经通了。这时候你会直观感受到:这不是在扫几十亿行明细,而是在读一份提前算好的结果。

4. 部署之后最容易踩的坑:现象、原因与排查

4.1 Web 页面打不开、404 或一直加载中

现象:服务日志显示起来了,但浏览器访问 7070 总是转圈或 404。

排查顺序如下:

  1. 先执行curl -I http://<hostname>:7070/kylin看本机是否正常。如果本机正常、浏览器不行,优先检查防火墙。
  2. 如果 curl 都不行,执行ss -lntp | grep 7070看端口有没有监听。没监听说明 Kylin 进程没起来,去日志找原因。
  3. 检查 /etc/hosts。Kylin 对 hostname 敏感,主机名没解析到 IP,会导致各种诡异问题。
  4. 不要只看 kylin.log,有些安全相关错误记录在 logs/security.log,也留意一眼。

这个问题发生频率最高,但复盘下来,绝大多数不是 Kylin 本身的问题,而是网络、hostname、端口这一类基础项。

4.2 HDFS 权限、工作目录和 HBase 连接问题

现象:启动时日志报类似 Permission denied,或者 HBase 表创建失败。

处理方法:

hdfs dfs -mkdir -p /kylin hdfs dfs -chown -R <你的用户> /kylin

Kylin 启动时会往 /kylin 目录写元数据,也会在 HBase 里创建它自己的表。如果 HBase 表创建失败,优先检查 Zookeeper 是否健康、HBase Master 是否活着。

有一次我在测试环境部署,HDFS 目录没授权,Kylin 一直报 IOException,看起来像网络问题,查了半天才想起来是 HDFS 权限。后来把目录 owner 一改,重启就正常了。这类问题在日志里都会有比较明确的 IOException,关键是养成先看日志再猜原因的习惯。

4.3 Cube 构建失败:任务被 Kill 或一直卡住

现象:点击 Build 后,Jobs 页面作业失败,错误信息经常是内存不足、任务超时或者直接被 YARN Kill。

原因一大半出在资源规划上。Kylin 构建 Cube 是把一个很大的预计算任务丢给 YARN,如果集群就一台机器,默认的内存分配很可能不够。可以在 yarn-site.xml 里适当调大容器内存:

<property> <name>yarn.nodemanager.resource.memory-mb</name> <value>6144</value> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>4096</value> </property>

改完重启相关服务。调参之前记住一个原则:NodeManager 的总内存不能超过机器物理内存,要给操作系统和其他进程留空间,否则整个节点都会卡死。

另外,构建阶段在 YARN 上跑的任务名里通常带 kylin 字样,去 ResourceManager 页面能看到对应的 Map 和 Reduce 进度,比在 Kylin 界面里干等更直观。

4.4 登录、时区、端口等小问题速查

除了上面三个大问题,还有几个小问题频率不低,列成表格方便对号入座。

现象原因处理
登录不了,不知道密码默认账号 ADMIN / 密码 KYLIN登录后强制改密,不要跳过
报表时间差 8 小时服务器时区不是东八区在启动脚本中显式设置 TZ=Asia/Shanghai,或修改系统时区
外网访问不了防火墙拦截 7070放行 7070,或者内网访问
重启后状态异常上次没有优雅停止用 bin/kylin.sh stop 停止,不要直接 kill 进程

这些都是入门期最容易遇到的琐碎问题,往往一句话点破就不算事,但不知道的话会卡很久。

5. 跑通环境之后,下一步该怎么进阶

5.1 从“能跑”到“用得好”:建模、增量与查询优化

部署通过只是入门第一步,真正值钱的部分在后面。

第一是 Cube 建模。维度和度量怎么选、哪些维度组合值得保留、哪些组合会造成严重膨胀,都需要结合业务判断。我第一次建 Cube 时基本没做裁剪,十几个维度全上,结果 Cube 膨胀率跑到一百多倍,构建时间翻了几番,查询是快了,但存储压力完全扛不住。后来用聚合组、强制维度和层级维度做裁剪,膨胀率压到 5 倍以内,查询性能几乎没有损失。

第二是增量构建。业务数据每天都在涨,全量构建成本太高。合理使用分区列和增量构建,才能让 Cube 长期可用。

第三是查询优化。同样的 SQL,Kylin 能不能命中 Cuboid、要不要做查询下推、怎么避免对每一个新查询都重新建模,这些都有讲究。

这些话题不是一篇入门文章能装下的,但到了这个阶段,你已经可以开始看了。

5.2 一份务实的学习路径建议

我给新手朋友的路径是:先把这篇的部署流程完整走一遍,跑通样例数据,然后去看样例 Cube 的模型定义和构建日志。构建日志虽然长,但你从头翻一遍,能看到原始数据怎么被读取、中间结果怎么落盘、预计算结果怎么写到 HBase,很多抽象概念会一下子具体起来。

之后再去琢磨维度裁剪、增量构建和查询接口,进度会快很多。这个系列后续也会按这个路径来写,第二篇重点拆 Cube 建模。

部署 Kylin 这件事,如果只看安装命令,十几分钟就能完成;但真正考验人的是对环境底座的理解。我实际部署过不止一次,每一次遇到问题,最后都会回到同一个结论:Kylin 的部署问题,十有八九出在它脚下的 Hadoop、Hive、HBase 身上。所以这也是为什么我一开始就说,别急着下载安装包,先把环境清单过一遍,把 check-env.sh 当成你最好的朋友。环境通了,样例数据一跑,你的 Kylin 之旅才算真正开始。下一步的 Cube 建模,才是真正决定这个引擎能不能发挥威力的关键。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询