Eclipse下调试HBase程序报“Will not attempt to authenticate using SASL (java.lang.SecurityException : 无法定位登”

        在Eclipse下对操作HBase的程序进行调试时发现日志中有这样一段信息“2014-11-24 10:55:10,575 INFO [org.apache.zookeeper.ClientCnxn] - Opening socket connection to server host191/172.16.18.191:2181. Will not attempt to authenticate using SASL (java.lang.SecurityException : 无法定位登录配置)”,观察程序运行结果貌似正常,由于不愿意看到自己的程序中有这样不完美的日志存在,于是在网上进行搜索,发现有人说zookeeper集群有节点服务不可用时会输出这样的日志,随即检查zookeeper测试集群,发现host191这台机器上的zookeeper服务果然挂了,赶紧启zookeeper服务,再次运行程序发现错误依然存在,说明我的应用不是因为zookeeper的节点故障问题输出这条日志,在网上继续搜索没有发现符合的我情况的内容。

        重新回到eclipse分析日志,从ClientCnxn.java中找相应的日志信息,发现970行,代码片段如下(以下代码都是zookeeper 3.4.6中的代码,其他版本的可能有出入):

           private   void   logStartConnect(InetSocketAddress addr) {//970行
            String msg =   "Opening socket connection to server "   + addr;
              if   ( zooKeeperSaslClient   !=   null ) {
              msg +=   ". "   +   zooKeeperSaslClient   .getConfigStatus();
            }
              LOG .info(msg);
        }
发现这是一个info输出,不影响程序运行,实际情况也证明了这一点,既然已经开始探索究竟了就继续下去吧,于是继续探索;getConfigStatus()方法返回的是ZooKeeperSaslClient的configStatus属性,先看zooKeeperSaslClient属性的初始化代码,发现这个属性是在ClientCnxn.java的内部类SendThread的startConnect()方法中进行,在949行,见如下代码片段:
             if   (ZooKeeperSaslClient.isEnabled()) {
                  try   {
                    String principalUserName = System. getProperty(
                              ZK_SASL_CLIENT_USERNAME ,   "zookeeper"   );
                      zooKeeperSaslClient   =                                  //949行
                          new   ZooKeeperSaslClient(
                                principalUserName+ "/"   +addr.getHostName());
startConnect()方法是一个private方法,在run()方法中被调用,configStatus正是在ZooKeeperSaslClient的构造方法中被赋值的,地第152行,代码如下:
String msg =  "Will not attempt to authenticate using SASL "  ; //152行
                 if  (runtimeException !=  null ) {
                    msg +=  "("  + runtimeException +  ")"   ;
                }  else  {
                    msg +=  "(unknown error)"  ;
                }

从代码上看,输出这条日志的原因是在进行sasl的验证,只是日志打的不地道,把异常也放到了info的日志里。

你可能感兴趣的:(Eclipse下调试HBase程序报“Will not attempt to authenticate using SASL (java.lang.SecurityException : 无法定位登”)