在hadoop中为nameservice获取活动namenode的任何命令?

Dra*_*orn 11 hadoop high-availability hadoop-yarn

命令:

hdfs haadmin -getServiceState machine-98
Run Code Online (Sandbox Code Playgroud)

仅在您知道机器名称时才有效.有没有像这样的命令:

hdfs haadmin -getServiceState <nameservice>
Run Code Online (Sandbox Code Playgroud)

哪个可以告诉你活动 namenode 的IP /主机名?

Ste*_*ook 23

要打印出namenodes,请使用以下命令:

hdfs getconf -namenodes
Run Code Online (Sandbox Code Playgroud)

要打印出辅助名称节点:

hdfs getconf -secondaryNameNodes
Run Code Online (Sandbox Code Playgroud)

要打印出备份名称节点:

hdfs getconf -backupNodes
Run Code Online (Sandbox Code Playgroud)

注意:这些命令是使用Hadoop 2.4.0测试的.

2014年3月31日更新:

这是一个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!"
Run Code Online (Sandbox Code Playgroud)


Eri*_*erg 15

发现这个:

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
  } ]
Run Code Online (Sandbox Code Playgroud)

因此,通过向每个namenode发出一个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"}}
Run Code Online (Sandbox Code Playgroud)


Mun*_*esh 6

在高可用性 Hadoop 集群中,将有 2 个名称节点 - 一个活动的和一个备用的。

为了找到活动的namenode,我们可以尝试在每个namenode上执行test hdfs命令,找到运行成功对应的活动的namenode。

如果名称节点处于活动状态,下面的命令将成功执行,如果它是备用节点则失败。

hadoop fs -test -e hdfs://<Name node>/
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)