My Profile Photo

Guardian's Blog


There are many things that need to be done step by step


HBase独立集群的Kylin搭建问题记录

1. 前言

前两天在公司现有集群上搭建一个Kylin服务,由于HBase是一个独立集群,所以搭建的过程中遇到了各种问题,这里把过程中遇到的问题记录一下,对Kylin本身和基本配置不做介绍,想了解Kylin介绍的可以去Kylin官网。相关组件版本说明如下:

JDK:1.7.0_67
HBase:1.0.1.1
Kylin:1.5.1
Hive:1.2.1
Hadoop:2.6.0


2. 额外配置

首先由于HBase是独立集群的原因,所以本身需要一些额外的配置,根据官网的说法,有以下2点需要做额外配置。

2.1 HBase独立集群的HDFS指定

kylin.properties中的 kylin.hbase.cluster.fs设置为hdfs://hbase-cluster-nn01.example.com:8020,如果HBase集群中设置了NN-HA相关的配置则可以将这个值设为hdfs://hbase-cluster

2.2 合并2个集群中与NN-HA有关的配置

需要将2个集群中与NN-HA有关的配置写入kylin_job_conf.xml,例子如下:

   <property>
        <name>dfs.nameservices</name>
        <value>cluster1,cluster2</value>
    </property>
    <property>
        <name>dfs.ha.namenodes.cluster1</name>
        <value>nn1,nn2</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.cluster1.nn1</name>
        <value>cluster1-server1:8020</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.cluster1.nn1</name>
        <value>cluster1-server1:50070</value>
    </property>
    <property>
        <name>dfs.namenode.servicerpc-address.cluster1.nn1</name>
        <value>cluster1-server1:54321</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.cluster1.nn2</name>
        <value>cluster1-server2:8020</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.cluster1.nn2</name>
        <value>cluster1-server2:50070</value>
    </property>
    <property>
        <name>dfs.namenode.servicerpc-address.cluster1.nn2</name>
        <value>cluster1-server2:54321</value>
    </property>
    <property>
        <name>dfs.client.failover.proxy.provider.cluster1</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
        <name>dfs.ha.namenodes.cluster2</name>
        <value>nn1,nn2</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.cluster2.nn1</name>
        <value>cluster2-server1:8020</value>
    </property>
    <property>
         <name>dfs.namenode.http-address.cluster2.nn1</name>
         <value>cluster2-server1:50070</value>
    </property>
    <property>
         <name>dfs.namenode.servicerpc-address.cluster2.nn1</name>
         <value>cluster2-server1:54321</value>
    </property>
    <property>
         <name>dfs.namenode.rpc-address.cluster2.nn2</name>
         <value>cluster2-server2:8020</value>
     </property>
     <property>
         <name>dfs.namenode.http-address.cluster2.nn2</name>
         <value>cluster2-server2:50070</value>
     </property>
     <property>
         <name>dfs.namenode.servicerpc-address.cluster2.nn2</name>
         <value>cluster2-server2:54321</value>
     </property>
     <property>
         <name>dfs.client.failover.proxy.provider.cluster2</name>
         <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
     </property>


3. MR任务提交到主集群

按照官方的说明配置好后启动Kylin构建cube的过程中第二步 Extract Fact Table Distinct 就会有问题,你会发现Kylin默认将MR任务提交到了独立的HBase集群上,这显然不是我们预期的,预想的流程应该是从Hive中读取数据后再主集群中完成各种MR任务最后写入HBase集群。所以在网上一番搜寻后发现问题出在Kylin的kylin.sh中,在这个shell文件中可以看到Kylin所有任务的提交都是通过hbase这个shell脚本来完成的,所以RM任务提交时默认是读取的HBase的classpath中Hadoop配置文件目录,所以需要在Kylin使用hbase脚本启动MR之前在HBase的classpath前加上主集群的Hadoop配置文件目录。这里我图省事没有在kylin.sh中取找地方添加,而是直接在hbase这个shell文件中添加了如下脚本:

if [ "$HBASE_CLASSPATH_PREFIX" != "" ]; then
  HBASE_CLASSPATH_PREFIX=${YOUR_HADOOP_HOME}/etc/hadoop:${HBASE_CLASSPATH_PREFIX}
else
  HBASE_CLASSPATH_PREFIX=${YOUR_HADOOP_HOME}/etc/hadoop
fi


4. 连接不上Resourcemanager

如果kylin.log中报如下错误则说明连接不上集群的Resourcemanager

yarn.resourcemanager.webapp.address:http://0.0.0.0:8088 and java.net.ConnectException: Connection refused

解决方案为在kylin.properties中添加如下内容

kylin.job.yarn.app.rest.check.status.url=http://YOUR_RM_NODE:8088/ws/v1/cluster/apps/${job_id}?anonymous=true


5. tmp目录权限问题

Kylin默认使用hadoop.tmp.dir目录来存储临时文件,可以在kylin_job_conf.xml中将其值设置为YOUR_PATH并确认2个集群中都存在此目录,且启动Kylin的用户对其有写权限。


6. HBase命名空间问题

目前Kylin还不支持配置HBase的命名空间,所以默认在HBase 中的default下创建表,这个问题目前只能等Kylin更新或者手动修改源码重新编译来解决。顺带一提,kylin.metadata.url是支持命名空间的,可以设置为带命名空间的地址。


7.补充(2017-01-04)

之前配置好后建立cube没有问题,但是查询报找不到方法的错误如下:

Caused by: java.lang.NoSuchMethodError: 
org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment.getRegion()Lorg/apache/hadoop/hbase/regionserver/Region;

解决方案如下: 重新编译HBase1.0.1.1版本的Kylin部署后再执行下面的脚本即可,相关链接,可以自行编译或者在链接的相关回答中找到有已编译好的1.5.3版本的Kylin下载链接直接下载使用。

$KYLIN_HOME/bin/kylin.sh org.apache.kylin.storage.hbase.util.DeployCoprocessorCLI $KYLIN_HOME/lib/kylin-coprocessor-*.jar all






其他参考资料

Apache Kylin - hive and hbase use different hdfs
Apache Kylin | FAQ
Leverage HBase Namespace to isolate Kylin HTables