Spark Standaloneモードでkerberos保護のあるHbaseを操作中にハングアップの問題が発生
1370 ワード
最近では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(){
@Override
public Connection run() {
// TODO Auto-generated method stub
try {
return ConnectionFactory.createConnection(conf);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
});
この修正方法はyarnモードで発生した場合にも有効であるはずです.