Kylin在部署的以后需要依赖Hadoop,Hive以及HBase等组件,最近公司内部在部署Kylin服务的时候遇到了不少问题。主要是HBase集群是独立部署的,与Kylin部署的HDFS不是同一个,因此踩了许多坑,这里将遇到的一些问题记录下来,希望能帮助到大家。
Hadoop版本:2.7.3
Hive版本:2.1.1
HBase版本:1.2.6
Kylin版本:2.4.0和2.6.1均有
由于Kylin和HBase在两个不同的HDFS集群,因此为了让Kylin服务可以访问HBase,我们要做如下配置:
在Hadoop的hdfs-sitem.xml中配置HBase所在的HDFS集群的dfs.nameservices和对应的namenode地址,如下所示:
<property>
<name>dfs.nameservices</name>
<value>cluster1,hbase-cluster</value>
</property>
...
<property>
<name>dfs.ha.namenodes.hbase-cluster</name>
<value>hbasenn1,hbasenn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hbase-cluster.hbasenn1</name>
<value>xxx:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hbase-cluster.hbasenn2</name>
<value>xxx:8020</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.hbase-cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
同时,我们还需要在KYLIN_HOME/conf/kylin.properties中配置:
kylin.storage.hbase.cluster-fs=hdfs://hbase-cluster/
问题一 带kerberos的HDFS访问不带kerberos的HDFS
1由于我们的Kylin所以来的HDFS是线上的,所以一般都部署了kerberos作为安全认证,但是HBase是独立部署的,因此HBase所在的HDFS是没有认证方式的,包括HBase本身也没有开启。此时,此时如果直接区访问会有问题,因此需要配置相应的配置项:
在core-site.xml中配置:
<property>
<name>ipc.client.fallback-to-simple-auth-allowed</name>
<value>true</value>
</property>
在hbase-site.xml中配置:
<property>
<name>hbase.ipc.client.fallback-to-simple-auth-allowed</name>
<value>true</value>
</property>
问题二 Failed to specify server's Kerberos principal name
配置完成hadoop的客户端之后,可以通过hadoop fs -ls /命令查看hdfs上的文件,但是在使用kylin提交build任务时,当需要提交mr任务时,会有如下错误发生:
该错误主要是由于客户端没有配置相应的principal导致的,我们在core-site.xml以下参数项:
<property>
<name>local.realm</name>
<value>xxx</value>
</property>
在hdfs-site.xml中加入以下参数项:
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>hdfs/_HOST@${local.realm}</value>
</property>
问题三 Build Dimension Dictionary提示Permission denied: user=xxx, access=xxx
具体错误如上图所示,但是我们实际在检查的时候发现对应的HDFS路径是有权限的,那么为什么这里会提示无权限呢?经过排查发现,这里的HDFS路径指的是HBase集群所在的路径,当前用户无权限做WRITE,而不是指Kylin集群所在的HDFS集群。因此,我们需要在HBase所在的HDFS上创建一个跟kylin.env.hdfs-working-dir配置的一样的路径,并grant给当前用户。
问题四 NoSuchMethodError: org.apache.hadoop.mapred.JVMId
在Build过程中,我们发现如上图所示的错误。经过排查发现,我们依赖的HBase是1.2.6的版本,而在HBASE_HOME/lib/下面会有依赖的hadoop-*-2.5.1.jar,导致在mr任务执行的时候,加载出现了冲突,我们删掉HBASE_HOME/lib/下面的hadoop相关jar,问题解决了。
问题五 MR任务提示OutOfMemoryError: Java heap
在job任务执行的过程中,会有部分map任务执行失败,出现oom的问题,此时我们需要在$KYLIN_HOME/conf/kylin_job_conf.xml中增加关于map任务的相关配置,如下所示:
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx3500M</value>
<description>map max memory</description>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value>
<description>Block replication</description>
</property>
如果build使用的是inmem算法,可修改$KYLIN_HOME/conf/kylin_job_conf_inmem.xml文件。
问题六 在使用Spark构建的时候,提示Servers asks us to fall back to SIMPLE auth
这个问题出现的原因跟问题一一样,但是我们已经配置了,为什么还是会报错呢?主要是因为spark任务在构建的时候,是在服务器端执行的任务,我们本地的配置没有上传上去,因此我们在kylin.env.hadoop-conf-dir中新建一个core-default.xml文件,内容如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>ipc.client.fallback-to-simple-auth-allowed</name>
<value>true</value>
</property>
</configuration>
然后在kylin.properties中增加如下配置项:
kylin.engine.spark-conf.spark.yarn.dist.files=/xxx/hive-site.xml,/xxx/core-default.xml
由于在执行Spark任务的过程中,hive的一些配置信息同样也需要,因此我们也将hive-site.xml加到了该配置项中。 问题七 Kylin进程FULL GC挂掉
Kylin进程默认的JVM参数是相对比较小的,我们需要手动调大一些,在KYLIN_HOME/conf/setenv.sh中,有一个KYLIN_JVM_SETTINGS,修改该参数值即可。
问题八 RetriesExhaustedException: Failed after attempts=1
在执行build过程中,由于HBase的一些原因,会有这种attempts失败,而导致job出现error的问题,但是日志中只有attempts=1,没有再多次数的重试了。hbase.client.retries.number这个参数默认的值是35次,与这里的1次矛盾。
经过排查代码发现,kylin也有一个关于hbase client的重试参数kylin.metadata.hbase-client-retries-number,这个默认值是1,导致了只重试一次就停止了,改成30之后,问题得到解决。
当然实际遇到的问题还不止这些,其他一些比较常见的错误这里就不再列举出来了。后续如果踩到其他的坑,这里也会继续补充和更新,希望能帮到大家。