| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.hadoop.mapred; |
| |
| /** |
| * Represents the level of data-locality at which a job in the fair scheduler |
| * is allowed to launch tasks. By default, jobs are not allowed to launch |
| * non-data-local tasks until they have waited a small number of seconds to |
| * find a slot on a node that they have data on. If a job has waited this |
| * long, it is allowed to launch rack-local tasks as well (on nodes that may |
| * not have the task's input data, but share a rack with a node that does). |
| * Finally, after a further wait, jobs are allowed to launch tasks anywhere |
| * in the cluster. |
| * |
| * This enum defines three levels - NODE, RACK and ANY (for allowing tasks |
| * to be launched on any node). A map task's level can be obtained from |
| * its job through {@link #fromTask(JobInProgress, Task, TaskTrackerStatus)}. In |
| * addition, for any locality level, it is possible to get a "level cap" to pass |
| * to {@link JobInProgress#obtainNewMapTask(TaskTrackerStatus, int, int, int)} |
| * to ensure that only tasks at this level or lower are launched, through |
| * the {@link #toCacheLevelCap()} method. |
| */ |
| public enum LocalityLevel { |
| NODE, RACK, ANY; |
| |
| public static LocalityLevel fromTask(JobInProgress job, Task mapTask, |
| TaskTrackerStatus tracker) { |
| TaskID tipID = mapTask.getTaskID().getTaskID(); |
| TaskInProgress tip = job.getTaskInProgress(tipID); |
| switch (job.getLocalityLevel(tip, tracker)) { |
| case 0: return LocalityLevel.NODE; |
| case 1: return LocalityLevel.RACK; |
| default: return LocalityLevel.ANY; |
| } |
| } |
| |
| /** |
| * Obtain a JobInProgress cache level cap to pass to |
| * {@link JobInProgress#obtainNewMapTask(TaskTrackerStatus, int, int, int)} |
| * to ensure that only tasks of this locality level and lower are launched. |
| */ |
| public int toCacheLevelCap() { |
| switch(this) { |
| case NODE: return 1; |
| case RACK: return 2; |
| default: return Integer.MAX_VALUE; |
| } |
| } |
| } |