如何使用hadoop.mapreduce.lib.output.multipleoutputs使用oozie工作流创建目录结构?

9jyewag0  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(266)

我正在使用workflow:0.5". 我的用例是为输出创建基于键的目录结构。这是我的配置file:-

`           
        <configuration>
                <!-- These are important. -->
                <property>
                    <name>mapred.mapper.new-api</name>
                    <value>true</value>
                </property>
                <property>
                    <name>mapred.reducer.new-api</name>
                    <value>true</value>
                </property>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queue.name}
                    </value>
                </property>
                <property>
                    <name>mapreduce.map.class</name>
                    <value>com.a.b.c.Amapper</value>
                </property>
                <property>
                    <name>mapreduce.reduce.class</name>
                    <value>com.a.b.c.Areducer</value>
                </property>
                <property>
                    <name>mapred.output.key.class</name>
                    <value>org.apache.hadoop.io.Text</value>
                </property>
                <property>
                    <name>mapred.output.value.class</name>
                    <value>org.apache.hadoop.io.Text</value>
                </property>
                <property>
                    <name>mapreduce.outputformat.class</name>
                    <value>org.apache.hadoop.mapreduce.lib.output.MultipleOutputs
                    </value>
                </property>
                <property>
                    <name>mapred.input.dir</name>
                    <value>${inputDir}</value>
                </property>
                <property>
                    <name>mapred.output.dir</name>
                    <value>${outputDir}</value>
                </property>
            </configuration>`

在reducer中,我想使用以下代码创建格式化的目录结构-

`public class Areducer extends Reducer<Text, Text, Text, Text> {
    private Text aggregatorRecord = new Text();
    private MultipleOutputs<Text, Text> out;

    public void setup(Context context) {
        out = new MultipleOutputs<Text, Text>(context);
    }

    public void reduce(Text aggregatorRecordKey,
            Iterable<Text> values, Context context)
            throws IOException, InterruptedException {
        /**
           some business logic to do aggregation to set aggregatorRecord.
        */
        String plist = "Surname|Forename";
        Text t = new Text(plist);
        out.write(aggregatorRecordKey, aggregatorRecord, generateFileName(t));
    }

    protected void cleanup(Context context) throws IOException,
            InterruptedException {
        out.close();
    }

    private String generateFileName(Text k) {
        String[] kStr = k.toString().split("\\|");

        String sName = kStr[0];
        String fName = kStr[1];

        // example for k = Smith|John
        // output written to /user/hadoop/path/to/output/Smith/John-r-00000
        // (etc)
        return sName + "/" + fName;
    }

`
oozie工作流给出了这个例外
java.lang.nosuchmethodexception:org.apache.hadoop.mapreduce.lib.output.multipleoutputs.<\init>()
有人能提出正确的方法来使用multipleoutputs来使用oozie工作流创建目录结构吗?

u4vypkhs

u4vypkhs1#

您的问题是,multipleoutputs不是outputformat,因此您没有将其设置为作业的输出格式。我通常使用java类来配置和提交我的multipleoutputs作业,但是看看您的代码,我认为您需要的是将输出格式类型设置为textoutputformat,并保持对reducer变量的引用不变。

相关问题