Apache Kylin快速入门:用预计算加速大数据OLAP查询

发布时间:2026/10/16 11:42:52
Apache Kylin快速入门:用预计算加速大数据OLAP查询
如果你做数据分析平台大概率遇到过这种场景底层表小几个亿行业务方要按几十个维度组合出报表一条 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。举个例子。假设你的模型里只有两个维度时间和品类度量是销售额。那么理论上会有四种聚合结果只按时间汇总、只按品类汇总、按时间和品类汇总、什么都不分的全局汇总。真实场景会有十几个维度候选组合数量非常庞大所以建模时要做裁剪而不是真的把所有组合全部生成。查询的时候你写一条 SQLKylin 的查询引擎会解析它判断这条 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 查询、有正常的 HBaseZookeeper 状态健康。没有这套基础环境Kylin 装得再顺利也是空壳。2.2 版本选择与硬件环境建议我接触过的项目里用得最久的是 3.x 系列。4.x 对构建引擎做了不少升级也把存储层做成了可插拔但整体架构没有跳出“预计算 HBase”这套思路。这篇以 3.x 为例说明你拿 4.x 来对照时个别配置项名称有差异但部署流程基本一致。环境方面入门阶段最好找一台 Linux 虚拟机或云主机4 核 8G 起步建议 16G。Kylin 本身不重但它依赖的 HBase、Hive、Hadoop 三个进程都非常吃内存。我见过有人用 4G 内存的机器强行跑全套结果 YARN 的 NodeManager 一启动系统就开始疯狂 swapKylin 构建任务也被 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 带下划线的机器上启动过 KylinHBase 集群一直报错折腾了半天才发现是主机名的问题。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 写进 ~/.bashrcexport 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 页面执行 SQLselect sum(price) from kylin_sales group by part_dt如果返回结果是秒级甚至毫秒级说明整条链路已经通了。这时候你会直观感受到这不是在扫几十亿行明细而是在读一份提前算好的结果。4. 部署之后最容易踩的坑现象、原因与排查4.1 Web 页面打不开、404 或一直加载中现象服务日志显示起来了但浏览器访问 7070 总是转圈或 404。排查顺序如下先执行curl -I http://hostname:7070/kylin看本机是否正常。如果本机正常、浏览器不行优先检查防火墙。如果 curl 都不行执行ss -lntp | grep 7070看端口有没有监听。没监听说明 Kylin 进程没起来去日志找原因。检查 /etc/hosts。Kylin 对 hostname 敏感主机名没解析到 IP会导致各种诡异问题。不要只看 kylin.log有些安全相关错误记录在 logs/security.log也留意一眼。这个问题发生频率最高但复盘下来绝大多数不是 Kylin 本身的问题而是网络、hostname、端口这一类基础项。4.2 HDFS 权限、工作目录和 HBase 连接问题现象启动时日志报类似 Permission denied或者 HBase 表创建失败。处理方法hdfs dfs -mkdir -p /kylin hdfs dfs -chown -R 你的用户 /kylinKylin 启动时会往 /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 nameyarn.nodemanager.resource.memory-mb/name value6144/value /property property nameyarn.scheduler.maximum-allocation-mb/name value4096/value /property改完重启相关服务。调参之前记住一个原则NodeManager 的总内存不能超过机器物理内存要给操作系统和其他进程留空间否则整个节点都会卡死。另外构建阶段在 YARN 上跑的任务名里通常带 kylin 字样去 ResourceManager 页面能看到对应的 Map 和 Reduce 进度比在 Kylin 界面里干等更直观。4.4 登录、时区、端口等小问题速查除了上面三个大问题还有几个小问题频率不低列成表格方便对号入座。现象原因处理登录不了不知道密码默认账号 ADMIN / 密码 KYLIN登录后强制改密不要跳过报表时间差 8 小时服务器时区不是东八区在启动脚本中显式设置 TZAsia/Shanghai或修改系统时区外网访问不了防火墙拦截 7070放行 7070或者内网访问重启后状态异常上次没有优雅停止用 bin/kylin.sh stop 停止不要直接 kill 进程这些都是入门期最容易遇到的琐碎问题往往一句话点破就不算事但不知道的话会卡很久。5. 跑通环境之后下一步该怎么进阶5.1 从“能跑”到“用得好”建模、增量与查询优化部署通过只是入门第一步真正值钱的部分在后面。第一是 Cube 建模。维度和度量怎么选、哪些维度组合值得保留、哪些组合会造成严重膨胀都需要结合业务判断。我第一次建 Cube 时基本没做裁剪十几个维度全上结果 Cube 膨胀率跑到一百多倍构建时间翻了几番查询是快了但存储压力完全扛不住。后来用聚合组、强制维度和层级维度做裁剪膨胀率压到 5 倍以内查询性能几乎没有损失。第二是增量构建。业务数据每天都在涨全量构建成本太高。合理使用分区列和增量构建才能让 Cube 长期可用。第三是查询优化。同样的 SQLKylin 能不能命中 Cuboid、要不要做查询下推、怎么避免对每一个新查询都重新建模这些都有讲究。这些话题不是一篇入门文章能装下的但到了这个阶段你已经可以开始看了。5.2 一份务实的学习路径建议我给新手朋友的路径是先把这篇的部署流程完整走一遍跑通样例数据然后去看样例 Cube 的模型定义和构建日志。构建日志虽然长但你从头翻一遍能看到原始数据怎么被读取、中间结果怎么落盘、预计算结果怎么写到 HBase很多抽象概念会一下子具体起来。之后再去琢磨维度裁剪、增量构建和查询接口进度会快很多。这个系列后续也会按这个路径来写第二篇重点拆 Cube 建模。部署 Kylin 这件事如果只看安装命令十几分钟就能完成但真正考验人的是对环境底座的理解。我实际部署过不止一次每一次遇到问题最后都会回到同一个结论Kylin 的部署问题十有八九出在它脚下的 Hadoop、Hive、HBase 身上。所以这也是为什么我一开始就说别急着下载安装包先把环境清单过一遍把 check-env.sh 当成你最好的朋友。环境通了样例数据一跑你的 Kylin 之旅才算真正开始。下一步的 Cube 建模才是真正决定这个引擎能不能发挥威力的关键。