client.RpcRetryingCaller: Call exception

首先说下场景这个问题出现在Spark将Mysql导入Hbase中时遇到的

Spark 通过 BulkLoad 方式写 hbase
Spark将数据写到 hdfs 后程序很久一直在运行没有退出
但是我在查看Spark_UI界面时所有阶段的人都已经完成了
然后去查看日志,看到程序开在这里

Trying to load hfile=hdfs://cdh-001:8020/tmp/hbase/aliexoress_product_info_detail/1543025754261/cf/73691e487149427694e033e865113e87 first=1000000365010 last=997774731
client.RpcRetryingCaller: Call exception, tries=24, retries=35, started=1705734 ms ago, cancelled=false, msg=row '' on table 'ebay_product_info_detail' at region=ebay_product_info_detail,,1542955264874.94f64f801f2017fe407c087284c826e5., hostname=cdh-005,60020,1542952701760, seqNum=2

卡在那里很久没办法我就把程序kill掉了然后开始找问题
网上找到的答案主要有下面三种

 1. 主机配置错误,找不到hbase的region-server服务器
 2. Hbase表中Hfile损坏,需要修复表
 3. zookeeper配置问题

他们的问题解决方式可能都是对的,以上问题我也都尝试过,但是并不能解决我的问题,
想了很多办法在日志中也没有错误,后来我就让它在哪一直运行一直到 FAILED!再次查看日志出现以下错误

ERROR yarn.ApplicationMaster: User class threw exception:org.apache.hadoop.security.AccessControlException: Permission denied: user=hbase, access=EXECUTE, inode="/user/hdfs":hdfs:supergroup:drwx------
    at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.checkFsPermission(DefaultAuthorizationProvider.java:279)
    at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.check(DefaultAuthorizationProvider.java:260)
    at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.checkTraverse(DefaultAuthorizationProvider.java:201)
    at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.checkPermission(DefaultAuthorizationProvider.java:154)
    at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:152)
    at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:3877)
    at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:3860)
    at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkAncestorAccess(FSDirectory.java:3842)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkAncestorAccess(FSNamesystem.java:6817)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInternal(FSNamesystem.java:2971)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInt(FSNamesystem.java:2889)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:2774)
    at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.create(NameNodeRpcServer.java:610)
    at org.apache.hadoop.hdfs.server.namenode.AuthorizationProviderProxyClientProtocol.create(AuthorizationProviderProxyClientProtocol.java:117)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.create(ClientNamenodeProtocolServerSideTranslatorPB.java:413)
    at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:617)
    at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1073)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2281)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2277)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1920)
    at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2275)

看到上述问题瞬间柳暗花明了,原来是没有权限!
执行代码的用户是hdfs用户生成Hfile的临时目录的拥有者也是hdfs,
但是在执行BulkLoad 操作用户却是Hbase用户,真是叫人头大

解决权限问题:

  一、给予Hbase目录权限
          hdfs dfs -chmod 777 hfile path
  二、执行spark-submit脚本时使用Hbase用户执行 
          sudo -u hbase spark-submit 后面是你的参数
    原文作者:Smile_Laugh
    原文地址: https://www.jianshu.com/p/3cd4633db6c8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