Repository: ambari Updated Branches: refs/heads/branch-2.2 844abe636 -> 15933088c
AMBARI-15169: namenode_ha_utils.py returns sometimes Active NNs as emtpy set, and Stand-by NN as a set of 2 NNs in multi-homed environment (jluniya) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/060babc8 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/060babc8 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/060babc8 Branch: refs/heads/branch-2.2 Commit: 060babc872a8697dd56e9ff83fa19420c8451b4d Parents: 844abe6 Author: Jayush Luniya <jlun...@hortonworks.com> Authored: Thu Feb 25 14:50:11 2016 -0800 Committer: Jayush Luniya <jlun...@hortonworks.com> Committed: Thu Feb 25 15:04:39 2016 -0800 ---------------------------------------------------------------------- .../libraries/functions/namenode_ha_utils.py | 29 ++++++++++++++++---- .../package/alerts/alert_ha_namenode_health.py | 14 ++++++++-- 2 files changed, 36 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/060babc8/ambari-common/src/main/python/resource_management/libraries/functions/namenode_ha_utils.py ---------------------------------------------------------------------- diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/namenode_ha_utils.py b/ambari-common/src/main/python/resource_management/libraries/functions/namenode_ha_utils.py index 0920e85..36a34c1 100644 --- a/ambari-common/src/main/python/resource_management/libraries/functions/namenode_ha_utils.py +++ b/ambari-common/src/main/python/resource_management/libraries/functions/namenode_ha_utils.py @@ -33,7 +33,10 @@ HDFS_NN_STATE_STANDBY = 'standby' NAMENODE_HTTP_FRAGMENT = 'dfs.namenode.http-address.{0}.{1}' NAMENODE_HTTPS_FRAGMENT = 'dfs.namenode.https-address.{0}.{1}' +NAMENODE_RPC_FRAGMENT = 'dfs.namenode.rpc-address.{0}.{1}' +NAMENODE_RPC_NON_HA = 'dfs.namenode.rpc-address' JMX_URI_FRAGMENT = "{0}://{1}/jmx?qry=Hadoop:service=NameNode,name=FSNamesystem" +INADDR_ANY = '0.0.0.0' def get_namenode_states(hdfs_site, security_enabled, run_user, times=10, sleep_time=1, backoff_factor=2): """ @@ -73,7 +76,8 @@ def get_namenode_states_noretries(hdfs_site, security_enabled, run_user): nn_unique_ids = hdfs_site[nn_unique_ids_key].split(',') for nn_unique_id in nn_unique_ids: is_https_enabled = hdfs_site['dfs.https.enable'] if not is_empty(hdfs_site['dfs.https.enable']) else False - + + rpc_key = NAMENODE_RPC_FRAGMENT.format(name_service,nn_unique_id) if not is_https_enabled: key = NAMENODE_HTTP_FRAGMENT.format(name_service,nn_unique_id) protocol = "http" @@ -84,6 +88,11 @@ def get_namenode_states_noretries(hdfs_site, security_enabled, run_user): if key in hdfs_site: # use str() to ensure that unicode strings do not have the u' in them value = str(hdfs_site[key]) + if INADDR_ANY in value and rpc_key in hdfs_site: + rpc_value = str(hdfs_site[rpc_key]) + if INADDR_ANY not in rpc_value: + rpc_host = rpc_value.split(":")[0] + value = value.replace(INADDR_ANY, rpc_host) jmx_uri = JMX_URI_FRAGMENT.format(protocol, value) @@ -139,6 +148,8 @@ def get_property_for_active_namenode(hdfs_site, property_name, security_enabled, - In non-ha mode it will return hdfs_site[dfs.namenode.rpc-address] - In ha-mode it will return hdfs_site[dfs.namenode.rpc-address.nnha.nn2], where nnha is the name of HA, and nn2 is id of active NN """ + value = None + rpc_key = None if is_ha_enabled(hdfs_site): name_service = hdfs_site['dfs.nameservices'] active_namenodes = get_namenode_states(hdfs_site, security_enabled, run_user)[0] @@ -147,8 +158,16 @@ def get_property_for_active_namenode(hdfs_site, property_name, security_enabled, raise Fail("There is no active namenodes.") active_namenode_id = active_namenodes[0][0] - - return hdfs_site[format("{property_name}.{name_service}.{active_namenode_id}")] + value = hdfs_site[format("{property_name}.{name_service}.{active_namenode_id}")] + rpc_key = NAMENODE_RPC_FRAGMENT.format(name_service,active_namenode_id) else: - return hdfs_site[property_name] - + value = hdfs_site[property_name] + rpc_key = NAMENODE_RPC_NON_HA + + if INADDR_ANY in value and rpc_key in hdfs_site: + rpc_value = str(hdfs_site[rpc_key]) + if INADDR_ANY not in rpc_value: + rpc_host = rpc_value.split(":")[0] + value = value.replace(INADDR_ANY, rpc_host) + + return value http://git-wip-us.apache.org/repos/asf/ambari/blob/060babc8/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_ha_namenode_health.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_ha_namenode_health.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_ha_namenode_health.py index 7cd5591..a174cb4 100644 --- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_ha_namenode_health.py +++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_ha_namenode_health.py @@ -45,6 +45,10 @@ KERBEROS_PRINCIPAL = '{{hdfs-site/dfs.web.authentication.kerberos.principal}}' SECURITY_ENABLED_KEY = '{{cluster-env/security_enabled}}' SMOKEUSER_KEY = '{{cluster-env/smokeuser}}' EXECUTABLE_SEARCH_PATHS = '{{kerberos-env/executable_search_paths}}' +INADDR_ANY = '0.0.0.0' +NAMENODE_HTTP_FRAGMENT = 'dfs.namenode.http-address.{0}.{1}' +NAMENODE_HTTPS_FRAGMENT = 'dfs.namenode.https-address.{0}.{1}' +NAMENODE_RPC_FRAGMENT = 'dfs.namenode.rpc-address.{0}.{1}' CONNECTION_TIMEOUT_KEY = 'connection.timeout' CONNECTION_TIMEOUT_DEFAULT = 5.0 @@ -122,11 +126,11 @@ def execute(configurations={}, parameters={}, host_name=None): if not nn_unique_ids_key in hdfs_site: return (RESULT_STATE_UNKNOWN, ['Unable to find unique namenode alias key {0}'.format(nn_unique_ids_key)]) - namenode_http_fragment = 'dfs.namenode.http-address.{0}.{1}' + namenode_http_fragment = NAMENODE_HTTP_FRAGMENT jmx_uri_fragment = "http://{0}/jmx?qry=Hadoop:service=NameNode,name=*" if is_ssl_enabled: - namenode_http_fragment = 'dfs.namenode.https-address.{0}.{1}' + namenode_http_fragment = NAMENODE_HTTPS_FRAGMENT jmx_uri_fragment = "https://{0}/jmx?qry=Hadoop:service=NameNode,name=*" @@ -140,10 +144,16 @@ def execute(configurations={}, parameters={}, host_name=None): nn_unique_ids = hdfs_site[nn_unique_ids_key].split(',') for nn_unique_id in nn_unique_ids: key = namenode_http_fragment.format(name_service,nn_unique_id) + rpc_key = NAMENODE_RPC_FRAGMENT.format(name_service,nn_unique_id) if key in hdfs_site: # use str() to ensure that unicode strings do not have the u' in them value = str(hdfs_site[key]) + if INADDR_ANY in value and rpc_key in hdfs_site: + rpc_value = str(hdfs_site[rpc_key]) + if INADDR_ANY not in rpc_value: + rpc_host = rpc_value.split(":")[0] + value = value.replace(INADDR_ANY, rpc_host) try: jmx_uri = jmx_uri_fragment.format(value)