【问题标题】:Combining HBase and HDFS results in Exception in makeDirOnFileSystem结合 HBase 和 HDFS 导致 makeDirOnFileSystem 中的异常
【发布时间】:2014-06-09 08:41:11
【问题描述】:

简介

尝试结合 HBase 和 HDFS 会导致以下结果:

2014-06-09 00:15:14,777 WARN org.apache.hadoop.hbase.HBaseFileSystem: Create Dir
ectory, retries exhausted
2014-06-09 00:15:14,780 FATAL org.apache.hadoop.hbase.master.HMaster: Unhandled
exception. Starting shutdown.
java.io.IOException: Exception in makeDirOnFileSystem
        at org.apache.hadoop.hbase.HBaseFileSystem.makeDirOnFileSystem(HBaseFile
System.java:136)
        at org.apache.hadoop.hbase.master.MasterFileSystem.checkRootDir(MasterFi
leSystem.java:428)
        at org.apache.hadoop.hbase.master.MasterFileSystem.createInitialFileSyst
emLayout(MasterFileSystem.java:148)
        at org.apache.hadoop.hbase.master.MasterFileSystem.<init>(MasterFileSyst
em.java:133)
        at org.apache.hadoop.hbase.master.HMaster.finishInitialization(HMaster.j
ava:572)
        at org.apache.hadoop.hbase.master.HMaster.run(HMaster.java:432)
        at java.lang.Thread.run(Thread.java:744)
Caused by: org.apache.hadoop.security.AccessControlException: Permission denied:
 user=hbase, access=WRITE, inode="/":vagrant:supergroup:drwxr-xr-x
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPe
rmissionChecker.java:224)
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPe
rmissionChecker.java:204)
        at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermi
ssion(FSPermissionChecker.java:149)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(F
SNamesystem.java:4891)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(F
SNamesystem.java:4873)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkAncestorAcce
ss(FSNamesystem.java:4847)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirsInternal(FS
Namesystem.java:3192)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirsInt(FSNames
ystem.java:3156)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesyst
em.java:3137)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.mkdirs(NameN
odeRpcServer.java:669)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTra
nslatorPB.mkdirs(ClientNamenodeProtocolServerSideTranslatorPB.java:419)
        at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$Cl
ientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java:4497
0)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.cal
l(ProtobufRpcEngine.java:453)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1002)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1752)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1748)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInforma
tion.java:1438)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1746)

        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstruct
orAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingC
onstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
        at org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteExce
ption.java:90)
        at org.apache.hadoop.ipc.RemoteException.unwrapRemoteException(RemoteExc
eption.java:57)
        at org.apache.hadoop.hdfs.DFSClient.primitiveMkdir(DFSClient.java:2153)
        at org.apache.hadoop.hdfs.DFSClient.mkdirs(DFSClient.java:2122)
        at org.apache.hadoop.hdfs.DistributedFileSystem.mkdirs(DistributedFileSy
stem.java:545)
        at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:1915)
        at org.apache.hadoop.hbase.HBaseFileSystem.makeDirOnFileSystem(HBaseFile
System.java:129)
        ... 6 more

而配置和系统设置如下:

[vagrant@localhost hadoop-hdfs]$ hadoop fs -ls hdfs://localhost/
Found 1 items
-rw-r--r--   3 vagrant supergroup 1010827264 2014-06-08 19:01 hdfs://localhost/u
buntu-14.04-desktop-amd64.iso
[vagrant@localhost hadoop-hdfs]$

/etc/hadoop/conf/core-site.xml

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:8020</value>
  </property>
</configuration>

/etc/hbase/conf/hbase-site.xml

<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://localhost:8020/hbase</value>
  </property>
  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>
</configuration>

/etc/hadoop/conf/hdfs-site.xml

<configuration>
  <property>
    <name>dfs.name.dir</name>
    <value>/var/lib/hadoop-hdfs/cache</value>
  </property>
  <property>
    <name>dfs.data.dir</name>
    <value>/tmp/hellodatanode</value>
  </property>
</configuration>

NameNode 目录权限

[vagrant@localhost hadoop-hdfs]$ ls -ltr /var/lib/hadoop-hdfs/cache
total 8
-rwxrwxrwx. 1 hbase hdfs   15 Jun  8 23:43 in_use.lock
drwxrwxrwx. 2 hbase hdfs 4096 Jun  8 23:43 current
[vagrant@localhost hadoop-hdfs]$

如果fs.defaultFS 属性已在core-site.xml 中注释,则HMaster 可以启动

NameNode 正在收听

[vagrant@localhost hadoop-hdfs]$ netstat -nato | grep 50070
tcp        0      0 0.0.0.0:50070               0.0.0.0:*                   LIST
EN      off (0.00/0/0)
tcp        0      0 33.33.33.33:50070           33.33.33.1:57493            ESTA
BLISHED off (0.00/0/0)

导航至http://33.33.33.33:50070/dfshealth.jsp即可访问。

问题

如何解决makeDirOnFileSystem异常让HBase连接HDFS?

【问题讨论】:

    标签: linux hadoop hbase hdfs


    【解决方案1】:

    您只需要知道堆栈跟踪的这一行:

    原因:org.apache.hadoop.security.AccessControlException:权限被拒绝: user=hbase, access=WRITE, inode="/":vagrant:supergroup:drwxr-xr-x

    用户 hbase 没有写入 HDFS 根目录 (/) 的权限,因为它归 vargrant 所有,并且设置为只允许所有者写入。

    使用hadoop fs -chmod 修改权限。

    编辑:

    您还可以成功创建目录/hbase 并将hbase 用户设置为所有者。这样您就不必允许hbase 写入根目录。

    【讨论】:

    • 在执行hadoop fs -chmod 777 /hbase 和随后的sudo service hbase-master start 之后,HMaster 能够重新启动。谢谢你的回答。
    • 执行sudo hadoop fs -chown hbase:hbase /hbase 会导致chown: changing ownership of '/hbase': Non-super user cannot change owner。通过执行sudo su 更改为超级用户并重试更改所有权 /hbase 后,会出现相同的消息。您能否指出是否可以使用hadoop fs -chown hbase:hbase /hbase 更改/hbase 目录的所有权?
    • 执行 hadoop fs -mkdir /hbase 不足以解决问题。此步骤也需要使用hadoop fs -chown hbase:hbase /hbase 更改目录的权限。
    • This Q&A 解决了权限问题。 sudo -u hdfs hadoop fs -chown hbase:hbase /hbase 有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    相关资源
    最近更新 更多