我正在编写一个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。任何见解都将深受赞赏。
答案 0 :(得分:0)
今天我遇到了类似的事情。
有效地:当我从IDE运行时,我的工作将'localhost'作为hbase.zookeeper.quorum。
原因是'yarn'和'hadoop'脚本在启动java运行时之前将config dir(即hbase-site.xml所在的位置)添加到类路径中。 当我从IDE运行时,根本没有完成。
现在,当您创建HBase配置时,会加载两个文件:
我通过使用这样的代码段(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”环境变量,并确保它是类路径的一部分,如果它没有发出警告。