001 /**
002 * Copyright (c) 2010 Yahoo! Inc. All rights reserved.
003 * Licensed under the Apache License, Version 2.0 (the "License");
004 * you may not use this file except in compliance with the License.
005 * You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software
010 * distributed under the License is distributed on an "AS IS" BASIS,
011 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 * See the License for the specific language governing permissions and
013 * limitations under the License. See accompanying LICENSE file.
014 */
015 package org.apache.oozie.action.hadoop;
016
017 import org.apache.hadoop.mapred.Counters;
018 import org.apache.oozie.DagELFunctions;
019 import org.apache.oozie.util.ELEvaluationException;
020 import org.apache.oozie.util.XLog;
021 import org.apache.oozie.workflow.WorkflowInstance;
022 import org.json.simple.JSONValue;
023
024 import java.util.HashMap;
025 import java.util.Map;
026
027 /**
028 * Hadoop EL functions.
029 */
030 public class HadoopELFunctions {
031
032 private static final String HADOOP_COUNTERS = "oozie.el.action.hadoop.counters";
033
034 public static final String RECORDS = "org.apache.hadoop.mapred.Task$Counter";
035 public static final String MAP_IN = "MAP_INPUT_RECORDS";
036 public static final String MAP_OUT = "MAP_OUTPUT_RECORDS";
037 public static final String REDUCE_IN = "REDUCE_INPUT_RECORDS";
038 public static final String REDUCE_OUT = "REDUCE_OUTPUT_RECORDS";
039 public static final String GROUPS = "REDUCE_INPUT_GROUPS";
040
041 @SuppressWarnings("unchecked")
042 public static Map<String, Map<String, Long>> hadoop_counters(String nodeName) throws ELEvaluationException {
043 WorkflowInstance instance = DagELFunctions.getWorkflow().getWorkflowInstance();
044 Object obj = instance.getTransientVar(nodeName + WorkflowInstance.NODE_VAR_SEPARATOR + HADOOP_COUNTERS);
045 Map<String, Map<String, Long>> counters = (Map<String, Map<String, Long>>) obj;
046 if (counters == null) {
047 counters = getCounters(nodeName);
048 instance.setTransientVar(nodeName + WorkflowInstance.NODE_VAR_SEPARATOR + HADOOP_COUNTERS, counters);
049 }
050 return counters;
051 }
052
053 @SuppressWarnings("unchecked")
054 private static Map<String, Map<String, Long>> getCounters(String nodeName) throws ELEvaluationException {
055 String jsonCounters = DagELFunctions.getActionVar(nodeName, MapReduceActionExecutor.HADOOP_COUNTERS);
056 if (jsonCounters == null) {
057 throw new IllegalArgumentException(XLog.format("Hadoop counters not available for action [{0}]", nodeName));
058 }
059 return (Map) JSONValue.parse(jsonCounters);
060 }
061
062 }