命令:
hdfs haadmin -getServiceState machine-98
仅当您知道计算机名称时才有效。有没有这样的命令:
hdfs haadmin -getServiceState <nameservice>
哪个可以告诉您活动名称节点的 IP/主机名?
要打印出名称节点,请使用以下命令:
hdfs getconf -namenodes
要打印出辅助名称节点:
hdfs getconf -secondaryNameNodes
要打印出备份名称节点:
hdfs getconf -backupNodes
注意:这些命令是使用 Hadoop 2.4.0 测试的。
更新 10-31-2014:
这是一个python脚本,它将从配置文件中读取Hadoop HA中涉及的NameNodes,并使用hdfs haadmin命令确定其中哪些是活动的。此脚本未经过全面测试,因为我没有配置 HA。仅使用基于 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!"
找到这个:
https://gist.github.com/cnauroth/7ff52e9f80e7d856ddb3
这在我的 CDH5 名称节点上开箱即用,尽管我不确定其他 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与一个不活跃的命名节点交谈,你将得到一个403 Forbidden和以下JSON:
{"RemoteException":{"exception":"StandbyException","javaClassName":"org.apache.hadoop.ipc.StandbyException","message":"Operation category READ is not supported in state standby"}}
在高可用性 Hadoop 集群中,将有 2 个命名节点 - 一个活动节点和一个备用节点。
要查找活动名称节点,我们可以尝试在每个名称节点上执行测试 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"
您也可以使用 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
}
在阅读了所有现有的答案之后,似乎没有一个将以下三个步骤结合起来:
- 识别群集中的命名节点。
- 将节点名称解析为主机:端口。
- 检查每个节点的状态(无需群集管理员权限(。
下面的解决方案结合了节点状态的hdfs getconf
调用和 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))
api,你可以使用HAUtil.getAddressOfActive(fileSystem)
。
您可以执行 curl 命令来找出活动和辅助 Namenode例如
curl -u username -H "X-Request-By: ambari" -X GET http://cluster-hostname:8080/api/v1/clusters//services/HDFS
问候
当我简单地输入"hdfs"并找到一些有用的命令时,我发现了以下内容,这对于可能来这里寻求帮助的人可能很有用。
hdfs getconf -namenodes
上面的命令将为您提供名称节点的服务 ID。说,hn1.hadoop.com
hdfs getconf -secondaryNameNodes
上述命令将为您提供可用辅助名称节点的服务 ID。说,hn2.hadoop.com
hdfs getconf -backupNodes
上述命令将获取备份节点的服务 ID(如果有(。
hdfs getconf -nnRpcAddresses
上面的命令将为您提供名称服务ID的信息以及rpc端口号。说,hn1.hadoop.com:8020
You're Welcome :)
在 HDFS 2.6.0 中对我有用的那个
ubuntu@platform2:~$ hdfs getconf -confKey dfs.ha.namenodes.arkin-platform-cluster
nn1,nn2
ubuntu@platform2:~$ sudo -u hdfs hdfs haadmin -getServiceState nn1
standby
ubuntu@platform2:~$ sudo -u hdfs hdfs haadmin -getServiceState nn2
active
您可以简单地使用以下命令。我已经在 hadoop 3.0 中对此进行了测试,您可以在此处查看参考资料 -
hdfs haadmin -getAllServiceState
它返回所有 NameNode 的状态。
下面是 bash 代码的示例,即使您没有安装本地 Hadoop,也会返回活动名称节点。
它的工作速度也更快,因为curl调用通常比hadoop快。
在Cloudera 7.1上检查
#!/bin/bash
export nameNode1=myNameNode1
export nameNode2=myNameNode2
active_node=''
T1=`curl --silent --insecure -request GET https://${nameNode1}:9871/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus | grep ""State" : "active"" | wc -l`
if [ $T1 == 1 ]
then
active_node=${nameNode1}
else
T1=`curl --silent --insecure -request GET https://${nameNode2}:9871/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus | grep ""State" : "active"" | wc -l`
if [ $T1 == 1 ]
then
active_node=${nameNode2}
fi
fi
echo "Active Dev Name node : $active_node"
#!/usr/bin/python
import subprocess
import sys
import os, errno
def getActiveNameNode () :
cmd_string="hdfs getconf -namenodes"
process = subprocess.Popen(cmd_string, shell=True, stdout=subprocess.PIPE)
out, err = process.communicate()
NameNodes = out
Value = NameNodes.split(" ")
for val in Value :
cmd_str="hadoop fs -test -e hdfs://"+val
process = subprocess.Popen(cmd_str, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
if (err != "") :
return val
def main():
out = getActiveNameNode()
print(out)
if __name__ == '__main__':
main()
more /etc/hadoop/conf/hdfs-site.xml
<property>
<name>dfs.ha.namenodes.nameservice1</name>
<value>namenode1353,namenode1357</value>
</property>
hdfs@:/home/ubuntu$ hdfs haadmin -getServiceState namenode1353
active
hdfs@:/home/ubuntu$ hdfs haadmin -getServiceState namenode1357
standby