blob: 75fe768b3b3531545329866f7c06708d9f436ffd [file] [view]
---
layout: docs31-cn
title: 常见问题
categories: 开始
permalink: /cn/docs31/gettingstarted/faq.html
since: v0.6.x
---
### 如果在使用 Kylin 中遇到了问题
1. 使用搜索引擎(谷歌/百度)、[Kylin 的邮件列表的存档](http://apache-kylin.74782.x6.nabble.com/), [Kylin 的 JIRA 列表](https://issues.apache.org/jira/projects/KYLIN/issues) 来寻求解决办法。
2. 浏览 Kylin 官方网页,尤其是[文档](http://kylin.apache.org/docs31/) 和 [常见问题](http://kylin.apache.org/docs31/gettingstarted/faq.html) 页面。
3. 向社区求助,用户可以在订阅 Apache Kylin 的邮件列表之后,用个人邮箱向 Apache Kylin 邮件列表发送邮件,所有订阅了邮件列表的用户都会看到此邮件,并回复邮件以发表自己的见解。
Apache Kylin 主要有 3 个邮件列表,分别是 devuserissuesdev 列表主要讨论 Kylin 的开发及新版本发布,user 列表主要讨论用户使用过程中遇到的问题,issues 主要用于追踪 Kylin 项目管理工具(JIRA)的更新动态,订阅的方法请参考 [Apache Kylin 邮件群组](https://kylin.apache.org/cn/community/) 页面中的订阅方法。
也正因为 Apache Kylin 社区是开源社区,所有用户和 Committer 都是志愿进行贡献的,所有的讨论和求助是没有 SLAService Level Agreement)的。为了提高讨论效率、规范提问,建议用户在撰写邮件时详细描述问题的出错情况、重现过程、安装版本和 Hadoop 发行版版本等,并且最好能提供相关的出错日志。另外,因为用户的全球化,建议提问时使用英文撰写邮件内容、至少保证邮件主题使用英文。有一篇关于如何提问的[How To Ask Questions The Smart Way](http://catb.org/~esr/faqs/smart-questions.html) 文章,推荐阅读。
### Kylin 是大数据的通用 SQL 引擎吗?
不,Kylin 是一个带有 SQL 接口的 OLAP 引擎。 SQL 查询需要与预定义的 OLAP 模型匹配。
### 什么是使用 Apache Kylin 的典型场景?
如果用户有一个巨大的表 (如:超过 1 亿行) 与维表进行 JOIN,而且查询需要在仪表盘、交互式报告、BI (商务智能) 中完成,用户并发数量为几十个或者几百个,那么 Kylin 是最好的选择。
### Kylin 支持多大的数据量表? 性能怎么样?
Kylin 可以支持 TB PB 级数据集的亚秒级查询。 这已经被 eBay,美团,头条等用户验证过。 美团的案例为例(至 2018-08),973 Cube,每天 380 万个查询,原始数据 8.9 万亿,总 Cube 大小 971 TB(原始数据更大),50%查询在 <0.5 秒内完成,90 查询 <1.2秒。
### Cube 的膨胀率是多大(与原始数据相比)
Cube 的膨胀率取决于多个因素,例如维度 / 度量的数量,维度的基数,Cuboid 的数量,压缩算法等。用户可以通过多种方式优化 Cube 体积。
### 如何比较 Kylin 与其他 SQL 引擎(如 Hive,Presto,SparkSQL,Impala)
SQL 引擎以不同的方式回答查询,Kylin 不是它们的替代品,而是它们的查询加速器。很多用户将 Kylin 与其他 SQL 引擎一起使用。对于高频率查询的模式,构建 Cube 可以极大地提高性能并给集群负荷减压。
### 运行 Kylin 需要多少个 Hadoop 节点?
Kylin 可以在 Hadoop 集群上运行,从几个节点到数千个节点,取决于您拥有多少数据。 该架构可水平扩展。
因为大多数计算都是在 HadoopMapReduce / Spark / HBase)中进行的,所以通常只需要在几个节点中安装Kylin
### Cube 可以支持多少个维度?
Cube 的最大物理维度数量 (不包括衍生维度) 63,但是不推荐使用大于 30 个维度的 Cube,会引起维度灾难。
### 执行 "select \*" 报错
Cube 中只包含聚合数据,所以用户的所有查询都应该是聚合查询 (包含 "group by")。用户可以使用对所有维度分组("group by") 的查询来获取尽可能接近的详细结果,但返回结果并不是原始数据。
为了从某些 BI 工具连接 KylinKylin 会尝试回答 "select \*" 查询,但是请注意结果可能不是预期的。请确保发送到 Kylin 的每条查询都是聚合查询。
### 如何从 Cube 中查询原始数据
Cube 不是用于查询原始数据的正确选择;但是如果用户的确存在这个需求,以下是一些解决方案:
1. 将表中的主键(primiary key,简称 pk) 设置为 Cube 中的维度,然后在查询的时候使用 "group by pk"
2. 配置 Kylin 查询下压到其他 SQL 引擎如 Hive;但是请注意查询性能可能会有影响。
### 什么是超高基(UHC) 维度
UHC 代表 Ultra High Cardinality,即超高基数。基数表示维度不同值的数量。通常,维度的基数从数十到数百万。如果超过百万,我们将其称为超高基维度,例如:用户 ID,电话号码等。
Kylin 支持超高基维度,但是在 Cube 设计中额外注意超高基维度,它们可能会使 Cube 体积非常大、查询变慢。
### 如何指定用于回答查询的 Cube
请参考 Wiki 文档:[Specify cube for your query](https://cwiki.apache.org/confluence/display/KYLIN/Specify+cube+for+your+query)
### 存在用于创建项目、模型和 Cube 的 REST API 吗?
存在的,但是他们是代码内部的 API,并且会随着版本进行变化。默认情况下,Kylin 希望用户在网页上创建新的项目、模型和 Cube
### 如何定义一个雪花模型 (有两张事实表)
在雪花模型中,同样只能指定一张事实表。但是用户可以定义一张维表与另一张维表进行 JOIN 连结。
如果查询中包含两张事实表的 JOIN 连结,用户同样可以将一张事实表定义为维表,并不为这张较大的维表设置维表快照。
### Cube 存放在哪里?可以直接在 HBase 上读取 Cube 数据吗?
Cube 数据存储在 HBase 中,每个 Cube segment 都是一张 HBase 中的表;维度的值将组成行键 (Row Key);度量的值将按列序列化。为了提高存储效率,维度和度量都被编码为字节。Kylin 将在 HBase 中获取到字节后解码为原始值。
如果没有 Kylin 的元数据,HBase 表不是可读的。
### Cube 设计的最佳实践
请参考: [Design cube in Apache Kylin](https://www.slideshare.net/YangLi43/design-cube-in-apache-kylin)
### 如何加密 Cube 数据
用户可以在 HBase 端对 Cube 数据进行加密,有关内容请参考:[Transparent Encryption of Data At Rest](https://hbase.apache.org/book.html#hbase.encryption.server)
### 如何自动调度 Cube 构建
Kylin 没有内置的调度程度。您可以通过 REST API 从外部调度程度服务中触发 Cube 的定时构建,如 Linux 的命令 `crontab`Apache Airflow 等。
### Kylin 支持 Hadoop 3 和 HBase 2.0 吗?
v2.5.0 开始,Kylin 将为 Hadoop 3 HBase 2 提供二进制包。
### Cube 已经启用了,但是 Insight 页面看不到对应的表
请确认 `$KYLIN_HOME/conf/kylin.properties` 中的配置项 `kylin.server.cluster-servers` 在每个 Kylin 节点上都被正确配置,Kylin 节点通过此配置相互通知刷新缓存,请确保节点间的网络通信健康。
### 如何处理 "java.lang.NoClassDefFoundError" 报错?
Kylin 并不自带这些 Hadoop Jar 包,因为它们应该已经在 Hadoop 节点中存在。所以 Kylin 会尝试通过 `hbase classpath` `hive -e set` 找到它们,并将它们的路径加入 `HBASE_CLASSPATH` 中(Kylin 启动时会运行 `hbase` 脚本,该脚本会读取 `HBASE_CLASSPATH`)。
由于 Hadoop 的复杂性,可能会存在一些找不到 Jar 包的情况,在这种情况下,请查看并修改 `$KYLIN_HOME/bin/` 目录下的 `find-\*-dependecy.sh` `kylin.sh` 脚本来适应您的环境;或者在某些 Hadoop 的发行版中 (如 AWS EMR 5.0),`hbase` 脚本不会保留原始的 `HBASE_CLASSPATH` 值,可能会引起 "NoClassDefFoundError" 的报错。为了解决这个问题,请在 `$HBASE_HOME/bin/` 下找到 `hbase` 脚本,并在其中搜索 `HBASE_CLASSPATH`,查看它是否是如下形式:
```sh
export HBASE_CLASSPATH=$HADOOP_CONF:$HADOOP_HOME/*:$HADOOP_HOME/lib/*:$ZOOKEEPER_HOME/*:$ZOOKEEPER_HOME/lib/*
```
如果是的话,请修改它来保留原始值,如下:
```sh
export HBASE_CLASSPATH=$HADOOP_CONF:$HADOOP_HOME/*:$HADOOP_HOME/lib/*:$ZOOKEEPER_HOME/*:$ZOOKEEPER_HOME/lib/*:$HBASE_CLASSPATH
```
### 如何在 Cube 中增加维度和度量?
一旦 Cube 被构建完成,它的结构不能被修改。用户可以通过克隆该 Cube,在新的 Cube 中增加维度和度量,并在新的 Cube 构建完成后,禁用或删除老的 Cube,使得查询能够使用新的 Cube 进行回答。
如果用户能接受新的维度在历史数据中不存在,则可以在老的 Cube 的构建结束时候后开始构建新的 Cube,并基于老的 Cube 和新的 Cube 创建一个混合(Hybrid)模型。
### 查询结果和在 Hive 中查询结果不一致
以下是可能的原因:
1. Hive 中的源数据在导入 Kylin 后发生了改变。
2. Cube 的时间区间和 Hive 中的不一样。
3. 另外一个 Cube 回答了查询。
4. 模型中存在内连接(INNER JOIN),但是查询时没有包含所有的表的连接关系。
5. Cube 有一些近似度量,如 HyperLogLogTopN
6. Kylin v2.3 及之前版本,Kylin 在从 Hive 中获取数据时可能存在数据丢失,请参考 KYLIN-3388
### Cube 构建完成后,源数据发生改变怎么办?
用户需要刷新 Cube,如果 Cube 被分区,那么可以刷新某些 Segment
### 构建时在 “Load HFile to HBase Table” 报错 “bulk load aborted with some files not yet loaded”
根本原因是 Kylin 没有权限执行 HBase CompleteBulkLoad。请检查启动 Kylin 的用户是否有访问 HBase 的权限。
### 执行 `sample.sh` 在 HDFS 上创建 `/tmp/kylin` 文件夹失败
执行 `bash -v $KYLIN_HOME/bin/find-hadoop-conf-dir.sh`,查看报错信息,然后根据报错信息进行排错。
### 使用 Chrome 浏览器时,网页报错显示 “net::ERR_CONTENT_DECODING_FAILED”
修改 `$KYLIN_HOME/tomcat/conf/server.xml`,找到 `compress=on`,修改为 `off`
### 如何配置某个 Cube 在指定的 YARN 队列中构建
用户可以在 Cube 级别进行重写如下参数:
```properties
kylin.engine.mr.config-override.mapreduce.job.queuename=YOUR_QUEUE_NAME
kylin.source.hive.config-override.mapreduce.job.queuename=YOUR_QUEUE_NAME
kylin.engine.spark-conf.spark.yarn.queue=YOUR_QUEUE_NAME
```
### 构建 Cube 时报错 “Too high cardinality is not suitable for dictionary”
Kylin 使用字典编码方式来编码/解码维度的值;通常一个维度的基数都是小于百万的,所以字典编码方式非常好用。正如字典需要被持久化、加载进内存,如果一个维度的基数非常高,内存占用会非常大,所以 Kylin 加了一层检查。如果用户看到这类报错,建议先找到哪些维度是超高基维度,并重新对 Cube 进行设计 (如:是否需要对将超高基的列设置为维度),如果用户必须保留该超高基列作为一个维度,有如下解决方法:
1. 修改编码方式,如修改为 `fixed_length` `integer`
2. 增大 `$KYLIN_HOME/conf/kylin.properties` 中的 `kylin.dictionary.max.cardinality` 的值。
### 当某列中的数据都大于 0 时,查询 SUM() 返回负值
如果在 Hive 中将列声明为 integer,则 SQL 引擎 (Calcite) 将使用列的数据类型作为 SUM()” 的数据类型,而此字段上的聚合值可能超出整数范围;在这种情况下,查询的返回结果可能是负值。
解决方法如下:
Hive 中将该列的数据类型更改为 BIGINT,然后将表同步到 Kylin(对应的 Cube 不需要刷新)。
### 为什么需要在构建 Cuboid 之前从事实表中提取不同的列?
Kylin 使用字典对每列中的值进行编码,这大大减少了 Cube 的存储大小。 而要构建字典,Kylin 需要为每列获取不同的值。
### 如何新增用户并修改默认用户的密码
请参考: [How to add new user or change the default password](https://cwiki.apache.org/confluence/display/KYLIN/How+to+add+new+user+or+change+the+default+password) 。
### 构建 Kylin 代码时遇到 NPM 报错 (中国大陆地区用户请特别注意此问题)
用户可以通过以下命令为 NPM 设置代理:
```sh
npm config set proxy http://YOUR_PROXY_IP
```
请更新您本地的 NPM 仓库以使用国内的 NPM 镜像,例如[淘宝 NPM 镜像]([http://npm.taobao.org](http://npm.taobao.org)
### 运行 BuildCubeWithEngineTest 失败 "failed to connect to hbase"
用户在第一次运行 hbase 客户端时可能会遇到此错误,请检查错误信息以查看是否存在无法访问 "/hadoop/hbase/local/jars" 等文件夹;如果文件夹不存在,请创建它。
### JDBC 驱动程序返回的日期/时间与 REST API 不同
请参考:[JDBC query result Date column get wrong value](http://apache-kylin.74782.x6.nabble.com/JDBC-query-result-Date-column-get-wrong-value-td5370.html)
重启 Kylin 来使得配置生效,如果用户有多个 Kylin 服务器作为一个集群,需要在所有的节点都执行相同操作。
### HDFS 上的工作目录中文件超过了 300G,可以手动删除吗?
HDFS 上的工作目录中的数据包括了中间数据 (将被垃圾清理所清除) Cuboid 数据 (不会被垃圾清理所清除),Cuboid 数据将为之后的 Segment 合并而保留。所以如果用户确认这些 Segment 在之后不会被合并,可以将 Cuboid 数据移动到其他路径甚至删除。
另外,请留意 HDFS 工作目录下的 "resources" "jdbc-resources" 子目录中会存放一些大的元数据,如字典文件和维表的快照,这些文件不能被删除。
#### 如何对 like 语句中的关键字进行转义?
"%", "_" "like" 语句中的保留关键字; "%" 可以匹配任意个字符, "_" 匹配单个字符; 如果你想匹配关键字如 "_", 需要使用另一个字符在前面进行转义; 下面是一个使用 "/" 进行转义的例子, 此查询试图匹配 "xiao_":
"select username from gg_user where username like '%xiao/_%' escape '/'; "