Window中调试HBase问题小结

  1.好久没用log4j了,转到logback好多年了,hbase程序运行时,报缺少log4j配置,那么,就转去logback吧(以下的XXX表示版本号)。

  原先lib包里面有log4j-XXX.jar、slf4j-api-XXX.jar、slf4j-log4j12-XXX.jar,干掉log4j-XXX.jar和slf4j-log4j12-XXX.jar,加入jcl-over-slf4j-XXX.jar,log4j-over-slf4j-XXX.jar、logback-classic-XXX.jar、logback-core-XXX.jar,至于原先的slf4j-api这个包,可以顺手替换成新的,然后,加入一个logback.xml到classpath下

<?xml version="1.0" encoding="UTF-8"?>

<!-- For assistance related to logback-translator or configuration  -->
<!-- files in general, please contact the logback user mailing list -->
<!-- at http://www.qos.ch/mailman/listinfo/logback-user             -->
<!--                                                                -->
<!-- For professional support please see                            -->
<!--    http://www.qos.ch/shop/products/professionalSupport         -->
<!--                                                                -->
<configuration scan="true" scanPeriod="120 seconds" debug="false">
  <appender name="FileApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!--See also http://logback.qos.ch/manual/appenders.html#RollingFileAppender-->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>WARN</level>
    </filter>
    <File>log/HBaseClient.log</File>
    <encoder>
      <pattern>%d [%t] %-5p %c - %m%n</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <maxIndex>10</maxIndex>
      <FileNamePattern>log/HBaseClient.log.%i</FileNamePattern>
    </rollingPolicy>
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <MaxFileSize>1024KB</MaxFileSize>
    </triggeringPolicy>
  </appender>
  <appender name="ConApp" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d [%t] %-5p %c - %m%n</pattern>
    </encoder>
  </appender>
  <root level="ERROR">
      <appender-ref ref="ConApp"/>
    <appender-ref ref="FileApp"/>
  </root>
</configuration>

  这样,log4j和系统的日志系统就被logback接管了,至于为啥不用log4j,用logback,这个。。。自己去看吧,有空我可能会写点啥,logback有点小bug,就是有的linux系统下会找不到配置文件,以前修复过,不知道新版本有处理掉没。

  2.Could not locate executable null\bin\winutils.exe in the Hadoop binaries

  老掉牙的问题了,系统变量设置HADOOP_HOME,我还是不想去设置环境变量,还是一行代码来得快

System.setProperty("hadoop.home.dir", "G:/hadoop/hadoop-2.4.1");

  3.程序运行正常,但是当log级别改为Info时,突然发现了这么一条

2014-08-04 16:19:22,942 [main-SendThread(Master:2222)] INFO  org.apache.zookeeper.ClientCnxn - Opening socket connection to server Master/192.168.117.128:2222. Will not attempt to authenticate using SASL (java.lang.SecurityException: 无法定位登录配置)

  看到个Exception,什么情况?觉得哪里不对,但是程序又是一切正常的。

  搜索了一通,发现好多一样的问题,但是貌似和我的没啥关系,别人是程序跑不通,我是程序正常得很。

  有说是zookeeper版本不一致的,我看了下hadoop和hbase中的确实有区别,一个zookeeper-3.4.5.jar,一个zookeeper-3.4.6.jar,但是我总觉得不对,新旧怎么可能会不兼容啊。那就直接统一了试试,连客户端程序的都统一了,结果那个info信息还是存在,就和不换是一样的,果然不是这里的问题!

  有说是配置和hosts的,我这里都没这问题的,都配置过了的。加参数?我在配置中都写好的,直接打印一看就知道有了。

  这只是一个info信息,很奇怪为啥是个info,照说info级别的都是不影响啥的信息,程序确实是很正常的跑,但是看到这个信息就是不舒服。

  自己查代码去算了,根据日志,是在ClientCnxn.java中出现的信息,好吧,查看源码

private void logStartConnect(InetSocketAddress addr) {
            String msg = "Opening socket connection to server " + addr;
            if (zooKeeperSaslClient != null) {
              msg += ". " + zooKeeperSaslClient.getConfigStatus();
            }
            LOG.info(msg);
        }

  汗,还得换去查ZooKeeperSaslClient.java,继续吧

