web-dev-qa-db-ja.com

hadoopのネームサービスのアクティブなネームノードを取得するコマンドはありますか?

コマンド:

hdfs haadmin -getServiceState machine-98

マシン名がわかっている場合にのみ機能します。次のようなコマンドはありますか?

hdfs haadmin -getServiceState <nameservice>

active namenodeのIP /ホスト名を教えてくれますか?

11
Dragonborn

名前ノードを出力するには、次のコマンドを使用します。

hdfs getconf -namenodes

二次ネームノードを出力するには:

hdfs getconf -secondaryNameNodes

バックアップの名前ノードを出力するには:

hdfs getconf -backupNodes

注:これらのコマンドは、Hadoop 2.4.0を使用してテストされました。

更新 10-31-2014:

pythonスクリプトは、Hadoop HAに関連するNameNodeを構成ファイルから読み取り、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!"
25

これが見つかりました:

https://Gist.github.com/cnauroth/7ff52e9f80e7d856ddb

他のhadoopディストリビューションで http:// namenode:50070/jmx が利用可能かどうかはわかりませんが、これは私のCDH5ネームノードでそのまま機能します-利用できない場合は、 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に1つの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"}}
15
Erik Forsberg

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
}
4
David Krieg

Java apiから、HAUtil.getAddressOfActive(fileSystem)を使用できます。

2
IceMimosa

高可用性Hadoopクラスターでは、2つのネームノード(アクティブとスタンバイの2つ)があります。

アクティブな名前ノードを見つけるには、各名前ノードでtest hdfsコマンドを実行して、成功した実行に対応するアクティブな名前ノードを見つけます。

以下のコマンドは、名前ノードがアクティブの場合は正常に実行され、スタンバイノードの場合は失敗します。

hadoop fs -test -e hdfs://<Name node>/

NIXスクリプト

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"
2
Munesh

既存の回答をすべて読んだ後、次の3つのステップを組み合わせたものはないようです。

  1. クラスターから名前ノードを識別します。
  2. ノード名をHost:portに解決します。
  3. 各ノードのステータスをチェックする(クラスター管理特権を必要としない)。

以下のソリューションは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))
2
saarp

たとえば、curlコマンドを実行して、アクティブおよびセカンダリNamenodeを見つけることができます。

curl -u username -H "X-Requested-By:ambari" -X GET http:// cluster-hostname:8080/api/v1/clusters / /services/HDFS

よろしく

1
Meena Rajani

私が単に「hdfs」と入力したときに以下を見つけ、いくつかの便利なコマンドを見つけました。これは、助けを求めてここに来る可能性のある人に役立つ可能性があります。

hdfs getconf -namenodes

この上記のコマンドは、namenodeのサービスIDを提供します。言う、hn1.hadoop.com

hdfs getconf -secondaryNameNodes

この上記のコマンドは、使用可能な2次ネームノードのサービスIDを提供します。言うhn2.hadoop.com

hdfs getconf -backupNodes

上記のコマンドは、バックアップノードのサービスIDを取得します(ある場合)。

hdfs getconf -nnRpcAddresses

この上記のコマンドは、rpcポート番号とともにネームサービスIDの情報を提供します。言う、hn1.hadoop.com:802

                                  You're Welcome :)
1
Santosh Bitra
#!/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()