hbase常见问题及解决方案总结(一)
使用hbase已经有一段时间,无论是在linux还是使用java api,大多数的问题…都没有进行整理,为了加强记忆,现在列举出曾一些我曾经踩过的坑,希望能对读者有些帮助
1. 创建表格失败,提示信息如下:
org.apache.hadoop.hbase.security.AccessDeniedException: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions for user 'mingtong' (action=create)
at org.apache.ranger.authorization.hbase.AuthorizationSession.publishResults(AuthorizationSession.java:261)
at org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor.authorizeAccess(RangerAuthorizationCoprocessor.java:595)
at org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor.requirePermission(RangerAuthorizationCoprocessor.java:664)
at org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor.preCreateTable(RangerAuthorizationCoprocessor.java:769)
at org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor.preCreateTable(RangerAuthorizationCoprocessor.java:496)
at org.apache.hadoop.hbase.master.MasterCoprocessorHost$11.call(MasterCoprocessorHost.java:222)
at org.apache.hadoop.hbase.master.MasterCoprocessorHost.execOperation(MasterCoprocessorHost.java:1146)
at org.apache.hadoop.hbase.master.MasterCoprocessorHost.preCreateTable(MasterCoprocessorHost.java:218)
at org.apache.hadoop.hbase.master.HMaster.createTable(HMaster.java:1603)
at org.apache.hadoop.hbase.master.MasterRpcServices.createTable(MasterRpcServices.java:462)
at org.apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$2.callBlockingMethod(MasterProtos.java:57204)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2127)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:107)
at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:133)
at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:108)
at java.lang.Thread.run(Thread.java:748)
at sun.reflect.GeneratedConstructorAccessor15.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
可能导致该问题的原因:
linux最常见的权限问题:
当前使用的账户没有建表权限
解决方法: 用权限更高的账户对该用户进行赋权
另一个可能就是namespace命名空间的限制:也就是说只有按照ns的格式来创建表格,例如: create 'nc_table:table','info'
注意: nc_table是一个已经存在的nc
2. 拒绝连接!
第一个解决思路:去zookeeper conf/zoo.cfg配置文件查看
这里有两个目录:一个是数据目录dataDir,一个是日志目录dataLogDir,
使用cd命令,能不能进入这两个目录下面,如果可以进去,就证明无误
如果提示: 没有那个文件或目录,就使用mkdir命令创建这两个文件夹即可
vim /etc/hosts 查看主机名配置是否正确
如果使用和配置有误,进行修改
使用上述办法不能解决:
关闭防火墙
centOS6使用chkconfig iftables off 永久关闭防火墙
service iptables stop 临时关闭防火墙
centOS7 默认的使用firewall作为防火墙
1、关闭firewall:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)
防火墙已经关闭,问题还没有解决,有可能是账户的问题,不妨切换账户试一下
端口号的问题: zookeeper默认的端口号是2181,但不是所有的都是使用这个端口号!比如我们的!
去 hbase-site.xml里面查看:
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>4180</value>
<description>Property from ZooKeeper's config zoo.cfg.
The port at which the clients will connect.
</description>
</property>
改变代码里面设置的端口号,问题得到解决!!
一个最坑的可能原因就是集群节点的时间不同步,hbase,和zookeeper对时间的要求很高!!好像是误差要在180s
最好的方式就是对整个集群配置时钟同步,或者是使用date命令为每个节点修改时间
以上方案都尝试过,问题仍然不能解决,就重启hbase,和zookeeper试试吧
zookeeper如果上次没有被正常关闭的话,很容易影响到下一次的使用
3. 与hbase相关jar包找不到的问题
Error: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.client.ConnectionFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at mastercom.cn.bigdata.util.hbase.HbaseDBHelper.getConnection(HbaseDBHelper.java:50)
at mapr.mro.loc.MroLableFileReducers$MroDataFileReducers.setup(MroLableFileReducers.java:43)
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:168)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:627)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:389)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
解决方法: 1. 打jar包的时候直接把相应的jar包打进来,这样能够解决问题,但是jar包会有200多M
2. 在执行jar包前执行 export HADOOP_CLASSPATH=$HBASE_HOME/lib/*:classpath,简单有效,但是如果创建hbase连接的操作是在map,reduce里,这种方法依然会报错
3. 在hadoop-env.sh里面,引入hbase的lib目录:操作如下: export HADOOP_CLASSPATH=$HBASE_HOME/lib/*:$HADOOP_CLASSPATH
所有的节点都要修改,修改完后要重启集群
4. 将$HBASE_HOME/lib目录下的jar包导入到$HADOOP_HOME/lib目录下,但这样很容易引起jar包冲突,不推荐
4.jdk版本冲突的问题
我的eclipse使用的是jdk1.8, 集群上的jdk配置的是1.7,jar包丢到集群上报错:
java.lang.UnsupportedClassVersionError: PR/Sort : Unsupported major.minor version 52.0
解决方法: 很简单,使用集群里对应的jdk版本编译就好了
右键项目-->BuildPath -->Configure Build Path --> Java Compiler --->将版本调整成为集群里面对应的版本即可-->apply
重新打jar包,放到集群上跑,问题得到解决
5.运行hbase shell 输入 list,等基本语句报错
ERROR: Can't get master address from ZooKeeper; znode data == null
Here is some help for this command:
List all tables in hbase. Optional regular expression parameter could
be used to filter the output. Examples:
hbase> list
hbase> list 'abc.*'
hbase> list 'ns:abc.*'
hbase> list 'ns:.*'
可能原因: 1. 时间不同步, hbase集群所有莫名其妙的问题都有可能是时间不同步导致的!!!一定要注意!!
2. hbase-site.xml里面的hbase.rootdir对应的ip与core-site.xml中的fs.defaultFS中的路径不同,或者是与hdfs文件系统的端口号不一致!
6. LZO压缩的问题:(这个是自己搭着玩儿的集群上遇到的问题)
Exception in thread "main" java.lang.IllegalArgumentException: Compression codec com.hadoop.compression.lzo.LzoCodec not found.
at org.apache.hadoop.io.compress.CompressionCodecFactory.getCodecClasses(CompressionCodecFactory.java:135)
at org.apache.hadoop.io.compress.CompressionCodecFactory.<init>(CompressionCodecFactory.java:175)
at org.apache.hadoop.mapreduce.lib.input.TextInputFormat.isSplitable(TextInputFormat.java:58)
at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.java:397)
at org.apache.hadoop.mapreduce.JobSubmitter.writeNewSplits(JobSubmitter.java:597)
at org.apache.hadoop.mapreduce.JobSubmitter.writeSplits(JobSubmitter.java:614)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:492)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1296)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1293)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:1293)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1314)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Caused by: java.lang.ClassNotFoundException: Class com.hadoop.compression.lzo.LzoCodec not found
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:1980)
at org.apache.hadoop.io.compress.CompressionCodecFactory.getCodecClasses(CompressionCodecFactory.java:128)
... 20 more
解决的方案:由于是自己搞着玩的集群,就直接简单粗暴的将core-site.xml和mapred-site.xml中所有涉及到LZO压缩的地方暴力删除,重启集群,正式集群不要尝试
6.java.net.UnknownHostException: unknown host:gp-noe02异常解决办法
windows下开发HBase应用程序,HBase部署在linux环境中,在运行调试时可能会出现无法找到主机,类似异常信息如下:
java.net.UnknownHostException: unknown host: gp-node02
解决办法如下:
在C:\WINDOWS\system32\drivers\etc\hosts文件中添加如下信息:
在linux 的 /etc/hosts也要添加该行信息
192.168.137.139 gp-node02
7. 堆内存溢出的问题
java.lang.OutOfMemoryError
从错误本身可以发现是堆错误,很明显是设置的值太小而导致这样错误。
在hadoop开始配置的时候,在hadoop/etc/hadoop/目录下的hadoop-env.sh文件中
export HADOOP_HEAPSIZE=
是被注释掉的,查看上面的注释,这个值默认为1000,单位为Mb
这里去掉注释,修改为4000,需要注意的是这里要根据内存大小来选择值
export HADOOP_HEAPSIZE=4000
8. 表名找不见的问题
org.apache.hadoop.hbase.TableNotFoundException: ns_wangyou.simu_out_GuangXi
at org.apache.hadoop.hbase.client.HBaseAdmin.getTableDescriptor(HBaseAdmin.java:572)
at org.apache.hadoop.hbase.client.HTable.getTableDescriptor(HTable.java:574)
at org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.configureIncrementalLoad(HFileOutputFormat2.java:372)
at mastercom.cn.hbase.helper.AddPaths.addConfigJob(AddPaths.java:212)
at mastercom.cn.hbase.config.HbaseBulkloadConfigMain.CreateJob(HbaseBulkloadConfigMain.java:101)
at mastercom.cn.hbase.config.HbaseBulkloadConfigMain.main(HbaseBulkloadConfigMain.java:109)
这个问题最简单,很明显是查询的hbase数据库里面没有相应的表名导致的
检查输入的表名是否正确, 如果正确的话,去创建相应的表即可
今天先介绍到这里,后面继续介绍我在hbase使用过程中爬过的坑~