Hadoop的Job执行MR的时候抛AccessControlException异常,详情如下:
org.apache.hadoop.hdfs.DFSClient: Short circuit access failed
org.apache.hadoop.security.AccessControlException:
org.apache.hadoop.security.AccessControlException: Can't continue with getBlockLocalPathInfo() authorization.
The user XXX is not allowed to call getBlockLocalPathInfo
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
产生问题的原因定位:
org.apache.hadoop.hdfs.server.datanode.DataNode;
public BlockLocalPathInfo getBlockLocalPathInfo(Block block,
Token<BlockTokenIdentifier> token) throws IOException ;
具体的执行如下:
private boolean shouldTryShortCircuitRead(InetSocketAddress targetAddr)
throws IOException {
if (shortCircuitLocalReads && isLocalAddress(targetAddr)) {
return true;
}
return false;
}
1.读取DFSConfigKeys.DFS_CLIENT_READ_SHORTCIRCUIT_KEY对应的值如果是true那么走getLocalBlockReader(...)如果是false那么走getBlockReader(...)
2.如果走getLocalBlockReader(...)那么需要通过BlockReaderLocal.newBlockReader(...)创建BlockReader
3.执行getBlockPathInfo(...)的时候会执行DataNode的getBlockLocalPathInfo方法从而在checkBlockLocalPathAccess的时候告知权限不足.
解决方式:
1.直接禁用
conf.setBoolean(DFSConfigKeys.DFS_CLIENT_READ_SHORTCIRCUIT_KEY, false);
本文针对Hadoop MapReduce作业执行过程中出现的AccessControlException异常进行详细解析,并提供了解决该问题的具体步骤。异常发生在尝试使用短路读取机制时,涉及DataNode的getBlockLocalPathInfo方法权限验证失败。
4423

被折叠的 条评论
为什么被折叠?



