HBase MapReduce job load configuration (hbase-site.xml),但实际上没有



我正在写一个MapReduce作业,它从(a)个HBase表中读取数据。除了Configuration类,几乎所有的工作都像它应该的那样。所以我写了

Configuration config = HBaseConfiguration.create();
GenericOptionsParser parser = new GenericOptionsParser(config, args);
// This should work but is not working.
config.addResource(new Path(parser.getCommandLine().getOptionValue("conf", DEFAULT_HBASE_CONF)));

当我像这样运行作业时(正确地将路径传递给hbase-site.xml),我得到了这个错误:

14/06/30 23:02:30 WARN zookeeper.ClientCnxn: Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: Connection refused
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:735)
    at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:350)
    at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1075)
14/06/30 23:02:30 INFO zookeeper.ClientCnxn: Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)

但是当我加上下面两行时,它就像魔法一样起作用了(尽管看起来很荒谬)。

// So these are the workarounds.
config.set("hbase.rootdir", config.get("hbase.rootdir"));
config.set("hbase.zookeeper.quorum", config.get("hbase.zookeeper.quorum"));

基本上,从Configuration对象中读取参数并将它们设置回同一个对象中,这是疯狂的。

我读了一个关于HBASE-11066的bug,但它似乎已经关闭了,引用了本地配置问题(我认为不是)和一个SO问题,这可能与我的查询相似,但还没有答案。我使用CDH 5.0.2和HBase 0.96.1.1。

今天我遇到了类似的事情。

有效地:当我从IDE运行它时,我的工作有'localhost'作为hbase.zookeeper.quorum .

原因是'yarn'和'hadoop'脚本在启动java运行时之前将配置目录(即hbase-site.xml所在的位置)添加到类路径中。当我从我的IDE运行时,这根本不做。

现在,当您创建HBase配置时,将加载两个文件:

  • hbase-default.xml:这是hbase jar文件的一部分,所以总能找到它。
  • hbase-site.xml:这是在配置目录中,这个配置目录应该在类路径中,并且可以推翻默认的一些设置。

我通过在应用程序中打印类路径来验证这一点,使用如下代码段(从这里复制)

ClassLoader cl = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader)cl).getURLs();
for(URL url: urls){
    System.out.println(url.getFile());
}

和输出

的结果
config.get("hbase.zookeeper.quorum") :

我怀疑你也有类似的问题。

我正在考虑的一件事是获得"HADOOP_CONF_DIR"环境变量,并确保它是类路径的一部分,如果它不是给出警告。

相关内容

  • 没有找到相关文章