我正在写一个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"环境变量,并确保它是类路径的一部分,如果它不是给出警告。