# !/usr/bin/env python
# coding: UTF-8
import xml.etree.ElementTree as ET
import subprocess as SP
if __name__ == "__main__":
hdfsSiteConfigFile = "/etc/hadoop/conf/hdfs-site.xml"
tree = ET.parse(hdfsSiteConfigFile)
root = tree.getroot()
hasHadoopHAElement = False
activeNameNode = None
for property in root:
if "dfs.ha.namenodes" in property.find("name").text:
hasHadoopHAElement = True
nameserviceId = property.find("name").text[len("dfs.ha.namenodes")+1:]
nameNodes = property.find("value").text.split(",")
for node in nameNodes:
#get the namenode machine address then check if it is active node
for n in root:
prefix = "dfs.namenode.rpc-address." + nameserviceId + "."
elementText = n.find("name").text
if prefix in elementText:
nodeAddress = n.find("value").text.split(":")[0]
args = ["hdfs haadmin -getServiceState " + node]
p = SP.Popen(args, shell=True, stdout=SP.PIPE, stderr=SP.PIPE)
for line in p.stdout.readlines():
if "active" in line.lower():
print "Active NameNode: " + node
break;
for err in p.stderr.readlines():
print "Error executing Hadoop HA command: ",err
break
if not hasHadoopHAElement:
print "Hadoop High-Availability configuration not found!"
active_node=''
if hadoop fs -test -e hdfs://<NameNode-1>/ ; then
active_node='<NameNode-1>'
elif hadoop fs -test -e hdfs://<NameNode-2>/ ; then
active_node='<NameNode-2>'
fi
echo "Active Dev Name node : $active_node"
get_active_nn(){
ha_name=$1 #Needs the NameServiceID
ha_ns_nodes=$(hdfs getconf -confKey dfs.ha.namenodes.${ha_name})
active=""
for node in $(echo ${ha_ns_nodes//,/ }); do
state=$(hdfs haadmin -getServiceState $node)
if [ "$state" == "active" ]; then
active=$(hdfs getconf -confKey dfs.namenode.rpc-address.${ha_name}.${node})
break
fi
done
if [ -z "$active" ]; then
>&2 echo "ERROR: no active namenode found for ${ha_name}"
exit 1
else
echo $active
fi
}
{"RemoteException":{"exception":"StandbyException","javaClassName":"org.apache.hadoop.ipc.StandbyException","message":"Operation category READ is not supported in state standby"}}
10条答案
按热度按时间bxpogfeg1#
js5cn81o2#
要打印namenodes,请使用以下命令:
要打印次要名称节点:
要打印备份名称节点:
注意:这些命令是使用hadoop2.4.0测试的。
2014年10月31日更新:
下面是一个python脚本,它将从配置文件中读取hadoop ha中涉及的namenodes,并通过使用hdfs haadmin命令确定它们中的哪个是活动的。这个脚本没有完全测试,因为我没有配置ha。仅使用基于hadoopha文档的示例文件测试了解析。您可以根据需要随意使用和修改。
webghufk3#
例如,您可以执行curl命令来查找活动的和辅助的namenode
curl-u用户名-h“x-requested-by:ambari”-x获取http://cluster-hostname:8080/api/v1/clusters//服务/hdfs
当做
bq9c1y664#
在高可用性hadoop集群中,将有2个namenodes—一个活动节点和一个备用节点。
为了找到活动namenode,我们可以尝试在每个namenode上执行testhdfs命令,并找到与成功运行相对应的活动namenode。
如果名称节点处于活动状态,则成功执行下面的命令;如果名称节点是备用节点,则失败。
unix脚本
nwlqm0z15#
在javaapi中,您可以使用
HAUtil.getAddressOfActive(fileSystem)
.ktecyv1j6#
您也可以在bash中通过hdfs cli调用来完成。需要注意的是,这需要更多的时间,因为这是对api的几个连续调用,但是对于某些情况,这可能比使用python脚本更好。
这是用hadoop2.6.0测试的
oipij1gg7#
当我简单地键入“hdfs”并找到一些有用的命令时,我发现了下面的内容,这些命令可能对可能来这里寻求帮助的人有用。
上面的命令将为您提供namenode的服务id。比如说hn1.hadoop.com
上面的命令将为您提供可用辅助namenodes的服务id。比如说,hn2.hadoop.com
上面的命令将获取备份节点的服务id(如果有的话)。
上面的命令将为您提供名称服务id以及rpc端口号的信息。比如说,hn1.hadoop。com:8020
1cosmwyk8#
找到这个:
https://gist.github.com/cnauroth/7ff52e9f80e7d856ddb3
这在我的cdh5 namenodes上是开箱即用的,尽管我不确定其他hadoop发行版是否会有http://namenode:50070/jmx可用-如果没有,我认为可以通过部署jolokia来添加它。
例子:
因此,通过向每个namenode发出一个http请求(这应该很快),我们可以找出哪个是活动的。
另外值得注意的是,如果您将webhdfs rest api与非活动namenode对话,您将得到403 forbidden和以下json:
gcuhipw99#
在hdfs2.6.0中,对我有用的是
slsn1g2910#
在阅读了所有现有答案之后,似乎没有一个答案将以下三个步骤结合起来:
从集群中标识namenodes。
将节点名称解析为host:port.
检查每个节点的状态(不需要群集管理特权)。
解决方案如下:
hdfs getconf
调用和jmx服务调用节点状态。