/**
* (c) Copyright 2013 WibiData, Inc.
*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* Licensed 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.kiji.mapreduce.output.framework;
import java.io.IOException;
import java.util.Map;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.OutputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat;
import org.kiji.annotations.ApiAudience;
import org.kiji.annotations.ApiStability;
import org.kiji.mapreduce.KijiTableContext;
import org.kiji.mapreduce.MapReduceJobOutput;
import org.kiji.mapreduce.framework.KijiConfKeys;
import org.kiji.mapreduce.impl.HFileWriterContext;
import org.kiji.mapreduce.output.HFileMapReduceJobOutput;
/**
* M/R job output configuration for a job intending to reduce into HFiles.
*
* Used for the special case when the user wants a reducer to write HFiles.
* Reducers can't write HFiles directly, but must write SequenceFiles that will be post-processed
* (sorted) by an identity MapReduce in order to finally write HFiles.
*/
@ApiAudience.Framework
@ApiStability.Evolving
public final class HFileReducerMapReduceJobOutput extends MapReduceJobOutput {
private final HFileMapReduceJobOutput mJobOutput;
/** {@inheritDoc} */
@Override
public void initialize(Map<String, String> params) throws IOException {
// TODO(KIJIMR-63): this is ugly and should be fixed
throw new UnsupportedOperationException();
}
/**
* Initializes an instance.
*
* @param jobOutput Wraps this HFile M/R job output.
*/
public HFileReducerMapReduceJobOutput(HFileMapReduceJobOutput jobOutput) {
mJobOutput = jobOutput;
}
/** {@inheritDoc} */
@Override
public void configure(Job job) throws IOException {
super.configure(job); // sets the Hadoop output format
final Configuration conf = job.getConfiguration();
conf.set(KijiConfKeys.KIJI_OUTPUT_TABLE_URI, mJobOutput.getOutputTableURI().toString());
// Kiji table context:
conf.setClass(
KijiConfKeys.KIJI_TABLE_CONTEXT_CLASS,
HFileWriterContext.class,
KijiTableContext.class);
// Set the output path.
FileOutputFormat.setOutputPath(job, mJobOutput.getPath());
job.setNumReduceTasks(mJobOutput.getNumReduceTasks());
}
/** {@inheritDoc} */
@Override
protected Class<? extends OutputFormat> getOutputFormatClass() {
return SequenceFileOutputFormat.class;
}
}