HBase MapReduce作业加载配置(hbase-site.xml),但实际上并没有

时间:2014-06-30 23:30:07

标签: hadoop mapreduce hbase

我正在编写一个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,但似乎已经关闭引用本地配置问题(我认为没有)和SO问题here这可能类似于我的查询,但是还没有答案。我使用CDH 5.0.2和HBase 0.96.1.1。任何见解都将深受赞赏。

1 个答案:

答案 0 :(得分:0)

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

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

原因是'yarn'和'hadoop'脚本在启动java运行时之前将config dir(即hbase-site.xml所在的位置)添加到类路径中。 当我从IDE运行时,根本没有完成。

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

  • hbase-default.xml:这是其中一个hbase jar的一部分,因此总能找到它。
  • hbase-site.xml:这是在配置目录中,此配置目录应位于类路径上,并且可以取代默认设置中的某些设置。

我通过使用这样的代码段(copied from here)在我的应用程序中打印类路径来验证这一点

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”环境变量,并确保它是类路径的一部分,如果它没有发出警告。