2015-05-12 4 views
1

Я выполняю distcp между двумя разными кластерами. Я делаю это выборочно, поэтому он идет в файле на файл. Разрешения в обоих кластерах одинаковы. Пользователь, выполняющий distcp, тот же (названный как xxx в примере). У меня возникает проблема при копировании, которая запрашивает разрешения на выполнение ... для файла!distcp - ошибка разрешения выполнения доступа для файла HDFS

Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=xxx, access=EXECUTE, inode="/mypath/myfile":xxx:xxx:-rw-r--r-- 
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:205) 
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:161) 
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:128) 
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:4684) 
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkTraverse(FSNamesystem.java:4660) 
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:2911) 
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getFileInfo(NameNodeRpcServer.java:673) 
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getFileInfo(ClientNamenodeProtocolServerSideTranslatorPB.java:643) 
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java:44128) 
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(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:1695) 
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1691) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:396) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408) 
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1689) 

at org.apache.hadoop.ipc.Client.call(Client.java:1225) 
at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:202) 
at $Proxy10.getFileInfo(Unknown Source) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:164) 
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:83) 
at $Proxy10.getFileInfo(Unknown Source) 
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileInfo(ClientNamenodeProtocolTranslatorPB.java:628) 
at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:1545) 
... 13 more 

2015-05-11 10:22:49,005 INFO org.apache.hadoop.mapred.TaskLogsTruncater: Initializing logs' truncater with mapRetainSize=-1 and reduceRetainSize=-1 
2015-05-11 10:22:49,008 ERROR org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException as:xxx (auth:SIMPLE) cause:java.io.IOException: Copied: 0 Skipped: 0 Failed: 1 
2015-05-11 10:22:49,008 WARN org.apache.hadoop.mapred.Child: Error running child 
java.io.IOException: Copied: 0 Skipped: 0 Failed: 1 
at org.apache.hadoop.tools.DistCp$CopyFilesMapper.close(DistCp.java:582) 
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:57) 
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:418) 
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:333) 
at org.apache.hadoop.mapred.Child$4.run(Child.java:268) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:396) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408) 
at org.apache.hadoop.mapred.Child.main(Child.java:262) 
2015-05-11 10:22:49,013 INFO org.apache.hadoop.mapred.Task: Runnning cleanup for the task 

где xxx - мой пользователь.

Файл в целевом кластере имеет rw-r - r-- разрешения, а папка имеет rwxr-xr-x. Файл в исходном кластере имеет rw-r-r-- разрешения, а папка имеет rwxrwxrwx.

Итак, это правда, у файла нет разрешений на выполнение.

Но почему distcp запрашивает разрешения на выполнение для файла? В HDFS, предположительно, разрешения на выполнение для файлов не влияют. Distcp documentation ничего не говорит о необходимости разрешения на выполнение.

Примечание: Я использую опцию -overwrite в своем distcp - ничего больше. Использование CDH4.2.1 с distcp версии 1.

ответ

1

Видимо, это недокументированная особенность на том, как distcp ручки каталогов. distcp не будет понимать файл назначения как файл, а как каталог. Если файл существует, он пытается получить к нему доступ в качестве каталога, когда это файл. Следовательно, он выходит из строя из-за выполнения разрешений.

Однако, distcp v1 dev и поддержка были прекращены в пользу distcp v2 (который является полным переписанием), который заменяет distcp на CDH5. Эта ошибка и другие действия, связанные с обработкой каталогов, были изменены на более интуитивно понятную * nix-подобную схему.

0

ли это в терминале:

$HADOOP_HOME/bin/hdfs dfs -chmod -R 777 /mypath/myfile 

Теперь, проверьте права доступа к файлу. Оно должно быть с исполнением право тоже:

$HADOOP_HOME/bin/hdfs dfs -ls /mypath/myfile 
+0

Конечно, но вопрос шире: почему distcp запрашивает разрешения на выполнение? Действительно ли они нужны, и если да, то почему? Ваш ответ направлен на «изменение прав доступа». Я не могу принять этот ответ. – xmar