public ZooKeeperSaslClient(final String serverPrincipal)
            throws LoginException {
        /**
         * ZOOKEEPER-1373: allow system property to specify the JAAS
         * configuration section that the zookeeper client should use.
         * Default to "Client".
         */
        String clientSection = System.getProperty(ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY, "Client");
        // Note that ‘Configuration‘ here refers to javax.security.auth.login.Configuration.
        AppConfigurationEntry entries[] = null;
        RuntimeException runtimeException = null;
        try {
            entries = Configuration.getConfiguration().getAppConfigurationEntry(clientSection);
        } catch (SecurityException e) {
            // handle below: might be harmless if the user doesn‘t intend to use JAAS authentication.
            runtimeException = e;
        } catch (IllegalArgumentException e) {
            // third party customized getAppConfigurationEntry could throw IllegalArgumentException when JAAS
            // configuration isn‘t set. We can reevaluate whether to catch RuntimeException instead when more
            // different types of RuntimeException found
            runtimeException = e;
        }
        if (entries != null) {
            this.configStatus = "Will attempt to SASL-authenticate using Login Context section ‘" + clientSection + "‘";
            this.saslClient = createSaslClient(serverPrincipal, clientSection);
        } else {
            // Handle situation of clientSection‘s being null: it might simply because the client does not intend to
            // use SASL, so not necessarily an error.
            saslState = SaslState.FAILED;
            String explicitClientSection = System.getProperty(ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY);
            if (explicitClientSection != null) {
                // If the user explicitly overrides the default Login Context, they probably expected SASL to
                // succeed. But if we got here, SASL failed.
                if (runtimeException != null) {
                    throw new LoginException("Zookeeper client cannot authenticate using the " + explicitClientSection +
                            " section of the supplied JAAS configuration: ‘" +
                            System.getProperty(Environment.JAAS_CONF_KEY) + "‘ because of a " +
                            "RuntimeException: " + runtimeException);
                } else {
                    throw new LoginException("Client cannot SASL-authenticate because the specified JAAS configuration " +
                            "section ‘" + explicitClientSection + "‘ could not be found.");
                }
            } else {
                // The user did not override the default context. It might be that they just don‘t intend to use SASL,
                // so log at INFO, not WARN, since they don‘t expect any SASL-related information.
                String msg = "Will not attempt to authenticate using SASL ";
                if (runtimeException != null) {
                    msg += "(" + runtimeException + ")";
                } else {
                    msg += "(unknown error)";
                }
                this.configStatus = msg;
                this.isSASLConfigured = false;
            }
            if (System.getProperty(Environment.JAAS_CONF_KEY)  != null) {
                // Again, the user explicitly set something SASL-related, so they probably expected SASL to succeed.
                if (runtimeException != null) {
                    throw new LoginException("Zookeeper client cannot authenticate using the ‘" +
                            System.getProperty(ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY, "Client") +
                            "‘ section of the supplied JAAS configuration: ‘" +
                            System.getProperty(Environment.JAAS_CONF_KEY) + "‘ because of a " +
                            "RuntimeException: " + runtimeException);
                } else {
                    throw new LoginException("No JAAS configuration section named ‘" +
                            System.getProperty(ZooKeeperSaslClient.LOGIN_CONTEXT_NAME_KEY, "Client") +
                            "‘ was found in specified JAAS configuration file: ‘" +
                            System.getProperty(Environment.JAAS_CONF_KEY) + "‘.");
                }
            }
        }
    }

  根据上面的代码,可知问题在于红色部分,再注意一下上面的注释,我靠,果然只是一个普通的说明文字,但是,尼玛能不能不在info信息里面搞个Exception提示出来???

  好吧,那确实是一个info信息,是无关紧要的info信息,其实只是说明了。。。。。由于客户端没用SASL,所以不使用SASL进行验证。。。

  能不能换个好点的说明文字?我这些操作都是多余的了!人家就那样显示的,唉。看得不爽也没办法了,难道为了这点东西还去改源码不成?够汗的。  

  解决办法,客户端添加SASL信息,然后服务端也改掉,添加验证,这个官方文档http://hbase.apache.org/book.html#security有说明了,直接看去就是了,这里不说明了。

  唉,处女座追求完美的心,果然是不变的。。。加上,看不到烦心的文字,舒坦了。。

  

Window中调试HBase问题小结,布布扣,bubuko.com

时间: 2024-10-09 05:25:52

Window中调试HBase问题小结的相关文章

Window10中利用Windbg与虚拟机(window7)中调试驱动建立方法

想起自己的windbg配置就转载:eqera的windows内核调试配置,真的是获益良多希望他不会介意我转载他的博客,帮了我很多,记录下来给我也给大家, 其中我主要看的是VMWare的pipe建立,而我有些分享是在vs2015中打上DDK,然后在开始菜单window kits下找见windbgx86或者是你想要用的类型,然后 发送快捷方式到桌面利于以后用.发到桌面后,在属性插入你放置的的符号的路径,让然最后别忘了在windbg检查路径是否正确. eqera他的解述给了我很多帮助,可以耐心解读.下

