我有一个带有5个数据节点的Hadoop集群(Cloudera CDH4.2)。我正在尝试运行MapReduce作业,该作业会创建一个HBaseConfiguration
对象。 tasktracker尝试失败,因为他们尝试连接到localhost:2181
而不是实际的zookeeper安装的地址。
我知道这是因为没有为tasktrackers提供包含hbase配置的正确类路径。但是,如果我像这样运行这个工作:
HADOOP_CLASSPATH=`/usr/bin/hbase classpath` hadoop jar myjar.jar
文档表明这应该可以解决问题。 hbase classpath
中的第一个条目是/usr/lib/hbase/conf
,它是/etc/hbase/conf
的符号链接,因此理论上,这应该将hbase配置添加到HADOOP_CLASSPATH
变量中。
然而,来自tasktracker的日志显示了这一点:
2013-08-14 12:47:24,308 INFO org.apache.zookeeper.ZooKeeper: Client environment:java.class.path=<output of `hadoop classpath`>
....
2013-08-14 12:47:24,309 INFO org.apache.zookeeper.ZooKeeper: Initiating client connection, connectString=localhost:2181 sessionTimeout=180000 watcher=hconnection
.....
2013-08-14 12:47:24,328 WARN org.apache.zookeeper.ClientCnxn: Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: Connection refused
因此,出于某种原因,任务工作者完全忽略了我将HADOOP_CLASSPATH
设置为hbase classpath
的努力。文档(http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/package-summary.html#classpath)声明这应该可行。怎么了?
我知道我可以通过在jar代码中明确指定zookeeper仲裁地址来解决这个问题,但是我需要这个jar是可移植的,并且无需重新编译即可获取本地配置,所以我看不到硬编码地址是一个可行的选择。
答案 0 :(得分:0)
如果你进行了java编程:
conf.set("hbase.zookeeper.quorum", "server1,server2,server3");
conf.set("hbase.zookeeper.property.clientPort", "2181");
如果您使用了命令:add -Dhbase.zookeeper.quorum
sudo hadoop jar /opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/hbase/hbase.jar rowcounter -Dhbase.zookeeper.quorum=server1,server2,server3 hly_temp