hodring
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:10k
源码类别:

网格计算

开发平台:

Java

  1. #!/bin/sh
  2. # Licensed to the Apache Software Foundation (ASF) under one or more
  3. # contributor license agreements.  See the NOTICE file distributed with
  4. # this work for additional information regarding copyright ownership.
  5. # The ASF licenses this file to You under the Apache License, Version 2.0
  6. # (the "License"); you may not use this file except in compliance with
  7. # the License.  You may obtain a copy of the License at
  8. #
  9. #     http://www.apache.org/licenses/LICENSE-2.0
  10. #
  11. # Unless required by applicable law or agreed to in writing, software
  12. # distributed under the License is distributed on an "AS IS" BASIS,
  13. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. # See the License for the specific language governing permissions and
  15. # limitations under the License.
  16. """:"
  17. work_dir=$(dirname $0)
  18. base_name=$(basename $0)
  19. cd $work_dir
  20. if [ $HOD_PYTHON_HOME ]; then
  21.     exec $HOD_PYTHON_HOME -OO $base_name ${1+"$@"}
  22. elif [ -e /usr/bin/python ]; then
  23.     exec /usr/bin/python -OO $base_name ${1+"$@"}
  24. elif [ -e /usr/local/bin/python ]; then
  25.     exec /usr/local/bin/python -OO $base_name ${1+"$@"}
  26. else
  27.     exec python -OO $base_name ${1+"$@"}
  28. fi
  29. ":"""
  30. """The executable to be used by the user"""
  31. import sys, os, re
  32. myName          = os.path.basename(sys.argv[0])
  33. myName          = re.sub(".*/", "", myName)
  34. binDirectory    = os.path.realpath(sys.argv[0])
  35. rootDirectory   = re.sub("/bin/.*", "", binDirectory)
  36. libDirectory    = rootDirectory
  37. sys.path.append(libDirectory)
  38. from hodlib.HodRing.hodRing import HodRing
  39. from hodlib.Common.setup import *
  40. from hodlib.Common.util import filter_warnings, get_exception_string, 
  41.                 get_exception_error_string, getMapredSystemDirectory, 
  42.                 to_http_url, local_fqdn
  43. from hodlib.Common.logger import getLogger, ensureLogDir
  44. from hodlib.Common.xmlrpc import hodXRClient
  45. filter_warnings()
  46. reVersion = re.compile(".*(d+_d+).*")
  47. VERSION = '$HeadURL$'
  48. reMatch = reVersion.match(VERSION)
  49. if reMatch:
  50.     VERSION = reMatch.group(1)
  51.     VERSION = re.sub("_", ".", VERSION)
  52. else:
  53.     VERSION = 'DEV'
  54. # Definition tuple is of the form:
  55. #  (name, type, description, default value, required?, validate?)
  56. #
  57. defList = { 'hodring' : (
  58.              ('temp-dir', 'directory', 'hod work directories',
  59.               False, None, True, False),
  60.               
  61.              ('log-dir', 'directory', 'hod logging directory.', 
  62.               False, os.path.join(rootDirectory, 'logs'), False, True), 
  63.              ('log-destination-uri', 'string', 
  64.               'URI to store logs to, local://some_path or '
  65.               + 'hdfs://host:port/some_path', 
  66.               False, None, False, True), 
  67.              ('pkgs', 'directory', 'Path to Hadoop to use in case of uploading to HDFS',
  68.               False, None, False, True),
  69.               
  70.              ('syslog-address', 'address', 'Syslog address.',
  71.               False, None, False, True),
  72.           
  73.              ('java-home', 'directory', 'Java home directory.',
  74.               False, None, True, True),
  75.               
  76.              ('debug', 'pos_int', 'Debugging level, 0-4.',
  77.               False, 3, True, True),
  78.                
  79.              ('register', 'bool', 'Register with service registry?',
  80.               False, True, True, True),
  81.                
  82.              ('stream', 'bool', 'Output to stderr.',
  83.               False, False, False, True),
  84.              ('userid', 'user_account', 
  85.               'User ID the hod shell is running under.',
  86.               False, None, True, False),
  87.              ('xrs-port-range', 'range', 'XML-RPC port range n-m.',
  88.               False, None, True, True),
  89.                
  90.              ('http-port-range', 'range', 'HTTP port range n-m.',
  91.               False, None, True, True),
  92.                
  93.              ('command', 'string', 'Command for hodring to run.',
  94.               False, None, False, True),
  95.               
  96.              ('service-id', 'string', 'Service ID.',
  97.               False, None, False, True),
  98.               
  99.              ('download-addr', 'string', 'Download HTTP address.',
  100.               False, None, False, True),
  101.                
  102.              ('svcrgy-addr', 'address', 'Service registry XMLRPC address.',
  103.               False, None, True, True), 
  104.     
  105.              ('ringmaster-xrs-addr', 'address', 'Ringmaster XML-RPC address.',
  106.               False, None, False, True),
  107.  
  108.              ('tarball-retry-initial-time', 'pos_float','initial retry time for tarball download',
  109.               False, 1, False, True),
  110.               
  111.              ('tarball-retry-interval', 'pos_float','interval to spread retries for tarball download',
  112.               False, 3, False, True),
  113.               
  114.              ('cmd-retry-initial-time', 'pos_float','initial retry time for getting commands',
  115.               False, 2, False, True),
  116.              
  117.              ('cmd-retry-interval', 'pos_float','interval to spread retries for getting commands',
  118.               False, 2, False, True), 
  119.              ('mapred-system-dir-root', 'string', 'Root under which mapreduce system directory names are generated by HOD.',
  120.               False, '/mapredsystem', False, False))
  121.             }            
  122. if __name__ == '__main__':
  123.   confDef = definition()
  124.   confDef.add_defs(defList)
  125.   hodRingOptions = options(confDef, "./%s [OPTIONS]" % myName, VERSION)
  126.   ensureLogDir(hodRingOptions['hodring']['log-dir'])
  127.   service = None
  128.   try:
  129.     (status, statusMsgs) = hodRingOptions.verify()
  130.     if not status:
  131.       raise Exception("%s" % statusMsgs)
  132.     hodRingOptions['hodring']['base-dir'] = rootDirectory
  133.     service = HodRing(hodRingOptions)
  134.     service.start()
  135.     service.wait()
  136.    
  137.     if service.log:
  138.       log = service.log
  139.     else: 
  140.       log = getLogger(hodRingOptions['hodring'],'hodring')
  141.     list = []
  142.     
  143.     runningHadoops = service.getRunningValues()
  144.     mrSysDirManager = None      
  145.     for cmd in runningHadoops:
  146.       if cmd.name == 'jobtracker':
  147.         mrSysDirManager = cmd.getMRSystemDirectoryManager()
  148.       log.debug("addding %s to cleanup list..." % cmd)
  149.       cmd.addCleanup(list)
  150.     
  151.     list.append(service.getTempDir())
  152.     log.debug(list)
  153.        
  154.     # archive_logs now
  155.     cmdString = os.path.join(rootDirectory, "bin", "hodcleanup") # same python
  156.     if (len(runningHadoops) == 0):
  157.       log.info("len(runningHadoops) == 0, No running cluster?")
  158.       log.info("Skipping __copy_archive_to_dfs")
  159.       hadoopString = ""
  160.     else: hadoopString=runningHadoops[0].path
  161.     #construct the arguments
  162.     if hodRingOptions['hodring'].has_key('log-destination-uri'):
  163.       cmdString = cmdString + " --log-destination-uri " 
  164.                     + hodRingOptions['hodring']['log-destination-uri']
  165.     hadoopLogDirs = service.getHadoopLogDirs()
  166.     if hadoopLogDirs:
  167.       cmdString = cmdString 
  168.                     + " --hadoop-log-dirs " 
  169.                     + ",".join(hadoopLogDirs)
  170.     cmdString = cmdString 
  171.                   + " --temp-dir " 
  172.                   + service._cfg['temp-dir'] 
  173.                   + " --hadoop-command-string " 
  174.                   + hadoopString 
  175.                   + " --user-id " 
  176.                   + service._cfg['userid'] 
  177.                   + " --service-id " 
  178.                   + service._cfg['service-id'] 
  179.                   + " --hodring-debug " 
  180.                   + str(hodRingOptions['hodring']['debug']) 
  181.                   + " --hodring-log-dir " 
  182.                   + hodRingOptions['hodring']['log-dir'] 
  183.                   + " --hodring-cleanup-list " 
  184.                   + ",".join(list)
  185.     if hodRingOptions['hodring'].has_key('syslog-address'):
  186.       syslogAddr = hodRingOptions['hodring']['syslog-address'][0] + 
  187.                    ':' + str(hodRingOptions['hodring']['syslog-address'][1])
  188.       cmdString = cmdString + " --hodring-syslog-address " + syslogAddr
  189.     if service._cfg.has_key('pkgs'):
  190.       cmdString = cmdString + " --pkgs " + service._cfg['pkgs']
  191.     if mrSysDirManager is not None:
  192.       cmdString = "%s %s" % (cmdString, mrSysDirManager.toCleanupArgs())
  193.     log.info("cleanup commandstring : ")
  194.     log.info(cmdString)
  195.     # clean up
  196.     cmd = ['/bin/sh', '-c', cmdString]
  197.     mswindows = (sys.platform == "win32")
  198.     originalcwd = os.getcwd()
  199.     if not mswindows:
  200.       try: 
  201.         pid = os.fork() 
  202.         if pid > 0:
  203.           # exit first parent
  204.           log.info("child(pid: %s) is now doing cleanup" % pid)
  205.           sys.exit(0) 
  206.       except OSError, e: 
  207.         log.error("fork failed: %d (%s)" % (e.errno, e.strerror)) 
  208.         sys.exit(1)
  209.       # decouple from parent environment
  210.       os.chdir("/") 
  211.       os.setsid() 
  212.       os.umask(0) 
  213.  
  214.     MAXFD = 128 # more than enough file descriptors to close. Just in case.
  215.     for i in xrange(0, MAXFD):
  216.       try:
  217.         os.close(i)
  218.       except OSError:
  219.         pass
  220.   
  221.     try:
  222.       os.execvp(cmd[0], cmd)
  223.     finally:
  224.       log.critical("exec failed")
  225.       os._exit(1)
  226.   except Exception, e:
  227.     if service:
  228.       if service.log:
  229.         log = service.log
  230.     else:
  231.       log = getLogger(hodRingOptions['hodring'], 'hodring')
  232.     log.error("Error in bin/hodring %s. nStack trace:n%s" %(get_exception_error_string(),get_exception_string()))
  233.     
  234.     log.info("now trying informing to ringmaster")
  235.     log.info(hodRingOptions['hodring']['ringmaster-xrs-addr'])
  236.     log.info(hodRingOptions.normalizeValue('hodring', 'ringmaster-xrs-addr'))
  237.     log.info(to_http_url(hodRingOptions.normalizeValue( 
  238.             'hodring', 'ringmaster-xrs-addr')))
  239.     # Report errors to the Ringmaster if possible
  240.     try:
  241.       ringXRAddress = to_http_url(hodRingOptions.normalizeValue( 
  242.                                      'hodring', 'ringmaster-xrs-addr'))
  243.       log.debug("Creating ringmaster XML-RPC client.")
  244.       ringClient = hodXRClient(ringXRAddress)    
  245.       if ringClient is not None:
  246.         addr = local_fqdn() + "_" + str(os.getpid())
  247.         ringClient.setHodRingErrors(addr, str(e))
  248.         log.info("Reported errors to ringmaster at %s" % ringXRAddress)
  249.     except Exception, e:
  250.       log.error("Failed to report errors to ringmaster at %s" % ringXRAddress)
  251.       log.error("Reason : %s" % get_exception_string())
  252.     # End of reporting errors to the client