首先说下场景这个问题出现在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 后面是你的参数