org.apache.oozie.action.hadoop.LauncherMainTester.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.oozie.action.hadoop.LauncherMainTester.java

Source

/**
 * 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.oozie.action.hadoop;

import com.google.common.base.Preconditions;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.JobStatus;
import org.apache.hadoop.mapred.RunningJob;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapred.TextOutputFormat;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import static org.apache.commons.io.FileUtils.ONE_KB;
import static org.apache.commons.io.FileUtils.ONE_MB;

public class LauncherMainTester {

    public static final String JOB_ID_FILE_NAME = "jobID.txt";

    public static void main(String[] args) throws Throwable {
        if (args.length == 0) {
            System.out.println("Hello World!");
        }

        String testJavaOpts = System.getProperty("testJavaOpts");
        if (testJavaOpts != null && Boolean.parseBoolean(testJavaOpts)) {
            throw new RuntimeException("Failing on purpose");
        }
        String env = System.getenv("LAUNCHER_ENVIRON");
        if (env != null && env.equals("foo1")) {
            throw new RuntimeException("Failing on purpose");
        }

        final String firstArgument = args.length > 0 ? args[0] : null;
        if (args.length == 1) {
            if ("throwable".equals(firstArgument)) {
                throw new Throwable("throwing throwable");
            }
            if ("exception".equals(firstArgument)) {
                throw new IOException("throwing exception");
            }
            if ("exit0".equals(firstArgument)) {
                System.exit(0);
            }
            if ("exit1".equals(firstArgument)) {
                System.exit(1);
            }
            if ("out".equals(firstArgument)) {
                File file = new File(System.getProperty("oozie.action.output.properties"));
                Properties props = new Properties();
                props.setProperty("a", "A");
                OutputStream os = new FileOutputStream(file);
                props.store(os, "");
                os.close();
                System.out.println(file.getAbsolutePath());
            }
            if ("id".equals(firstArgument)) {
                File file = new File(System.getProperty("oozie.action.newId"));
                Properties props = new Properties();
                props.setProperty("id", "IDSWAP");
                OutputStream os = new FileOutputStream(file);
                props.store(os, "");
                os.close();
                System.out.println(file.getAbsolutePath());
            }
            if ("securityManager".equals(firstArgument)) {
                SecurityManager sm = System.getSecurityManager();
                if (sm == null) {
                    throw new Throwable("no security manager");
                }
                // by using NULL as permission, if an underlaying SecurityManager is in place
                // a security exception will be thrown. As there is not underlaying SecurityManager
                // this tests that the delegation logic of the LauncherAMUtils SecurityManager is
                // correct for both checkPermission() signatures.
                sm.checkPermission(null);
                sm.checkPermission(null, sm.getSecurityContext());
            }
            if (firstArgument.startsWith("-Xmx")) {
                tryAllocate(firstArgument);
            }
        }
        if (args.length == 3) {
            if ("javamapreduce".equals(firstArgument)) {
                executeJavaMapReduce(args);
            }
        }
        checkAndSleep(args);
    }

    private static void executeJavaMapReduce(String[] args) throws IOException, InterruptedException {
        JobConf jConf = createSleepMapperReducerJobConf();
        final Path input = new Path(args[1]);
        FileInputFormat.setInputPaths(jConf, input);
        FileOutputFormat.setOutputPath(jConf, new Path(args[2]));
        writeToFile(input, jConf, "dummy\n", "data.txt");
        JobClient jc = new JobClient(jConf);
        System.out.println("Submitting MR job");
        RunningJob job = jc.submitJob(jConf);
        System.out.println("Submitted job " + job.getID().toString());
        writeToFile(input, jConf, job.getID().toString(), JOB_ID_FILE_NAME);
        job.waitForCompletion();
        jc.monitorAndPrintJob(jConf, job);
        if (job.getJobState() != JobStatus.SUCCEEDED) {
            System.err.println(job.getJobState() + " job state instead of" + JobStatus.SUCCEEDED);
            System.exit(-1);
        }
    }

    private static JobConf createSleepMapperReducerJobConf() {
        JobConf jConf = new JobConf(true);
        jConf.addResource(new Path("file:///", System.getProperty("oozie.action.conf.xml")));
        jConf.setMapperClass(SleepMapperReducerForTest.class);
        jConf.setReducerClass(SleepMapperReducerForTest.class);
        jConf.setOutputKeyClass(Text.class);
        jConf.setOutputValueClass(IntWritable.class);
        jConf.setInputFormat(TextInputFormat.class);
        jConf.setOutputFormat(TextOutputFormat.class);
        jConf.setNumReduceTasks(1);
        jConf.set(SleepMapperReducerForTest.SLEEP_TIME_MILLIS_KEY, "60000");
        return jConf;
    }

    private static void writeToFile(Path input, JobConf jConf, String content, String fileName) throws IOException {
        try (FileSystem fs = FileSystem.get(jConf);
                Writer w = new OutputStreamWriter(fs.create(new Path(input, fileName)), StandardCharsets.UTF_8)) {
            w.write(content);
        }
        System.out.println("Job Id written to file");
    }

    private static void tryAllocate(final String xmxParameter) {
        Preconditions.checkArgument(JavaActionExecutor.HEAP_MODIFIERS_PATTERN.matcher(xmxParameter).matches(),
                String.format("malformed heap modifier pattern [%s]", xmxParameter));

        final String xmxParameterKey = "-Xmx";
        final String configuredHeapMaxUnitAndUOM = xmxParameter
                .substring(xmxParameter.indexOf(xmxParameterKey) + xmxParameterKey.length());
        final long configuredHeapMaxMb = new BytesAndUOMConverter().toMegabytes(configuredHeapMaxUnitAndUOM);

        System.out.println(String.format("Trying to allocate in total [%s] megabytes", configuredHeapMaxMb));

        final List<ByteBuffer> megabytes = new ArrayList<>();
        for (int ixMB = 0; ixMB < configuredHeapMaxMb; ixMB++) {
            megabytes.add(ByteBuffer.allocate((int) ONE_MB));
            if (ixMB % (ONE_KB / 8) == 0) {
                System.out.println(String.format("Allocated [%s] megabytes", ixMB));
            }
        }

        System.out.println(String.format("All [%s] megabytes allocated successfully", configuredHeapMaxMb));
    }

    private static void checkAndSleep(String args[]) throws InterruptedException {
        if (args.length == 2 && args[0].equals("sleep")) {
            long sleepTime = Long.parseLong(args[1]);

            Thread.sleep(sleepTime);
        }
    }

}