`
小网客
  • 浏览: 1217782 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

AccessControlException: Can't continue with getBlockLocalPathInfo()解决方案

 
阅读更多

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);

 

 

0
1
分享到:
评论
2 楼 小网客 2014-11-19  
恩 双刃剑,看安全机制的要求了
gwgyk 写道
关于dfs.client.read.shortcircuit设为true,这样Map Task在读本地文件块的时候就不会通过DataNode,而是直接从本地读,效率大大提高。
不过我在debug的时候,如果将其设为true,也的确会出现上面的错误。

1 楼 gwgyk 2014-11-19  
关于dfs.client.read.shortcircuit设为true,这样Map Task在读本地文件块的时候就不会通过DataNode,而是直接从本地读,效率大大提高。
不过我在debug的时候,如果将其设为true,也的确会出现上面的错误。

相关推荐

Global site tag (gtag.js) - Google Analytics