Spark Standaloneモードでkerberos保護のあるHbaseを操作中にハングアップの問題が発生

1370 ワード

最近ではsparkを使用してhbaseを読み込む際、hadoopクラスタにkerberosが配置されているため、手形でアクセスしなければならないが、実際に使用するとハングアップの問題が発生し、どの操作(GET,PUT,SCAN)も長時間ブロックされ、最後にsocketタイムアウト異常が投げ出された.デバッグを経て、非sparkプログラムで使用しても問題なく、さらに手形と構成方法に問題がないことを確定し、深く調べることでspark-submitプロセス内にも問題はなく、タスクが配布された後、つまりexecutorプロセスでのみ発生することがわかります.
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モードで発生した場合にも有効であるはずです.