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

网格计算

开发平台:

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, getpass
  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.RingMaster.ringMaster import main
  39. from hodlib.Common.setup import *
  40. from hodlib.Common.descGenerator import *
  41. from hodlib.Common.util import local_fqdn, filter_warnings, to_http_url, 
  42.                         get_exception_string, get_exception_error_string
  43. from hodlib.Common.logger import getLogger, ensureLogDir
  44. from hodlib.Common.xmlrpc import hodXRClient
  45. import logging
  46. filter_warnings()
  47. reVersion = re.compile(".*(d+_d+).*")
  48. VERSION = '$HeadURL$'
  49. reMatch = reVersion.match(VERSION)
  50. if reMatch:
  51.     VERSION = reMatch.group(1)
  52.     VERSION = re.sub("_", ".", VERSION)
  53. else:
  54.     VERSION = 'DEV'
  55. # Definition tuple is of the form:
  56. #  (name, type, description, default value, required?, validate?)
  57. #
  58. defList = { 'ringmaster' : (
  59.              ('work-dirs', 'list', 'hod work directories',
  60.               False, None, True, False),
  61.              ('temp-dir', 'directory', 'Ringmaster temporary directory.',
  62.               False, None, True, False),
  63.               
  64.              ('log-dir', 'directory', 'hod logging directory.', 
  65.               False, os.path.join(rootDirectory, 'logs'), False, True),
  66.               
  67.              ('syslog-address', 'address', 'Syslog address.',
  68.               False, None, False, True),
  69.                
  70.              ('xrs-port-range', 'range', 'XML-RPC port range n-m.',
  71.               False, None, True, True),
  72.               
  73.              ('http-port-range', 'range', 'HTTP port range n-m.',
  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.               
  85.              ('userid', 'user_account', 
  86.               'User ID the hod shell is running under.',
  87.               False, None, True, False),
  88.                
  89.              ('svcrgy-addr', 'address', 'Download HTTP address.',
  90.               False, None, False, True),             
  91.              
  92.              ('hadoop-tar-ball', 'uri', 'hadoop program tar ball.',
  93.               False, None, False, False),
  94.         
  95.              ('max-connect','pos_int','max connections allowed for a single tarball server',
  96.              False, 30, False, True),
  97.              ('jt-poll-interval', 'pos_int', 'How often to poll the Job tracker for idleness',
  98.              False, 120, False, True),
  99.              ('idleness-limit', 'pos_int', 'Limit after which to deallocate the cluster',
  100.              False, 3600, False, True),
  101.              ('max-master-failures', 'pos_int', 
  102.               'Defines how many times a master can fail before' 
  103.               ' failing cluster allocation', False, 5, True, True),
  104.              ('workers_per_ring', 'pos_int', 'Defines number of workers per service per hodring',
  105.               False, 1, False, True)),
  106.             'resource_manager' : (
  107.              ('id', 'string', 'Batch scheduler ID: torque|condor.',
  108.               False, None, True, True),
  109.              ('pbs-user', 'user_account', 'User ID jobs are submitted under.',
  110.               False, None, False, True),
  111.              ('pbs-server', 'hostname', 'Hostname of PBS server.',
  112.               False, None, False, True),    
  113.              ('pbs-account', 'string', 'User Account jobs are submitted under.',
  114.               False, None, False, False),
  115.              ('queue', 'string', 'Queue of the batch scheduler to query.',
  116.               False, None, False, False),
  117.               
  118.              ('batch-home', 'directory', 'Scheduler installation directory.',
  119.               False, None, True, True),
  120.              
  121.              ('options', 'keyval', 'Options to pass to the scheduler.',
  122.               False, None, False, True),                    
  123.              ('env-vars', 'keyval', 'Environment variables to pass to the submitted jobs.',
  124.               False, None, False, True)),
  125.             'gridservice-mapred' : (   
  126.              ('external', 'bool', "Connect to an already running MapRed?",
  127.               False, False, True, True),
  128.                           
  129.              ('host', 'hostname', 'Mapred hostname.', 
  130.               False, 'localhost', False, True),
  131.              ('info_port', 'pos_int', 'Mapred info port.',
  132.               False, None, True, True), 
  133.              
  134.              ('tracker_port', 'pos_int', 'Mapred job tracker port.',
  135.               False, None, True, True),                  
  136.                           
  137.              ('cmdline-params', 'keyval', 'Hadoop cmdline key/value list.',
  138.               False, None, False, False),
  139.              ('server-params', 'keyval', 'Hadoop xml key/value list',
  140.               False, None, False, False),
  141.              ('final-server-params', 'keyval', 'Hadoop final xml params',
  142.               False, None, False, False),
  143.               
  144.              ('envs', 'keyval', 'environment to run this package in',
  145.               False, None, False, False),
  146.               
  147.              ('pkgs', 'directory', "directory where the package is installed",
  148.               False, None, False, False)), 
  149.                
  150.                
  151.             'gridservice-hdfs' : (
  152.              ('external', 'bool', "Connect to an already running HDFS?",
  153.               False, False, True, True),
  154.               
  155.              ('host', 'hostname', 'HDFS hostname.', 
  156.               False, 'localhost', True, True),
  157.              
  158.              ('fs_port', 'pos_int', 'HDFS port range.',
  159.               False, None, True, True),
  160.               
  161.              ('info_port', 'pos_int', 'HDFS info port.',
  162.               False, None, True, True), 
  163.              
  164.              ('cmdline-params', 'keyval', 'Hadoop cmdline key/value list.',
  165.               False, None, False, False),
  166.              ('server-params', 'keyval', 'Hadoop xml key/value list',
  167.               False, None, False, False),
  168.              ('final-server-params', 'keyval', 'Hadoop final xml params',
  169.               False, None, False, False),
  170.            
  171.              ('envs', 'keyval', 'Environment in which to run this package.',
  172.               False, None, False, False),
  173.              ('pkgs', 'directory', "directory where the package is installed",
  174.               False, None, False, False)),          
  175.              
  176.              
  177.             'hodring' : (
  178.              ('temp-dir', 'directory', 'hod work directories',
  179.               False, None, True, False),
  180.               
  181.              ('log-dir', 'directory', 'hod logging directory.', 
  182.               False, os.path.join(rootDirectory, 'logs'), False, False), 
  183.              ('log-destination-uri', 'string', 
  184.               'URI to store logs to, local://some_path or '
  185.               + 'hdfs://host:port/some_path', 
  186.               False, None, False, True),             
  187.              ('pkgs', 'directory', 'Path to Hadoop to use in case of uploading to HDFS',
  188.               False, None, False, True),
  189.               
  190.              ('syslog-address', 'address', 'Syslog address.',
  191.               False, None, False, True),
  192.           
  193.              ('java-home', 'directory', 'Java home directory.',
  194.               False, None, True, False),
  195.               
  196.              ('debug', 'pos_int', 'Debugging level, 0-4.',
  197.               False, 3, True, True),
  198.                
  199.              ('register', 'bool', 'Register with service registry?',
  200.               False, True, True, True),
  201.                
  202.              ('stream', 'bool', 'Output to stderr.',
  203.               False, False, False, True),
  204.              ('userid', 'user_account', 
  205.               'User ID the hod shell is running under.',
  206.               False, None, True, False),
  207.              ('xrs-port-range', 'range', 'XML-RPC port range n-m.',
  208.               False, None, True, True),
  209.                
  210.              ('http-port-range', 'range', 'HTTP port range n-m.',
  211.               False, None, True, True),
  212.                
  213.              ('command', 'string', 'Command for hodring to run.',
  214.               False, None, False, True),
  215.               
  216.              ('service-id', 'string', 'Service ID.',
  217.               False, None, False, True),
  218.               
  219.              ('download-addr', 'address', 'Download HTTP address.',
  220.               False, None, False, True),
  221.                
  222.              ('svcrgy-addr', 'address', 'Download HTTP address.',
  223.               False, None, False, True),
  224.     
  225.              ('ringmaster-xrs-addr', 'address', 'Ringmaster XML-RPC address.',
  226.               False, None, False, True),
  227.  
  228.              ('tarball-retry-initial-time', 'pos_float','initial retry time for tarball download',
  229.               False, 1, False, True),
  230.               
  231.              ('tarball-retry-interval', 'pos_float','interval to spread retries for tarball download',
  232.               False, 3, False, True),
  233.               
  234.              ('cmd-retry-initial-time', 'pos_float','initial retry time for getting commands',
  235.               False, 2, False, True),
  236.              
  237.              ('cmd-retry-interval', 'pos_float','interval to spread retries for getting commands',
  238.               False, 2, False, True),
  239.  
  240.              ('mapred-system-dir-root', 'string', 'Root under which mapreduce system directory names are generated by HOD.',
  241.               False, '/mapredsystem', False, False))
  242.               }   
  243.              
  244. defOrder = [ 'ringmaster', 'hodring', 'resource_manager', 
  245.              'gridservice-mapred', 'gridservice-hdfs' ]
  246. if __name__ == '__main__':
  247.   confDef = definition()
  248.   confDef.add_defs(defList, defOrder)
  249.   ringMasterOptions = options(confDef, "./%s [OPTIONS]" % myName, VERSION)
  250.   log = logging.getLogger()
  251.   try:
  252.     # Set up logging before anything else.
  253.     ensureLogDir(ringMasterOptions.normalizeValue('ringmaster', 'log-dir'))
  254.     log = getLogger(ringMasterOptions['ringmaster'],'ringmaster')
  255.     # End of setting up logging
  256.     # Verify and process options
  257.     statusMsgs = []
  258.     # Conditional validation
  259.     if not ringMasterOptions['ringmaster'].has_key('hadoop-tar-ball') or 
  260.         not ringMasterOptions['ringmaster']['hadoop-tar-ball']:
  261.       # If tarball is not used
  262.       if not ringMasterOptions.normalizeValue('gridservice-hdfs', 'external'):
  263.         # And if hdfs is not external, validate gridservice-hdfs.pkgs
  264.         statusMsgs.extend(ringMasterOptions.validateValue(
  265.                                                   'gridservice-hdfs', 'pkgs'))
  266.       statusMsgs.extend(ringMasterOptions.validateValue(
  267.                                                   'gridservice-mapred', 'pkgs'))
  268.     if len(statusMsgs) != 0:
  269.       # format status messages into a single string
  270.       errStr = ''
  271.       for msg in statusMsgs:
  272.         errStr = "%s%sn" % (errStr, msg)
  273.       raise Exception("%s" % errStr)
  274.     # End of conditional validation
  275.     (status, statusMsgs) = ringMasterOptions.verify()
  276.     if not status:
  277.       # format status messages into a single string
  278.       errStr = ''
  279.       for msg in statusMsgs:
  280.         errStr = "%s%sn" % (errStr, msg)
  281.       raise Exception("%s" % errStr)
  282.     ringMasterOptions.replace_escape_seqs()
  283.     ringMasterOptions['ringmaster']['base-dir'] = rootDirectory 
  284.     # End of option processing
  285.     ret = main(ringMasterOptions,log)
  286.     sys.exit(ret)
  287.   except Exception, e:
  288.     log.error("bin/ringmaster failed to start.%s. Stack trace follows:n%s" % (get_exception_error_string(),get_exception_string()))
  289.     # Report errors to the client if possible
  290.     try:
  291.       serviceAddr = to_http_url(ringMasterOptions.normalizeValue( 
  292.                                      'ringmaster', 'svcrgy-addr'))
  293.       serviceClient = hodXRClient(serviceAddr)
  294.       if serviceClient is not None:
  295.         serviceClient.setRMError([local_fqdn(), str(e), 
  296.                                     get_exception_string()])
  297.         log.info("Reported errors to service registry at %s" % serviceAddr)
  298.     except Exception, e:
  299.       log.error("Failed to report errors to service registry.")
  300.       log.error("Reason : %s" % get_exception_string())
  301.     # End of reporting errors to the client
  302.     # Ringmaster failing to start is a ringmaster error. Exit with the appropriate exit code.
  303.     sys.exit(6)