【大数据】HBase常见问题及解决方案总结(一)

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文件系统的端口号不一致!

5. 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.(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使用过程中爬过的坑~
————————————————
版权声明:本文为CSDN博主「new个对象先」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40861707/article/details/79979491

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值