我有一个带有 5 个数据节点的 Hadoop 集群(Cloudera CDH4.2)。我正在尝试运行创建HBaseConfiguration
对象的 MapReduce 作业。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
因此,出于某种原因,tasktrackers 完全无视我设置HADOOP_CLASSPATH
为hbase classpath
. 文档(http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/package-summary.html#classpath)指出这应该可以工作。怎么了?
我知道我可以通过在 jar 代码中明确指定 zookeeper 仲裁地址来解决这个问题,但是我需要这个 jar 是可移植的,并且在不重新编译的情况下获取本地配置,所以我看不到将地址硬编码为一个可行的选择。