【发布时间】:2013-08-14 13:01:47
【问题描述】:
我有一个带有 5 个数据节点的 Hadoop 集群 (Cloudera CDH4.2)。我正在尝试运行创建 HBaseConfiguration 对象的 MapReduce 作业。 tasktracker 尝试失败,因为他们尝试连接到localhost:2181,而不是实际的 zookeeper 安装地址。
我知道这是因为没有为 tasktracker 提供包含 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 是可移植的,并且无需重新编译即可获取本地配置,所以我看不到硬编码地址是一个可行的选择。
【问题讨论】:
-
尝试以下步骤: 1) 确保 hbase-site.xml 包含正确的 Zk quorum; 2)
export HADOOP_CONF_DIR="$HADOOP_HOME/conf"3)export HBASE_CONF_DIR="$HBASE_HOME/conf" -
(1) hbase-site.xml 包含正确的
hbase.zookeeper.quorum值,并且是整个集群中的同一个文件。 (2) 和 (3) 没有区别(假设我在客户端而不是集群节点上设置这些)。 tasktracker 日志中的相同类路径。相同的输出。 -
@growse:我遇到了同样的问题,我想知道您是否找到了解决方案。如果有,你介意分享一下吗?
-
否 - 我最终手动指定了 zk 地址。
-
我也遇到了同样的问题。每个 TT 节点都有“hbase 网关角色”和部署的“客户端配置”。但是当代码提交使用 hbase 的作业时,/etc/hbase/conf 在类路径中是 ont :(
标签: hadoop hbase cloudera apache-zookeeper