Apache Kylin是一个开源的分布式分析引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc. 开发并贡献至开源社区。它能在亚秒内查询巨大的Hive表。
Apache Kylin官网:http://kylin.apache.org/
Kylin的官网上每个版本的都提供两个包一个for HBase的一个for CDH的,根据自己的环境选择下载对应的kylin的安装包,否则后面会报各种各样的错误。
Kylin依赖于hadoop的环境:
所以在安装kylin之前需要先安装好Hadoop的环境(包括hdfs、hive、hbase等);而且Kylin对各组件的版本要求很严格,只要有组件版本不匹配就会导致Kylin无法正常使用。本文选择使用如下版本的组件:
Kylin:2.5.0(apache-kylin-2.5.0-bin-hbase1x)
JDK:1.8.0_162
Hadoop:hadoop-2.7.6
HBase:1.2.7
Hive:1.2.2
Hadoop注意开启JobHistoryServer,yarn的资源配置(default队列)要足够(主要是内存),JDK、Hadoop和HBase的安装可以在网上搜索相关资料,下面主要介绍Hive和Kylin的安装。
这里选择使用mysql来保存hive的元数据信息,所以需要安装mysql,centos 7.2上面直接使用yum -y install mariadb mariadb-server来进行安装,然后启动mariadb,并设置开机自启动:
# systemctl start mariadb
# systemctl enable mariadb
设置root密码
# mysqladmin -u root password 123456
然后进入mysql(mysql -uroot -p123456),创建数据库并设置相关权限:
mysql> CREATE DATABASE hive; # 创建hive数据库
mysql> grant all on hive.* to hive@'%' identified by '123456'; # 给hive的权限,123456是数据库的密码
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all on hive.* to hive@localhost identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
Hive安装包拷贝到/opt/目录下,然后解压。配置好各环境变量:
# vim /etc/profile
# set hive environment
#java
export JAVA_HOME=/opt/jdk1.8.0_162/
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#hadoop
export HADOOP_HOME=/opt/hadoop-2.7.6
#hbase
export HBASE_HOME=/opt/hbase-1.2.7
#hive
export HIVE_HOME=/opt/apache-hive-1.2.2-bin
#export HCAT_HOME=/opt/apache-hive-1.2.2-bin/hive-hcatalog
#kylin
export KYLIN_HOME=/opt/apache-kylin-2.5.0-bin-hbase1x
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HBASE_HOME/bin:$HIVE_HOME/bin:$KYLIN_HOME:$PATH
# source /etc/profile
修改hive配置文件:
# cd $HIVE_HOME/conf/
# cp hive-default.xml.template hive-site.xml
# cp hive-env.sh.template hive-env.sh
# cp hive-exec-log4j.properties.template hive-exec-log4j.properties
# cp hive-log4j.properties.template hive-log4j.properties
#vi hive-site.xml
主要配置了以下配置项:
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
Driver class name for a JDBC metastore
javax.jdo.option.ConnectionUserName
hive
Username to use against metastore database
javax.jdo.option.ConnectionPassword
123456
password to use against metastore database
javax.jdo.option.ConnectionURL
jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&useSSL=false
JDBC connect string for a JDBC metastore
hive.metastore.uris
thrift://localhost:9083
Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.
hive.metastore.warehouse.dir
/hive/warehouse
location of default database for the warehouse,Hive在HDFS上的根目录
hive.exec.local.scratchdir
/hive/exec
Local scratch space for Hive jobs
hive.downloaded.resources.dir
/hive/downloadedsource
Temporary local directory for added resources in the remote file system.
配置文件中的几个目录需要创建下:
Hdfs上创建:
# hadoop fs -mkdir -p /hive/warehouse
# hadoop fs -mkdir -p /hive/logs
# hadoop fs -mkdir -p /hive/tmp
本地创建:
# mkdir -p /hive/logs
# mkdir -p /hive/exec
# mkdir -p /hive/downloadedsource
另外hive中没有mysql jdbc的jar包,需要单独下载,下载地址:https://dev.mysql.com/downloads/connector/j/
下载后解压,然后将jar包拷贝到hive的lib目录下。
另外需要注意的是配置项hive.metastore.uris,Kylin是用 HCatalog 读取Hive表的,而HCatalog用 hive.metastore.uris 创建HiveMetaStoreClient 得到元信息,所以这里要配置hive的metastore的地址信息。
然后配置两个log4j的配置文件:
hive.log.dir=/hive/logs
最后进入到hive的bin目录启动hive:
# ./hive --service metastore &
直接运行在控制台输入hive进入到hive的控制台页面,执行下show tables,看看hive是否正常。
错误描述
Caused by: MetaException(message:Version information not found in metastore. )
解决办法
修改conf/hive-site.xml 中的 “hive.metastore.schema.verification” 值为 false 即可解决 “Caused by: MetaException(message:Version information not found in metastore. )”
错误描述
配置好hive并启动两个必要后台进程metastore和hiveserver2后,启动hive时可能会遇到Required table missing : "DBS`" in Catalog "" Schema "这样的错误。因为在此实验环境中,hive的元数据保存在远程的mysql中,所以该错误意思是:在远程的数据库中没有找到相应的数据对象。
解决办法
在配置文件hive-sit.xml中,将datanucleus.schema.autoCreateAll的值改为true,
这个属性的含义是:当元数据库中必要的数据对象不存在是,会自动创建。
Kylin使用的是apache-kylin-2.5.0-bin-hbase1x的二进制包,拷贝到/opt/目录,然后解压。然后进入到/opt/apache-kylin-2.5.0-bin-hbase1x/conf目录修改配置文件kylin.properties。
# vi kylin.properties
# 根据实际环境进行配置
kylin.env.hadoop-conf-dir=/opt/hadoop-2.7.6/etc/hadoop
kylin.engine.spark-conf.spark.master=yarn
kylin.engine.spark-conf.spark.submit.deployMode=cluster
kylin.engine.spark-conf.spark.yarn.queue=default
kylin.engine.spark-conf.spark.driver.memory=2G
kylin.engine.spark-conf.spark.executor.memory=4G
kylin.engine.spark-conf.spark.yarn.executor.memoryOverhead=1024
kylin.engine.spark-conf.spark.executor.instances=2
kylin.engine.spark-conf.spark.executor.cores=1
kylin.engine.spark-conf.spark.shuffle.service.enabled=false
kylin.engine.spark-conf.spark.network.timeout=600
kylin.engine.spark-conf.spark.eventLog.enabled=true
kylin.engine.spark-conf.spark.hadoop.dfs.replication=2
kylin.engine.spark-conf.spark.hadoop.mapreduce.output.fileoutputformat.compress=true
kylin.engine.spark-conf.spark.hadoop.mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.DefaultCodec
kylin.engine.spark-conf.spark.io.compression.codec=org.apache.spark.io.SnappyCompressionCodec
kylin.engine.spark-conf.spark.eventLog.dir=hdfs:///kylin/spark-history
kylin.engine.spark-conf.spark.history.fs.logDirectory=hdfs:///kylin/spark-history
kylin.engine.spark-conf.spark.yarn.archive=hdfs://d120:9000/kylin/spark/spark-libs.jar
上传spark的jar包:
jar cv0f spark-libs.jar -C $KYLIN_HOME/spark/jars/ .
hadoop fs -mkdir -p /kylin/spark/
hadoop fs -put spark-libs.jar /kylin/spark/
配置完成后,进到bin目录下执行./check-env.sh, ./find-hbase-dependency.sh,./find-hive-dependency.sh检查环境是否OK,环境OK后启动kylin:
# ./kylin.sh start
启动后查看日志有无报错(logs/kylin.log和logs/kylin.out),没有报错就可以登录kylin的web界面开始使用kylin。
登陆kylin:http://
看下System页面是不是OK,组件版本不对会导致这个页面加载失败,没报错的话下面就可以跑一下kylin中的例子。
执行./bin/sample.sh,执行完会提示:
Sample cube is created successfully in project 'learn_kylin'. Restart Kylin Server or click Web UI => System Tab => Reload Metadata to take effect #这句话的意思是 例子cube已成成功创建在了工程名称叫'learn_kylin'里面了 #重启kylin或者通过webUI => System选项卡=> 重新导入元数据信息 |
查看Hive default库中的表,多了五张表:
然后到web页面进行操作来创建cube:
1.Reload Metadata
2.Build Cube
3.Finish Build
到这里cube就创建完了,可以执行下select语句来查询
select part_dt, sum(price) as total_selled, count(distinct seller_id) as sellers from kylin_sales group by part_dt order by part_dt
其他像Cube的设计、优化、流式构建等功能的使用,可直接参见kylin的官方文档,http://kylin.apache.org/docs/,目前kylin的支持的数据源有hive、kafka和jdbc源,其流式构建是使用hadoop(mr)消费kafka的数据来增量构建cube segment,目前都需要用户去触发每次的构建,而且构建都是分钟以上的延时。
目前ebay做了一个New Kylin Streaming的feature,该feature说是实时性达到毫秒级,可以水平扩展(Streaming Receiver),每个Streaming Receiver处理速度达到44000 events/s,目前已经在整理代码,即将合并到新版本的kylin中,等kylin的下个版本(2.6.0)发布估计就有该功能了,到时候可以测试使用一下。
在使用过程中难免会遇到各种各样的问题,这时候可能就需要来进行调试,Kylin可以通过以下方式进行远程调试:
在kylin安装目录下,修改bin目录下的kylin.sh启动脚本:
# vi bin/kylin.sh
hbase ${KYLIN_EXTRA_START_OPTS} \
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
-Dlog4j.configuration=file:${KYLIN_HOME}/conf/kylin-server-log4j.properties \
-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true \
-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true \
-Djava.endorsed.dirs=${tomcat_root}/endorsed \
-Dcatalina.base=${tomcat_root} \
-Dcatalina.home=${tomcat_root} \
-Djava.io.tmpdir=${tomcat_root}/temp \
-Dkylin.hive.dependency=${hive_dependency} \
-Dkylin.hbase.dependency=${hbase_dependency} \
-Dkylin.kafka.dependency=${kafka_dependency} \
-Dkylin.spark.dependency=${spark_dependency} \
-Dkylin.hadoop.conf.dir=${kylin_hadoop_conf_dir} \
-Dspring.profiles.active=${spring_profile} \
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=9001 \
org.apache.hadoop.util.RunJar ${tomcat_root}/bin/bootstrap.jar org.apache.catalina.startup.Bootstrap start >> ${KYLIN_HOME}/logs/kylin.out 2>&1 & echo $! > ${KYLIN_HOME}/pid &
然后在idea中使用远程调试连接服务器的9001端口进行相关调试,当然也可以搭建开发环境来进行本地的调试。