在纱线群集模式AccessControlException上执行Spark

时间:2017-07-12 03:33:07

标签: hadoop apache-spark

我有一些Spark代码可以分析CSV文件中的Input数据集。

当我在群集模式下运行时,我收到以下错误(在本地模式下,它到目前为止工作正常)。

我的问题是:

  1. 本地变量是否影响不同工作人员的并行执行?
  2. 我使用localfile作为输入。我必须使用HDFS文件吗?
  3. 我相信RDD是并行化的,输入文件可以存储在本地文件系统中。

    Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=xxx, access=WRITE, inode="/":hdfs:supergroup:drwxr-xr-x
         at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.checkFsPermission(DefaultAuthorizationProvider.java:257) 
         at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.check(DefaultAuthorizationProvider.java:238) 
         at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.check(DefaultAuthorizationProvider.java:216) 
         at org.apache.hadoop.hdfs.server.namenode.DefaultAuthorizationProvider.checkPermission(DefaultAuthorizationProvider.java:145) 
         at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:138) 
         at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:6599) 
         at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:6581) 
         at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkAncestorAccess(FSNamesystem.java:6533) 
         at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirsInternal(FSNamesystem.java:4337) 
         at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirsInt(FSNamesystem.java:4307) 
         at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesystem.java:4280) 
         at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.mkdirs(NameNodeRpcServer.java:853) 
         at org.apache.hadoop.hdfs.server.namenode.AuthorizationProviderProxyClientProtocol.mkdirs(AuthorizationProviderProxyClientProtocol.java:321) 
         at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.mkdirs(ClientNamenodeProtocolServerSideTranslatorPB.java:601) 
         at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) 
         at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:619) 
         at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1060)
         at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2044)
         at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2040)
         at java.security.AccessController.doPrivileged(Native Method)
    

1 个答案:

答案 0 :(得分:0)

根目录inode="/"hdfssupergroup用户所有,其Unix权限为drwxr-xr-x(755)

您的user=xxx显然不是hdfs用户,也不属于superuser群组....

这是基于Unix的所有权限,并且与Spark无关。

您的解决方案

  1. (首选)了解如何将xxx用户添加到superuser,将这些组权限复制到群集中的所有数据节点和名称节点。
  2. hdfs用户身份运行您的代码。
  3. 最后的手段)以HDFS 775或777权限制作所有内容
  4. 回答你的问题。

      

    局部变量是否会影响不同工作人员的并行执行?

    所有Spark执行器都有自己独立的局部变量。广播变量是您必须设置为共享的变量。

      

    我是否必须使用HDFS文件?

    不,但如果不这样做,所有Spark工作人员必须能够在他们自己的本地文件系统上读取完全相同的文件。
    或者您可以设置其他一些共享文件系统,如S3,(S)FTP或NFS。