在linux+eclipse+maven环境下调试Hbase服务源码,启动Hmaster

由于论文工作,想在regionserver的ipcserver和hregionserver等类进行修改源码的工作. 所以我需要在我的虚拟机中,我的虚拟机环境是32位centos中安装eclipse,调试Hbase的源码. 搭建环境主要步骤基本按照http://www.cnblogs.com/shitouer/archive/2012/10/24/2736923.html来进行.我主要记录下我自己搭建环境遇到的问题. 我的基本步骤, 1,eclipse按照svn插件, 2,通过svn拉去tag中的

在Chrome+Visual Studio中调试asp.net程序很慢的问题(Firefox也有类似问题)

在Chrome+Visual Studio中调试asp.net程序很慢的问题(Firefox也有类似问题) 今天开始起在Chrome中调试,发现问题主要出在菜单栏(layout文件)中,google了一番,查到很多原因,不过最终解决方法倒是很简单,特此分享一下: 在C:/Windows/System32/drivers/etc里边有一个hosts文件,用记事本打开,里边最后几行原来是: # localhost name resolution is handled within DNS itsel

248 闭包:概念,作用,案例,思考题案例,chrome 中调试闭包

5.1 变量的作用域复习 变量根据作用域的不同分为两种:全局变量和局部变量. 函数内部可以使用全局变量. 函数外部不可以使用局部变量. 当函数执行完毕,本作用域内的局部变量会销毁. 5.2 什么是闭包 闭包(closure):指有权访问另一个函数作用域中的变量的函数. 简单理解就是 ,一个作用域可以访问另外一个函数内部的局部变量. [被访问的局部变量所在的函数,就是闭包函数] <!DOCTYPE html> <html lang="en"> <head&g

如何添加window中的字体到eclipse中去?

以前都没有注意到在window中的字体居然有些在eclipse中查找不到,后来才知道是因为window中的有些字体被设置为了隐藏了所以查找不到了 后来在网上找找资料发现有些解决方法,有些博主说这样: 采用的是更改eclipse 下面的 plugins 里面的org.eclipse.jface_3.7.0.v20110928-1505.jar 把它打开然后进入到/org/eclipse/jface/resources这个目录,然后找到xxxxwindows7.properties 在这个jar包里

在eclipse中调试web项目的时候如何把web项目分配给配置好的服务器

举个例子,我今天在做spring和struts2整合的例子 新建项目blk 1.配置好web.xml,struts.xml,applicationContext.xml,写好jsp页面 2.把struts2.spring整合需要的jar包(struts核心jar包,spring核心jar包以及struts-spring-plugin.jar.commons-logging.jar)放到你项目的WEB-INF/lib目录下 3.写好java代码,并把java代码编译后的class文件拷贝到WEB-

eclipse中使用javap工具小结

关于javap的功能,百度百科上是这么解释的: javap javap是jdk自带的一个工具,可以反编译,也可以查看java编译器生成的字节码,是分析代码的一个好工具. 简单明了,大多时候真正的开发环境为linux系统,但是在windows下开发的时候又不习惯dos窗口的化,eclipse为我们提供了 javap的详细使用: 我们能够在eclipse中使用javap工具,我们有必要了解一下在eclipse中的Variables这个东西.这个英文单词的意思是变量集合的意思,意思就是我们以某些简短的

在 Chrome 中调试 Android 浏览器

最近需要使用 Chrome Developer Tools 调试 Android 浏览器,但是官方指南并不是很好使,经过一番折腾,终于调试成功了,在此把经验分享给需要的朋友. Chrome Developer Tools 是前端工程师必不可少的工具,它极大的提高了我们的开发调试效率.在移动开发的时代,我们也必须掌握手机浏览器在 Chrome 中调试的方法.本篇仅介绍 Android. 环境 不同的环境可能存在一些差异,我的环境是: Windows 10 电脑 Chrome 50.0.2661.7

VS2015--在 Visual Studio 中调试时映射调用堆栈上的方法

https://msdn.microsoft.com/zh-cn/library/dn194476.aspx 在 Visual Studio 中调试时映射调用堆栈上的方法 创建代码图,以便在调试时对调用堆栈进行可视化跟踪.你可以在图中进行标注以跟踪代码执行的操作,以便专注于查找 Bug. 生成调用堆栈图 1 开始调试.(键盘:"F5") 2 在你的应用进入中断模式或你单步执行某一函数之后,请选择"代码图".(键盘:Ctrl + Shift + `) 当前的调用堆栈在