目录
安装
参考案例:https://my.oschina.net/u/4350719/blog/4686802
Hadoop 环境
Kylin 依赖于 Hadoop 集群处理大量的数据集。您需要准备一个配置好 HDFS,YARN,MapReduce,Hive, HBase,Zookeeper 和其他服务的 Hadoop 集群供 Kylin 运行。
Kylin 可以在 Hadoop 集群的任意节点上启动。方便起见,您可以在 master 节点上运行 Kylin。但为了更好的稳定性,我们建议您将 Kylin 部署在一个干净的 Hadoop client 节点上,该节点上 Hive,HBase,HDFS 等命令行已安装好。
运行 Kylin 的 Linux 账户要有访问 Hadoop 集群的权限,包括创建/写入 HDFS 文件夹,Hive 表, HBase 表和提交 MapReduce 任务的权限。
Kylin下载
从 Apache Kylin下载网站 下载一个适用于您 Hadoop 版本的二进制文件。例如,适用于 HBase 1.x 的 Kylin 2.5.0 可通过如下命令行下载得到:
cd /usr/local/
wget http://mirror.bit.edu.cn/apache/kylin/apache-kylin-2.5.0/apache-kylin-2.5.0-bin-hbase1x.tar.gz
解压 tar 包,配置环境变量 $KYLIN_HOME
指向 Kylin 文件夹。
tar -zxvf apache-kylin-2.5.0-bin-hbase1x.tar.gz
cd apache-kylin-2.5.0-bin-hbase1x
# Kylin_HOME
export KYLIN_HOME=/usr/local/kylin-3.1.1
export PATH=$KYLIN_HOME/bin:$PATH
我下载安装的是这个:
从 v2.6.1 开始, Kylin 不再包含 Spark 二进制包; 如果需要,您需要另外下载 Spark,然后设置 SPARK_HOME
系统变量到 Spark 安装目录:
export SPARK_HOME=/usr/local/spark
export PATH=$SPARK_HOME/bin:$PATH
或者使用脚本下载:
$KYLIN_HOME/bin/download-spark.sh
由于上面在/etc/profile
文件中新增了内容,键入source /etc/profile
让刚刚做的修改立即生效
Kylin目录结构
bin
: shell 脚本,用于启动/停止 Kylin,备份/恢复 Kylin 元数据,以及一些检查端口、获取 Hive/HBase 依赖的方法等;conf
: Hadoop 任务的 XML 配置文件,这些文件的作用可参考配置页面lib
: 供外面应用使用的 jar 文件,例如 Hadoop 任务 jar, JDBC 驱动, HBase coprocessor 等.meta_backups
: 执行bin/metastore.sh backup
后的默认的备份目录;sample_cube
用于创建样例 Cube 和表的文件。spark
: 自带的 spark。tomcat
: 自带的 tomcat,用于启动 Kylin 服务。tool
: 用于执行一些命令行的jar文件。
配置kylin.properties
-
进入
conf
目录,将kylin.properties.template
改成kylin.properties
,命令:mv kylin.properties.template kylin.properties
-
编辑
kylin.properties
文件,添加以下内容# kylin集群节点配置:node1是我的主机名,因为kylin部署为一个节点 kylin.server.cluster-servers=node1:7070 #配置节点类型(kylin节点模式分为all、query(查询模式)、job(任务构建模式)) #因为我们只部署一个节点kylin,所以配置为all kylin.server.mode=all
验证检查环境
键入以下命令以分别检查环境
# 检查环境
bin/check-env.sh
# 检查hive依赖
bin/find-hive-dependency.sh
# 检查hbase依赖
bin/find-hbase-dependency.sh
-
# 检查环境 进入Kylin - bin目录下执行 check-env.sh
-
# 检查hive依赖 进入Kylin - bin目录下执行
find-hive-dependency.sh
下面遇到的问题是在购买的阿里EMR服务器上遇到的找不到hive-site.xml
的错误;
该问题是因为Kylin 会自动从环境中读取 Hadoop 配置(core-site.xml),Hive 配置(hive-site.xml)和 HBase 配置(hbase-site.xml)。而此时找不到并且它提示需要配置$HIVE_CONF
指向hive-site.xml。
解决方法:在 /etc/profile配置环境变量。可是我发现该文件中是空白的???(没有 export 字样)但是可以执行cd $HIVE_HOME
,cd $HIVE_CONF_HOME
,cd $HIVE_CONF_DIR
命令。最终通过grep -r "$KYLIN_HOME" /
grep -r "关键字" "查找路径"
找到HIVE HOME的环境变量配置在哪里。
阿里云EMR服务器将 各个插件的环境变量配置在了profile.d 目录下(方便维护权限)。然后进入HIVE.sh 添加下面的配置。
-
# 检查hbase依赖 进入Kylin - bin目录下执行
find-hbase-dependency.sh
,检查hbase 依赖项的时候报错 找不到 common 包
解决:http://92072234.wiz03.com/share/s/2i1O8Q1L1k042IDoOy3h7BgH2K4G6J2SoQv42Xc4b01xpCrj
找到 并且编辑vim $HBASE_HOME/bin/hbase
。发现没有将自己的jar包添加class path 中
那我需要做的事情就是将自己的jar包添加class path 中,将CLASSPATH修改为:# CLASSPATH initially contains $HBASE_CONF_DIR CLASSPATH="${HBASE_CONF_DIR}" CLASSPATH=${CLASSPATH}:$JAVA_HOME/lib/tools.jar:$HBASE_HOME/lib/*
-
最终/etc/profile
#JAVA_HOME JAVA_HOME=/usr/local/jdk1.8 export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar #ZK_HOME export ZK_HOME=/usr/local/zookeeper-3.4.11 export PATH=$ZK_HOME/bin:$PATH #HADOOP_HOME export HADOOP_HOME=/usr/local/hadoop-3.2.1 export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export HADOOP_YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin #HBASE_HOME export HBASE_HOME=/usr/local/hbase-2.2.4 export PATH=$HBASE_HOME/bin:$PATH # HIVE_HOME export HIVE_HOME=/usr/local/hive-3.1.2 export PATH=$HIVE_HOME/bin:$PATH export HIVE_CONF_HOME=$HIVE_HOME/conf export HCAT_HOME=$HIVE_HOME/hcatalog export PATH=$HCAT_HOME/bin:$PATH # Kylin_HOME export KYLIN_HOME=/usr/local/kylin-3.1.1 export PATH=$KYLIN_HOME/bin:$PATH
启动/停止Kylin
# 启动Kylin
bin/kylin.sh start
# 停止Kylin
bin/kylin.sh stop
guava.jar版本问题
进入Kylin - bin目录下执行 kylin.sh start
该问题在该环境信息下:Hadoop3.2.1 HBase2.2.4 Hive3.1.2。安装Hive3.1.2的时候也出现过
安装Hive的解决办法:
-
com.google.common.base.Preconditions.checkArgument这个类所在的jar包为:guava.jar
-
hadoop-3.2.1(路径:hadoop\share\hadoop\common\lib)中该jar包为 guava-27.0-jre.jar;而hive-3.1.2(路径:hive/lib)中该jar包为guava-19.0.1.jar
-
将jar包变成一致的版本:删除hive中低版本jar包,将hadoop中高版本的复制到hive的lib中。
此时又出现了该问题。可是我们的guava已经修改为27 版本了。为什么还有该问题?
原因:Kylin 的源数据服务是 Hive,依赖与 Hive 中 一个guava包。可是Hive 框架中 源码中pom.xml 该guava包的版本并没有统一,有的地方还是19版本。
官网提供了解决方案:
启动 Kylin
运行
$KYLIN_HOME/bin/kylin.sh start
脚本来启动 Kylin,界面输出如下:Retrieving hadoop conf dir... KYLIN_HOME is set to /usr/local/apache-kylin-2.5.0-bin-hbase1x ...... A new Kylin instance is started by root. To stop it, run 'kylin.sh stop' Check the log at /usr/local/apache-kylin-2.5.0-bin-hbase1x/logs/kylin.log Web UI is at http://<hostname>:7070/kylin
注:如果在启动 kylin 时遇到如下报错(Hadoop3 环境下可能出现):
Caused by: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V at org.apache.hadoop.conf.Configuration.set(Configuration.java:1358) at org.apache.hadoop.conf.Configuration.set(Configuration.java:1339) at org.apache.kylin.common.util.HadoopUtil.healSickConfig(HadoopUtil.java:77) at org.apache.kylin.common.util.HadoopUtil.getCurrentConfiguration(HadoopUtil.java:63) at org.apache.kylin.storage.hbase.HBaseConnection.newHBaseConfiguration(HBaseConnection.java:170) at org.apache.kylin.storage.hbase.HBaseConnection.get(HBaseConnection.java:259) at org.apache.kylin.storage.hbase.HBaseResourceStore.getConnection(HBaseResourceStore.java:96) at org.apache.kylin.storage.hbase.HBaseResourceStore.createHTableIfNeeded(HBaseResourceStore.java:119) at org.apache.kylin.storage.hbase.HBaseResourceStore.<init>(HBaseResourceStore.java:89) ... 8 more
可以尝试如下方法解决:
下载guava-28.0-jre.jar, 将其放到
$KYLIN_HOME/tool/
和$KYLIN_HOME/tomcat/lib/
目录下,然后重启kylinbin/kylin.sh restart
。
CuratorConnectionLossException
org.apache.curator.CuratorConnectionLossException: KeeperErrorCode = ConnectionLoss
2021-02-01 19:21:46,453 ERROR [main] curator.ConnectionState:228 : Connection timed out for connection string (node1:2181:2181,node2:2181:2181,node3:2181:2181/kylin/kylin_metadata) and timeout (15000) / elapsed (24928)
org.apache.curator.CuratorConnectionLossException: KeeperErrorCode = ConnectionLoss
日志信息提示:node1:2181:2181,node2:2181:2181,node3:2181:2181。说明多了一次2181。这是由于:读取的是配置文件hbase-site.xml的hbase.zookeeper.quorum,该项只需配置Host不需要配置端口号Port,改回来之后重启hbase就好了。
错误
ERROR: Check hive's usability failed, please check the status of your cluster
解决 在kylin的安装目录下进入bin
目录然后找到check-hive-usability.sh
,之后键入命令vim check-hive-usability.sh
编辑该文件,修改timeLeft的值为100(默认值为60),见下图
熟悉使用 Kylin
不会涉及到 衍生维度,分区cube之类的。
进入web界面
如果成功启动,在terminal中键入jps命令会出现RunJar的进程,terminal末尾的显示的信息如下图
Kylin 启动后您可以通过浏览器 http://:7070/kylin
进行访问。
其中 `` 为具体的机器名、IP 地址或域名,默认端口为 7070。
初始用户名和密码是 ADMIN/KYLIN
。
服务器启动后,您可以通过查看 $KYLIN_HOME/logs/kylin.log
获得运行时日志。
创建项目
登陆kylin后,点击左上角的+号来创建Project:
同步hive表
点击Model->Data Source->Load Table From Tree,
Kylin会读取到Hive数据源中的表并以树状方式显示出来,你可以选择自己要使用的表,然后点击sync进行将其加载到kylin。
Failed to load Hive Table
选择hive表,报错?
2021-02-02 17:30:14,875 ERROR [http-nio-7070-exec-5] controller.TableController:132 : Failed to load Hive Table
java.lang.RuntimeException: cannot get HiveTableMeta
at org.apache.kylin.source.hive.HiveMetadataExplorer.loadTableMetadata(HiveMetadataExplorer.java:68)
报错原因是kylin在load表的时候,需要调用StorageSchemaReader接口的readSchema方法,默认的default是没有这个实现方法的就会报错。
解决方法是在 hive-site.xml中 添加以下属性
<property>
<name>metastore.storage.schema.reader.impl</name>
<value>org.apache.hadoop.hive.metastore.SerDeStorageSchemaReader</value>
</property>
关联成功
创建Model
-
new Model
-
model信息
-
选择事实表,以及维度表
-
添加Lookup Table时需要设置与事实表的JOIN条件。
-
然后点击Next到下一步添加Dimension(维度)
-
点击Next下一步添加Measure(度量)
-
点击Next下一步跳转到设置时间分区列和过滤条件页面,时间分区列用于增量构建时选择时间范围,如果不设置时间分区列则代表该model下的cube都是全量构建。过滤条件会在打 平表 时用于where条件。
平表意思是(维度和度量组成的中间表)会在生成cube的时候有截图
创建Cube
1.先要选择该Cube是 属于哪个 Model的。定义cube信息
2. 点击Next到下一步添加Dimension,Lookup Table的维度可以设置为Normal(普通维度)或者Derived(衍生维度)两种类型,默认设置为衍生维度,衍生维度代表该列可以从所属维度表的主键中衍生出来,所以实际上只有主键列会被Cube加入计算。
我这里选择的都是事实表的维度
3. 选择度量
点击Next到下一步,点击+Measure来添加需要预计算的度量。Kylin会默认创建一个Count(1)的度量。Kylin支持SUM、MIN、MAX、COUNT、COUNT_DISTINCT、TOP_N、EXTENDED_COLUMN、PERCENTILE八种度量。请为COUNT_DISTINCT和TOP_N选择合适的返回类型,这关系到Cube的大小。添加完成之后点击ok,该Measure将会显示在Measures列表中。
**函数SUM的返回类型必须是 [ smallint,int4,double,tinyint,numeric,long8,integer,real,float,decimal,bigint ] 之一。**
4.其他
6. 创建完成
查看cube信息
SQL
查看到创建完成cube的sql。该sql体现了 平表的逻辑。
Planner
注意在Kylin中每一种维度的组合 都管它叫做 Cuboid 。下图一共有 4095 个 ,图表展示。最下面是各个维度
4095 = 2的12次方-1 (2^12)-1
构建Cube
-
上一个步骤创建好的Cube只有定义,而没有计算好的数据,它的状态是‘DISABLED’,是不可以查询的。要想让Cube有数据,还需要对它进行构建。
-
Cube的构建方式通常有两种:全量构建和增量构建。
-
点击要构建的Cube的Actions列下的Action展开,选择Build,如果Cube所属Model中没有设置时间分区列,则默认全量构建,直接提交构建任务。
-
如果设置了时间分区列,则会出现如下页面,在这里你要选择构建数据的起止时间,然后点击Submit
-
然后你可以在Monitor页面观察构建任务的状态。Kylin会在页面上显示每一个步骤的运行状态、输出日志以及MapReduce任务。可以在
${KYLIN_HOME}/logs/kylin.log
中查看更详细的日志信息。
-
任务构建完成后,Cube状态会变成READY,并且可以看到Segment的信息。
-
构建过程中发生的错误信息:
check status java.io.IOException: java.net.ConnectException: Your endpoint configuration is wrong; For more details see: http://wiki.apache.org/hadoop/UnsetHostnameOrPort
查询Cube
Cube构建完成后,在Insight页面的Tables列表下面可以看到构建完成的Cube的table,并可以对其进行查询.查询语句击中Cube后会返回存储在Hbase中的预计算结果。
-
查询的时候报错:
java.lang.NoClassDefFoundError : org.apache.commons.lang.text.StrSubstitutor;
-
查看kylin的源码发现在 KylinConfigBase 类中 使用了 StrSubstitutor 类。并且pom.xml中也没有依赖
-
那也就说明了需要依赖hive以及hbase的该jar包。后来查看hive下是有这个jar包的。而hbase没有。
将hive的那个jar包复制到hbase的目录下了。又添加了/etc/profile文件的配置。修改了很多地方记不清楚了。贴一个最新的配置信息吧
vim /etc/profile
#JAVA_HOME JAVA_HOME=/usr/local/jdk1.8 export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar #ZK_HOME export ZK_HOME=/usr/local/zookeeper-3.4.11 export PATH=$ZK_HOME/bin:$PATH #HADOOP_HOME export HADOOP_HOME=/usr/local/hadoop-3.2.1 export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export HADOOP_YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin #HBASE_HOME export HBASE_HOME=/usr/local/hbase-2.2.4 export PATH=$HBASE_HOME/bin:$PATH # HIVE_HOME export HIVE_HOME=/usr/local/hive-3.1.2 export PATH=$HIVE_HOME/bin:$PATH export HIVE_CONF_HOME=$HIVE_HOME/conf export HCAT_HOME=$HIVE_HOME/hcatalog export PATH=$HCAT_HOME/bin:$PATH # Kylin_HOME export KYLIN_HOME=/usr/local/kylin-3.1.1 export PATH=$KYLIN_HOME/bin:$PATH
vim/usr/local/hbase/bin/hbase
# CLASSPATH initially contains $HBASE_CONF_DIR CLASSPATH="${HBASE_CONF_DIR}" CLASSPATH=${CLASSPATH}:$JAVA_HOME/lib/tools.jar:$HBASE_HOME/lib/*
了解Kyliin构建Cube的过程
-
创建临时的Hive平表(从Hive读取数据)。说白了就是将 事实表,维度表的 维度和度量全部查询出来的结果作为一张平表。(也就是我们此次构建用到的所有数据结合起来)
-
计算各维度的不同值,并收集各Cuboid的统计数据。
-
创建并保存字典。
-
保存Cuboid统计信息。
-
创建HTable。
-
计算Cube(一轮或若干轮MapReduce)。
-
将Cube的计算结果转成HFile。
-
加载HFile到HBase。
-
更新Cube元数据。
-
垃圾回收
Kylin使用beeline连接hive
之前一直是通过cli连接hive,由于系统升级需要通过beeline连接。此处的hive已经配置了自定义安全认证
官网教程:http://kylin.apache.org/docs/howto/howto_use_beeline.html
我的配置文件:-n 指定用户名,-p指定密码,-u指定和hiveServer2 连接地址 问号后面内容为了支持操作hive的事务表。
-u 'jdbc:hive2://localhost:10000?hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;hive.support.concurrency=true;'
kylin查询api
之前已经成功创建了kylin的cube,并且可以使用 web ui查询。但除了通过web ui进行操作,我们还可以使用api调用。
RestFul API
在使用之前,我们要先进行认证,目前Kylin使用 basic Authentication。Basic Authentication是一种非常简单的访问控制机制,它先对账号密码基于Base64编码,然后将其作为请求头添加到HTTP请求头中,后端会读取请求头中的账号密码信息以进行认证。
以Kylin默认的账号密码 ADMIN/KYLIN
为例,对相应的账号密码进行编码后,结果为Basic QURNSU46S1lMSU4=,那么HTTP对应的头信息 则为Authorization:Basic QURNSU46S1lMSU4=。
查询SQL
curl -X POST -H "Authorization: Basic QURNSU46S1lMSU4=" -H 'Content-Type: application/json'
http://localhost:7070/kylin/api/query -d '{
"sql":"select market,sum(sales) from kylin_sale group by market",
"offset":0,
"limit":10,
"acceptPartial":false,
"project":"my_kylin"
}'
参数解释:
- sql:必填,字符串类型,请求的SQL。
- offset:可选,整型,查询默认从第一行返回结果,可以设置该参数以决定返回数据从哪一行开始往后返回。
- limit:可选,整型,加上limit参数后会从offset开始返回对应的行数, 返回数据行数小于limit的将以实际行数为准。
- acceptPartial:可选,布尔类型,默认是true,如果为true,那么实际上最多会返回一百万行数据;如果要返回的结果集超过了一百万行,那么 该参数需要设置为false。
- project:可选,字符串类型,默认为DEFAULT,在实际使用时,如 果对应查询的项目不是DEFAULT,那就需要设置为自己的项目。
Put提交cube
curl -X PUT -H "Authorization: Basic QURNSU46S1lMSU4=" -H 'Content-Type: application/json'
http://localhost:7070/kylin/api/cubes/my_cube/build -d '{
"startTime":0,
"endTime":"$endTime",
"buildType":"BUILD"
}'
上面的内容里面,url里面的my_cube是你自己的cube名,endTime是你需要去指定的,startTime : 当cube中不存在segment时,可以将其设置为0,那么就会从头开始算。做增量时,startTime 要设置为上一次build的
endTime。endTime:时间精确到毫秒(例1388563200000)。
注意点
我们在通过RESTful API向kylin进行build和rebuild的时候一定要观察kylin的web界面下面的Montior进程,否则不小心运行太多进程导致服务器崩掉
JAVA API
JDBC连接方式
和hive、mysql很相似。
package com.shsxt.kylinTest;
import org.apache.kylin.jdbc.Driver;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class KylinJdbc {
public static void main(String[] args) throws IllegalAccessException,
InstantiationException, ClassNotFoundException, SQLException {
KylinJdbc kylinJdbc = new KylinJdbc();
kylinJdbc.connectJdbc();
}
public void connectJdbc() throws ClassNotFoundException, IllegalAccessException,
InstantiationException, SQLException {
Driver driver = (Driver) Class.forName("org.apache.kylin.jdbc.Driver").newInstance();
Properties properties = new Properties();
properties.put("user","ADMIN");
properties.put("password","KYLIN");
//url后面跟上你的project的名称
Connection connect = driver.connect("jdbc:kylin://192.168.4.10:7070/my_kylin",
properties);
//sql语句和kylin库所含数据一一对应。
Statement statement = connect.createStatement();
ResultSet resultSet = statement.executeQuery("select market,sum(sales) from kylin_sale group by market");
while(resultSet.next()){
String market = resultSet.getString(1);
long sales = resultSet.getLong(2);
System.out.println(market+" : "+ sales);
}
}
}