命令:任何获得hadoop中nameservice的活动namenode的命令?
hdfs haadmin -getServiceState machine-98
只有当你知道机器名的作品。有没有像任何命令:
hdfs haadmin -getServiceState <nameservice>
它可以告诉你活跃名称节点的IP /主机名?
命令:任何获得hadoop中nameservice的活动namenode的命令?
hdfs haadmin -getServiceState machine-98
只有当你知道机器名的作品。有没有像任何命令:
hdfs haadmin -getServiceState <nameservice>
它可以告诉你活跃名称节点的IP /主机名?
要打印出namenodes使用这个命令:
hdfs getconf -namenodes
要打印出二次namenodes:
hdfs getconf -secondaryNameNodes
要打印出来的备份namenodes:
hdfs getconf -backupNodes
注意:这些命令使用Hadoop 2.4.0进行测试。
更新 2014年10月31日:
这里是一个Python脚本,将读取配置文件中涉及的Hadoop HA的NameNodes,并确定它们中的哪是使用HDFS haadmin命令活跃。由于我没有配置高可用性,因此该脚本未完全测试。只使用基于Hadoop HA文档的示例文件来测试解析。随意使用并根据需要进行修改。
#!/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!"
啊,这不会告诉我活动的namenode,是吗? – Dragonborn 2014-10-31 06:31:53
@Dragonborn我错过了关于HA正在使用的部分。回答用python脚本更新以解析hdfs配置并针对每台机器运行haadmin命令。脚本会报告哪些是活动的。 – 2014-10-31 18:52:26
+1教导一个新的命令。但他们应该为此提供了一个直接的途径。即使是活动的namenode名称后的'*'也足够了。 – blackSmith 2014-11-05 07:38:51
你也可以用hdfs cli调用bash来做到这一点。有一点需要注意的是,这需要多一点时间,因为它是连续调用API的一些方法,但这可能更适合使用python脚本。
这是用Hadoop 2.6.0
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
}
测试发现这一点:
https://gist.github.com/cnauroth/7ff52e9f80e7d856ddb3
这工作了我CDH5 namenodes箱子,虽然我不知道其他的Hadoop分配将有http://namenode:50070/jmx可用 - 如果没有,我认为可以通过部署Jolokia添加。
实施例:
curl 'http://namenode1.example.com:50070/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus'
{
"beans" : [ {
"name" : "Hadoop:service=NameNode,name=NameNodeStatus",
"modelerType" : "org.apache.hadoop.hdfs.server.namenode.NameNode",
"State" : "active",
"NNRole" : "NameNode",
"HostAndPort" : "namenode1.example.com:8020",
"SecurityEnabled" : true,
"LastHATransitionTime" : 1436283324548
} ]
所以通过烧制关闭一个http请求到每个名称节点(这应该是快速),我们可以计算出哪一个是活动的一个。
另外值得一提的是,如果你跟WebHDFS REST API到无效的NameNode,你会得到一个403禁止和下面的JSON:
{"RemoteException":{"exception":"StandbyException","javaClassName":"org.apache.hadoop.ipc.StandbyException","message":"Operation category READ is not supported in state standby"}}
嗨..你知道如何连接到启用了Kerberos的NameNode JMX吗?我们在curl命令之前运行了kinit。但是我们得到了一个无法连接的错误 – myloginid 2015-11-20 10:23:59
也许http://www.cloudera.com/content/www/en-us/documentation/archive/cdh/4-x/4-3-2/CDH4-Security-Guide/ cdh4sg_topic_7_2.html可以帮助你吗? – 2015-11-21 11:20:28
阅读所有现有的答案后,似乎没有这三个步骤的结合:
以下解决方案将调用和JMX服务调用组合为节点状态。
#!/usr/bin/env python
from subprocess import check_output
import urllib, json, sys
def get_name_nodes(clusterName):
ha_ns_nodes=check_output(['hdfs', 'getconf', '-confKey',
'dfs.ha.namenodes.' + clusterName])
nodes = ha_ns_nodes.strip().split(',')
nodeHosts = []
for n in nodes:
nodeHosts.append(get_node_hostport(clusterName, n))
return nodeHosts
def get_node_hostport(clusterName, nodename):
hostPort=check_output(
['hdfs','getconf','-confKey',
'dfs.namenode.rpc-address.{0}.{1}'.format(clusterName, nodename)])
return hostPort.strip()
def is_node_active(nn):
jmxPort = 50070
host, port = nn.split(':')
url = "http://{0}:{1}/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus".format(
host, jmxPort)
nnstatus = urllib.urlopen(url)
parsed = json.load(nnstatus)
return parsed.get('beans', [{}])[0].get('State', '') == 'active'
def get_active_namenode(clusterName):
for n in get_name_nodes(clusterName):
if is_node_active(n):
return n
clusterName = (sys.argv[1] if len(sys.argv) > 1 else None)
if not clusterName:
raise Exception("Specify cluster name.")
print 'Cluster: {0}'.format(clusterName)
print "Nodes: {0}".format(get_name_nodes(clusterName))
print "Active Name Node: {0}".format(get_active_namenode(clusterName))
在高可用性Hadoop集群中,将有2个名称节点 - 一个活动节点和一个备用节点。
要找到活动的namenode,我们可以尝试在每个namenode上执行test hdfs命令,并找到与成功运行相对应的活动名称节点。
如果名称节点处于活动状态,则下面的命令执行成功,而如果它是备用节点,则命令失败。
hadoop fs -test -e hdfs://<Name node>/
的Unix脚本
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"
你可以做一个curl命令找出活动和次要的Namenode 例如
卷曲-u用户名-H“X-请求通过:ambari“-X GET http://cluster-hostname:8080/api/v1/clusters//services/HDFS
Regards
是X-Requested-By required? – Dragonborn 2017-11-09 05:40:46
+1:好问题。最可能的答案是“不”。即使没有HA,也没有命令显示namenode的主机名/ ip ASFAIK。 'hdfs dfsadmin -report'只显示数据节点。有解决方法,但是。 – blackSmith 2014-10-30 10:35:36