在AWS Glue中使用纯python外部库时HDFS中的权限错误

时间:2017-10-16 22:02:43

标签: python apache-spark amazon-s3 hdfs aws-glue

我尝试运行定制的Python脚本,在AWS Glue上导入外部纯python库(psycopg2)但失败了。我检查了CloudWatch日志,发现失败的原因是:

Spark未能对HDFS中的几个文件夹进行权限检查,其中一个包含我上传到S3的外部python库(s3:// path / to / psycopg2),需要-x权限:

org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=READ_EXECUTE, inode="/user/root/.sparkStaging/application_1507598924170_0002/psycopg2":root:hadoop:drw-r--r--
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:320)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:219)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:190)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1728)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1712)
at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPathAccess(FSDirectory.java:1686)
at org.apache.hadoop.hdfs.server.namenode.FSDirStatAndListingOp.getListingInt(FSDirStatAndListingOp.java:76)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getListing(FSNamesystem.java:4486)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getListing(NameNodeRpcServer.java:999)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getListing(ClientNamenodeProtocolServerSideTranslatorPB.java:634)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:982)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2049)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2045)
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:1698)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2045)

我确保该库仅包含AWS文档中指示的.py文件。

有谁知道出了什么问题?

非常感谢!

3 个答案:

答案 0 :(得分:0)

您有目录,但没有执行权限。在基于Unix的O / S目录中,必须设置执行位(至少对于用户而言)。

运行类似

的内容

sudo chmod +x /user/root/.sparkStaging/application_1507598924170_0002/psycopg2

再试一次。

答案 1 :(得分:0)

仅粘贴支持python的库,即没有任何特定的本机库绑定。

答案 2 :(得分:0)

包psycopg2不是纯Python,所以它不适用于Glue。来自setup.py:

  

如果您希望避免从源代码构建psycopg2,请安装   改为使用PyPI'psycopg2-binary'包。

来自AWS Glue documentation

  

您可以使用Python扩展   模块和库与您的AWS Glue ETL脚本一样长   是用纯Python编写的。像熊猫这样的C库不是   目前支持,也不是其他的扩展   语言。