Hadoop Mapreduce tasktrackers一直忽略HADOOP_CLASSPATH。 Zookeeper尝试连接到localhost而不是群集地址

时间:2013-08-14 13:01:48

标签: hadoop hbase cloudera apache-zookeeper

我有一个带有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是可移植的,并且无需重新编译即可获取本地配置,所以我看不到硬编码地址是一个可行的选择。

1 个答案:

答案 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