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.conf.Configuration; 018 import org.apache.hadoop.fs.FileSystem; 019 import org.apache.hadoop.fs.FSDataOutputStream; 020 import org.apache.hadoop.fs.Path; 021 import org.apache.oozie.action.ActionExecutorException; 022 import org.apache.oozie.client.XOozieClient; 023 import org.apache.oozie.client.WorkflowAction; 024 import org.apache.oozie.util.XLog; 025 import org.apache.oozie.util.XmlUtils; 026 import org.jdom.Element; 027 import org.jdom.Namespace; 028 import org.jdom.JDOMException; 029 import org.mortbay.log.Log; 030 031 import java.io.IOException; 032 import java.util.List; 033 034 public class PigActionExecutor extends JavaActionExecutor { 035 036 public PigActionExecutor() { 037 super("pig"); 038 } 039 040 protected List<Class> getLauncherClasses() { 041 List<Class> classes = super.getLauncherClasses(); 042 classes.add(LauncherMain.class); 043 classes.add(MapReduceMain.class); 044 classes.add(PigMain.class); 045 return classes; 046 } 047 048 protected String getLauncherMain(Configuration launcherConf, Element actionXml) { 049 return launcherConf.get(LauncherMapper.CONF_OOZIE_ACTION_MAIN_CLASS, PigMain.class.getName()); 050 } 051 052 void injectActionCallback(Context context, Configuration launcherConf) { 053 } 054 055 @Override 056 Configuration setupLauncherConf(Configuration conf, Element actionXml, Path appPath, Context context) 057 throws ActionExecutorException { 058 super.setupLauncherConf(conf, actionXml, appPath, context); 059 Namespace ns = actionXml.getNamespace(); 060 String script = actionXml.getChild("script", ns).getTextTrim(); 061 String pigName = new Path(script).getName(); 062 String pigScriptContent = context.getProtoActionConf().get(XOozieClient.PIG_SCRIPT); 063 064 Path pigScriptFile = null; 065 if (pigScriptContent != null) { // Create pig script on hdfs if this is 066 // an http submission pig job; 067 FSDataOutputStream dos = null; 068 try { 069 Path actionPath = context.getActionDir(); 070 pigScriptFile = new Path(actionPath, script); 071 FileSystem fs = context.getAppFileSystem(); 072 dos = fs.create(pigScriptFile); 073 dos.writeBytes(pigScriptContent); 074 075 addToCache(conf, actionPath, script + "#" + pigName, false); 076 } 077 catch (Exception ex) { 078 throw new ActionExecutorException(ActionExecutorException.ErrorType.ERROR, "FAILED_OPERATION", XLog 079 .format("Not able to write pig script file {0} on hdfs", pigScriptFile), ex); 080 } 081 finally { 082 try { 083 if (dos != null) { 084 dos.close(); 085 } 086 } 087 catch (IOException ex) { 088 XLog.getLog(getClass()).error("Error: " + ex.getMessage()); 089 } 090 } 091 } 092 else { 093 addToCache(conf, appPath, script + "#" + pigName, false); 094 } 095 096 return conf; 097 } 098 099 @SuppressWarnings("unchecked") 100 Configuration setupActionConf(Configuration actionConf, Context context, Element actionXml, Path appPath) 101 throws ActionExecutorException { 102 super.setupActionConf(actionConf, context, actionXml, appPath); 103 Namespace ns = actionXml.getNamespace(); 104 105 String script = actionXml.getChild("script", ns).getTextTrim(); 106 String pigName = new Path(script).getName(); 107 108 List<Element> params = (List<Element>) actionXml.getChildren("param", ns); 109 String[] strParams = new String[params.size()]; 110 for (int i = 0; i < params.size(); i++) { 111 strParams[i] = params.get(i).getTextTrim(); 112 } 113 String[] strArgs = null; 114 List<Element> eArgs = actionXml.getChildren("argument", ns); 115 if (eArgs != null && eArgs.size() > 0) { 116 strArgs = new String[eArgs.size()]; 117 for (int i = 0; i < eArgs.size(); i++) { 118 strArgs[i] = eArgs.get(i).getTextTrim(); 119 } 120 } 121 PigMain.setPigScript(actionConf, pigName, strParams, strArgs); 122 return actionConf; 123 } 124 125 protected boolean getCaptureOutput(WorkflowAction action) throws JDOMException { 126 return true; 127 } 128 129 }