Spark Standalone模式下操作有kerberos保护的Hbase时出现挂死的问题
2016-03-16 16:02
447 查看
最近在使用spark读取hbase时,因为hadoop集群配置了kerberos,所以必须通过票据进行访问,但是在实际使用时却出现了挂死问题,任何操作(GET,PUT,SCAN)都会长时间阻塞,最后抛出socket超时异常。经过调试,非spark程序中使用没问题,进而确定了票据和配置方法没有问题,通过深入排查,发现spark-submit进程内也是没有问题的,只有当任务分发出去后,也就是在executor进程中才会出现。
通过查阅spark executor的源代码,发现其中的SparkHadoopUtil.scala中用到了如下代码
修改方式如下,以前的配置方法不变,调用loginUserFromKeytabAndReturnUGI返回ugi,调用ugi的doAs,在其中创建hbase的链接。
该修改方法应该也对yarn模式下出现的此情况有效。
通过查阅spark executor的源代码,发现其中的SparkHadoopUtil.scala中用到了如下代码
def runAsSparkUser(func: () => Unit) { val user = Utils.getCurrentUserName() logDebug("running as user: " + user) val ugi = UserGroupInformation.createRemoteUser(user) transferCredentials(UserGroupInformation.getCurrentUser(), ugi) ugi.doAs(new PrivilegedExceptionAction[Unit] { def run: Unit = func() }) }spark的executor进程本身已经通过doAs做过一次用户的设置了,于是只能对访问hbase kerberos的方式进行修改。
修改方式如下,以前的配置方法不变,调用loginUserFromKeytabAndReturnUGI返回ugi,调用ugi的doAs,在其中创建hbase的链接。
ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI("xxx", keyStr); _conn = ugi.doAs(new PrivilegedAction<Connection>(){ @Override public Connection run() { // TODO Auto-generated method stub try { return ConnectionFactory.createConnection(conf); } catch (IOException e) { e.printStackTrace(); } return null; } });
该修改方法应该也对yarn模式下出现的此情况有效。
相关文章推荐
- iOS获取通讯录功能
- 将DJANGO管理界面的filter_horizontal移到前面来复用
- if 判断中出现逗号
- linux 进程的虚拟地址和内核中的虚拟地址有什么关系
- gcc
- 小米2S手机开启开发者选项
- nexus搭建maven私服(二)
- jQuery ajax - ajax() 方法
- ibatis的cacheModel
- Android模仿表单上传文件
- android上传图片(及普通参数)到服务器(j2ee后台服务器,ssh框架)
- MySQL行级锁
- 相册效果(imageswitch与gallery)
- Android之判断手机是否联网
- Python模块学习:urllib
- eclipse关闭项目
- maven传递性依赖
- 并发编程(7)线程安全与非线程安全/同步与非同步
- 配置Cisco 路由器的静态路由
- hihoCoder 矩形判断