在hadoop中有没有命令可以为nameservice获取活动namenode?

mu0hgdu0  于 2021-06-02  发布在  Hadoop
关注(0)|答案(10)|浏览(490)

命令:

hdfs haadmin -getServiceState machine-98

只有知道机器名才能工作。是否有如下命令:

hdfs haadmin -getServiceState <nameservice>

哪个可以告诉您活动namenode的ip/主机名?

bxpogfeg

bxpogfeg1#


# !/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()
js5cn81o

js5cn81o2#

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

hdfs getconf -namenodes

要打印次要名称节点:

hdfs getconf -secondaryNameNodes

要打印备份名称节点:

hdfs getconf -backupNodes

注意:这些命令是使用hadoop2.4.0测试的。
2014年10月31日更新:
下面是一个python脚本,它将从配置文件中读取hadoop ha中涉及的namenodes,并通过使用hdfs haadmin命令确定它们中的哪个是活动的。这个脚本没有完全测试,因为我没有配置ha。仅使用基于hadoopha文档的示例文件测试了解析。您可以根据需要随意使用和修改。


# !/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!"
webghufk

webghufk3#

例如,您可以执行curl命令来查找活动的和辅助的namenode
curl-u用户名-h“x-requested-by:ambari”-x获取http://cluster-hostname:8080/api/v1/clusters//服务/hdfs
当做

bq9c1y66

bq9c1y664#

在高可用性hadoop集群中,将有2个namenodes—一个活动节点和一个备用节点。
为了找到活动namenode,我们可以尝试在每个namenode上执行testhdfs命令,并找到与成功运行相对应的活动namenode。
如果名称节点处于活动状态,则成功执行下面的命令;如果名称节点是备用节点,则失败。

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"
nwlqm0z1

nwlqm0z15#

在javaapi中,您可以使用 HAUtil.getAddressOfActive(fileSystem) .

ktecyv1j

ktecyv1j6#

您也可以在bash中通过hdfs cli调用来完成。需要注意的是,这需要更多的时间,因为这是对api的几个连续调用,但是对于某些情况,这可能比使用python脚本更好。
这是用hadoop2.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
}
oipij1gg

oipij1gg7#

当我简单地键入“hdfs”并找到一些有用的命令时,我发现了下面的内容,这些命令可能对可能来这里寻求帮助的人有用。

hdfs getconf -namenodes

上面的命令将为您提供namenode的服务id。比如说hn1.hadoop.com

hdfs getconf -secondaryNameNodes

上面的命令将为您提供可用辅助namenodes的服务id。比如说,hn2.hadoop.com

hdfs getconf -backupNodes

上面的命令将获取备份节点的服务id(如果有的话)。

hdfs getconf -nnRpcAddresses

上面的命令将为您提供名称服务id以及rpc端口号的信息。比如说,hn1.hadoop。com:8020

You're Welcome :)
1cosmwyk

1cosmwyk8#

找到这个:
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
  } ]

因此,通过向每个namenode发出一个http请求(这应该很快),我们可以找出哪个是活动的。
另外值得注意的是,如果您将webhdfs rest api与非活动namenode对话,您将得到403 forbidden和以下json:

{"RemoteException":{"exception":"StandbyException","javaClassName":"org.apache.hadoop.ipc.StandbyException","message":"Operation category READ is not supported in state standby"}}
gcuhipw9

gcuhipw99#

在hdfs2.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
slsn1g29

slsn1g2910#

在阅读了所有现有答案之后,似乎没有一个答案将以下三个步骤结合起来:
从集群中标识namenodes。
将节点名称解析为host:port.
检查每个节点的状态(不需要群集管理特权)。
解决方案如下: 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))

相关问题