コード例 #1
0
ファイル: manager.py プロジェクト: kaydoh/scale
    def perform_scheduling(self, client, when):
        """Organizes and analyzes the cluster resources, schedules new job executions, and launches tasks

        :param client: The Mesos scheduler client
        :type client: :class:`mesoshttp.client.MesosClient`
        :param when: The current time
        :type when: :class:`datetime.datetime`
        :returns: The number of tasks that were scheduled
        :rtype: int
        """
        # Get framework ID first to make sure it doesn't change throughout scheduling process
        framework_id = scheduler_mgr.framework_id
        if not framework_id or not client or not client.get_driver():
            # Don't schedule anything until the scheduler has connected to Mesos
            logger.warning(
                'Scheduler not connected to Mesos. Scheduling delayed until connection established.'
            )
            return 0

        resource_mgr.update_all_cluster_resources()

        job_types = job_type_mgr.get_job_types()
        job_type_resources = job_type_mgr.get_job_type_resources()
        tasks = task_mgr.get_all_tasks()
        running_job_exes = job_exe_mgr.get_running_job_exes()
        workspaces = workspace_mgr.get_workspaces()
        nodes = self._prepare_nodes(tasks, running_job_exes, when)
        fulfilled_nodes = self._schedule_waiting_tasks(nodes, running_job_exes,
                                                       when)

        sys_tasks_scheduled = self._schedule_system_tasks(
            fulfilled_nodes, job_type_resources, when)

        job_exe_count = 0
        if sys_tasks_scheduled:
            # Only schedule new job executions if all needed system tasks have been scheduled
            job_type_limits = self._calculate_job_type_limits(
                job_types, running_job_exes)
            job_exe_count = self._schedule_new_job_exes(
                framework_id, fulfilled_nodes, job_types, job_type_limits,
                job_type_resources, workspaces)
        else:
            logger.warning('No new jobs scheduled due to waiting system tasks')
            scheduler_mgr.warning_active(WAITING_SYSTEM_TASKS)

        if framework_id != scheduler_mgr.framework_id:
            logger.warning(
                'Scheduler framework ID changed, skipping task launch')
            return 0

        self._allocate_offers(nodes)
        declined = resource_mgr.decline_offers()
        self._decline_offers(declined)
        task_count, offer_count = self._launch_tasks(client, nodes)
        scheduler_mgr.add_scheduling_counts(job_exe_count, task_count,
                                            offer_count)
        return task_count
コード例 #2
0
    def perform_scheduling(self, driver, when):
        """Organizes and analyzes the cluster resources, schedules new job executions, and launches tasks

        :param driver: The Mesos scheduler driver
        :type driver: :class:`mesos_api.mesos.SchedulerDriver`
        :param when: The current time
        :type when: :class:`datetime.datetime`
        :returns: The number of tasks that were scheduled
        :rtype: int
        """

        # Get framework ID first to make sure it doesn't change throughout scheduling process
        framework_id = scheduler_mgr.framework_id

        job_types = job_type_mgr.get_job_types()
        job_type_resources = job_type_mgr.get_job_type_resources()
        tasks = task_mgr.get_all_tasks()
        running_job_exes = job_exe_mgr.get_running_job_exes()
        workspaces = workspace_mgr.get_workspaces()

        nodes = self._prepare_nodes(tasks, running_job_exes, when)
        fulfilled_nodes = self._schedule_waiting_tasks(nodes, running_job_exes,
                                                       when)

        sys_tasks_scheduled = self._schedule_system_tasks(
            fulfilled_nodes, job_type_resources, when)

        job_exe_count = 0
        if sys_tasks_scheduled:
            # Only schedule new job executions if all needed system tasks have been scheduled
            job_type_limits = self._calculate_job_type_limits(
                job_types, running_job_exes)
            job_exe_count = self._schedule_new_job_exes(
                framework_id, fulfilled_nodes, job_types, job_type_limits,
                job_type_resources, workspaces)
        else:
            # TODO: this is a good place for a scheduler warning in the status JSON
            logger.warning('No new jobs scheduled due to waiting system tasks')

        if framework_id != scheduler_mgr.framework_id:
            logger.warning(
                'Scheduler framework ID changed, skipping task launch')
            return 0

        self._allocate_offers(nodes)
        task_count, offer_count = self._launch_tasks(driver, nodes)
        scheduler_mgr.add_scheduling_counts(job_exe_count, task_count,
                                            offer_count)
        return task_count