Apache-Kylin初探

Apache Kylin 是什么

一个采用多维立方体预计算技术的 OLAP 引擎框架,简单来说就是做大数据查询的。

Apache Kylin 的工作原理本质上是 MOLAP(Multidimensional Online Analytical Processing)Cube,也就是多维立方体分析。

Kylin 安装环境要求

  • KYLIN_HOME
  • HADOOP_CONF_DIR
  • HBase Client
  • Hive Client
  • Zookeeper Client
  • Spark Client

安装之前需要确认节点上的环境是否满足要求,可以使用 bin/check-env.sh 来确认是否满足环境要求

kylin.properties,初始配置修改

因为 Kylin 很多默认配置都在根目录下,这里先改几个默认配置

1
2
3
4
5
6
7
8
9
10
# Kylin 在 HDFS 上的工作目录,默认是 /kylin
kylin.env.hdfs-working-dir=/apps/kylin26
# Kylin 在 ZK 上的目录,默认是 /kylin
kylin.env.zookeeper-base-path=/apps/kylin26
# Kylin 服务启动地址和端口,默认是 localhost:7070
kylin.server.cluster-servers=calcnode1:7070
# Kylin 在 Hive 中的数据库,默认是 default
kylin.source.hive.database-for-flat-table=kylin26
# Kylin 在 HBase 中的工作命名空间,默认是
kylin.storage.hbase.namespace=kylin26

满足环境要求之后直接启动就 OK,成功启动的界面如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@master apache-kylin-2.5.2-bin-hbase1x]# bin/kylin.sh start
Retrieving hadoop conf dir...
KYLIN_HOME is set to /data4/kylin/apache-kylin-2.5.2-bin-hbase1x
Retrieving hive dependency...
Retrieving hbase dependency...
Retrieving hadoop conf dir...
Retrieving kafka dependency...
Retrieving Spark dependency...
Start to check whether we need to migrate acl tables
Retrieving hadoop conf dir...
KYLIN_HOME is set to /data4/kylin/apache-kylin-2.5.2-bin-hbase1x
Retrieving hive dependency...
Retrieving hbase dependency...
Retrieving hadoop conf dir...
Retrieving kafka dependency...
Retrieving Spark dependency...
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/data4/kylin/apache-kylin-2.5.2-

-hbase1x/tool/kylin-tool-2.5.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hdp/2.4.2.0-258/hadoop/lib/slf4j-log4j12-
...

A new Kylin instance is started by root. To stop it, run 'kylin.sh stop'
Check the log at /data4/kylin/apache-kylin-2.5.2-bin-hbase1x/logs/kylin.log
Web UI is at http://<hostname>:7070/kylin

看到 Web UI is at http://<hostname>:7070/kylin 即表示服务已经启动,直接前往浏览器打开登录界面,账号 ADMIN,默认密码 KYLIN。如果浏览器打不开,排查启动日志 $KYLIN_HOME/logs/kylin.log,查看具体错误原因。

例如,启动报错:

1
2
Invocation of init method failed; nested exception is java.lang.IllegalStateException: Cannot start job scheduler due to lack of job lock
...

既然是 lack of job ,查看 HBase Zookeeper 的元数据信息,极大可能是元数据信息冲突了,在没做集群的情况下换节点启动服务容易出现这个错误,因为默认的元数据信息都在 HBase Zookeeper 的默认nameSpace 或 根目录下。

其他

如果修改了部分 Kylin 配置,最好进行重启,否则有些配置在 Kylin 的 System 页面重新加载不一定生效。

1
2
bin/kylin.sh stop
bin/kylin.sh start

在重启后需要在 System 页面 重新加载配置和元数据信息。

样例 Cube

1
$KYLIN_HOME/bin/sample.sh

特性

  • SQL 接口

    标准查询 SQL 支持

  • 支持海量数据集,增量更新

    不会随着数据量的增长导致查询时间线性增长,查询时间只跟维度的个数和基数

  • 亚秒级响应

    因为预计算,所以查询时间就是一个查询结果的时间

  • 水平扩展

    扩展查询性能,预计算性能扩展需要根据底层计算引擎分别扩展

  • 可视化集成

    提供了 ODBC/JDBC 接口和 RESTful API ,方便集成

  • 计算引擎可插拔

    目前主要的两个引擎是 MR 和 Spark

  • 存储后端可插拔

    目前主要是 基于HBase 的查询后端,也可以基于 Druid 等。

