2017-08-17 1 views

Répondre

1

Vous devez configurer le système pour spécifier comment les informations de rack sont déterminées. Par exemple, this Cloudera link vous indique comment configurer les racks pour les hôtes dans Cloudera Manager.

Alternativement, this Apache link explique comment cette information peut être spécifiée dans un script externe de classe java via des fichiers de configuration.

La topologie est généralement de la forme/myrack/myhost, bien que vous puissiez utiliser une hiérarchie plus profonde. Ils ont l'exemple suivant en python qui suppose un sous-réseau/24 pour chaque rack, et donc extrait les trois premiers octets de l'adresse IP à utiliser comme numéro de rack - vous pouvez adopter une approche similaire si vous pouvez définir les adresses IP de nœud en conséquence ou écrivez votre propre script pour déterminer le rack à partir de l'adresse IP ou d'autres informations disponibles sur chaque nœud (même un simple mappage codé en dur entre, par exemple, hostname et rack fonctionnerait dans votre exemple avec relativement peu de nœuds).

#!/usr/bin/python 
# this script makes assumptions about the physical environment. 
# 1) each rack is its own layer 3 network with a /24 subnet, which 
# could be typical where each rack has its own 
#  switch with uplinks to a central core router. 
# 
#    +-----------+ 
#    |core router| 
#    +-----------+ 
#   /   \ 
# +-----------+  +-----------+ 
# |rack switch|  |rack switch| 
# +-----------+  +-----------+ 
# | data node |  | data node | 
# +-----------+  +-----------+ 
# | data node |  | data node | 
# +-----------+  +-----------+ 
# 
# 2) topology script gets list of IP's as input, calculates network address, and prints '/network_address/ip'. 

import netaddr 
import sys 
sys.argv.pop(0)             # discard name of topology script from argv list as we just want IP addresses 

netmask = '255.255.255.0'          # set netmask to what's being used in your environment. The example uses a /24 

for ip in sys.argv:            # loop over list of datanode IP's 
address = '{0}/{1}'.format(ip, netmask)      # format address string so it looks like 'ip/netmask' to make netaddr work 
try: 
    network_address = netaddr.IPNetwork(address).network  # calculate and print network address 
    print "/{0}".format(network_address) 
except: 
    print "/rack-unknown"         # print catch-all value if unable to calculate network address