缺点

  • 不支持随机和明细查询

    因为预计算的都是多维度的聚合结果,因为随机和明细的查询是不支持的

  • 只支持星型模型

    雪花模型和星座模型可以转为星型模型

  • 空间换时间

    因为预计算的原因,结果数据会因为维度和度量的个数和基数而直线膨胀

  • 数据结构发生变化需要重新 build cube

    因为预计算的原因,导致历史结果数据无法更新只能重写覆盖

Kylin 将hive client的计算引擎换成 SparkSQL

正常来说,Hive 默认的任务引擎是 MR,如果需要将 MR 改成 SparkSQL 时,对配置进行一些改变

1
2
3
4
5
6
# 打开 spark-sql
kylin.source.hive.enable-sparksql-for-table-ops=true
# 必须指定对应 spark 集群的 beeline 路径
kylin.source.hive.sparksql-beeline-shell=/data/spark/spark-2.1.1-bin-hadoop2.7/bin/beeline
# 指定 beeline 连接参数,注意 hive 集群的参数
kylin.source.hive.sparksql-beeline-params=-n root --hiveconf hive.security.authorization.sqlstd.confwhitelist.append='mapreduce.job.*|dfs.*' -u jdbc:hive2://master:10000

关于队列设置

(1)默认配置文件,通过配置文件($KYLIN_HOME/conf/kylin_job_conf.xml)设置队列:

1
2
3
4
5
<property>
<name>mapreduce.job.queuename</name>
<value>default</value>
<description>Job queue</description>
</property>

Hive配置使用单独的配置文件kylin_hive_conf.xml,kylin_hive_conf.xml是kylin提交任务到hive的配置文件

(2)cube级别重载

如果某一个任务想要单独配置队列(例如放在一个较大的队列加快Build速度),可以通过Cube的属性重载默认的配置:

1
2
3
4
5
<property>
<name>kylin.job.mr.config.override.mapreduce.job.queuename</name>
<value>kylin</value>
<description>cube level override queue</description>
</property>

如果想要重载hive队列:

1
2
3
4
5
<property>
<name>kylin.hive.config.override.mapreduce.job.queuename</name>
<value>kylin</value>
<description>override hive queue</description>
</property>

Kylin 增加 Spark 任务引擎

因为目前spark集群时独立于 hdp 之外的 standalone 模式,所以相关 yarn的配置无所谓 。

进行配置修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 指定 hadoop_conf_dir
kylin.env.hadoop-conf-dir=/etc/hadoop/conf
# 指定 spark 集群
kylin.engine.spark-conf.spark.master=spark://hadoopha:7077
# spark 任务模式
kylin.engine.spark-conf.spark.submit.deployMode=cluster
# yarn 队列,因为跟 yarn 无关,这里无所谓
kylin.engine.spark-conf.spark.yarn.queue=default
kylin.engine.spark-conf.spark.yarn.executor.memoryOverhead=1024
kylin.engine.spark-conf.spark.hadoop.yarn.timeline-service.enabled=false
# spark 常规配置
kylin.engine.spark-conf.spark.driver.memory=2G
kylin.engine.spark-conf.spark.executor.memory=4G
kylin.engine.spark-conf.spark.executor.instances=40
kylin.engine.spark-conf.spark.shuffle.service.enabled=true
kylin.engine.spark-conf.spark.eventLog.enabled=true
kylin.engine.spark-conf.spark.eventLog.dir=hdfs\://bbkhd/apps/kylin/spark-history
kylin.engine.spark-conf.spark.history.fs.logDirectory=hdfs\://bbkhd/apps/kylin/spark-history

#### Spark conf for specific job
kylin.engine.spark-conf-mergedict.spark.executor.memory=6G
kylin.engine.spark-conf-mergedict.spark.memory.fraction=0.2
#
## manually upload spark-assembly jar to HDFS and then set this property will avoid repeatedly uploading jar at runtime
kylin.engine.spark-conf.spark.yarn.archive=hdfs://bbkhd/apps/kylin/spark/spark-libs.jar
kylin.engine.spark-conf.spark.io.compression.codec=org.apache.spark.io.SnappyCompressionCodec