如何在下面的代码中生成对象?

tvz2xvvm  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(335)

我试着理解一个java代码(java基础知识)
它在这里
wordcountmapper类

package com.company;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;

public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    @Override
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

        String line = value.toString();
        for (String word : line.split(" ")) {

            if (word.length() > 0) {
                context.write(new Text(word), new IntWritable(1));

        }

    }

Map类

package org.apache.hadoop.mapreduce;

import java.io.IOException;
import org.apache.hadoop.classification.InterfaceAudience.Public;
import org.apache.hadoop.classification.InterfaceStability.Stable;

@InterfaceAudience.Public
@InterfaceStability.Stable
public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
    public Mapper() {
    }

    protected void setup(Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.Context context)
            throws IOException, InterruptedException {
    }

    protected void map(KEYIN key, VALUEIN value, Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.Context context)
            throws IOException, InterruptedException {
        context.write(key, value);
    }

    protected void cleanup(Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.Context context)
            throws IOException, InterruptedException {
    }

    public void run(Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.Context context) throws IOException, InterruptedException {
        setup(context);
        while (context.nextKeyValue()) {
            map(context.getCurrentKey(), context.getCurrentValue(), context);
        }
        cleanup(context);
    }

    public abstract class Context implements MapContext<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
        public Context() {
        }

}

}
主方法类

package com.company;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {
public static void main(String[] args) throws Exception {
if(args.length !=2){
System.err.println("Invalid Command");
System.err.println("Usage: WordCount <input path> <output path>");
System.exit(0);
}
Configuration conf = new Configuration();
Job job = new Job(conf, "wordcount");
job.setJarByClass(WordCount.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
}

我的疑问是在wordcount类中文本值是如何产生的?我的意思是它是一个对象,但在生成它的地方,并没有登录主方法类来示例化文本类的示例。
它的意思是-,在创建如下格式的类之前,我从未见过这种情况

public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
{

有什么建议吗?

vhmi4jdf

vhmi4jdf1#

hadoopapi创建了必要的类。
您可以选择设置 InputFormat ,这需要与中的类使用的输入格式相同 setMapperClass (键入、值输入字段)。类似地,还设置了一个输出格式,并且有一个减速机的输入和输出。
默认格式为 TextInputFormat 上面写着 LongWritable, Text 键值对。这个 InputSplit 类负责从文件系统中读取字节并创建 Writable 传递给Map器的类。
值得一提的是,除非你像这样开始工作,否则什么都不会创造

System.exit(job.waitForCompletion(true) ? 0 : 1);
hgb9j2n6

hgb9j2n62#

您粘贴的代码是要使用hadoopmapreduce框架运行的。
基本上你有三个班:
wordcountMap器,它似乎可以分割字符串并将这些字符串写入hadoop流上下文
mapper类是hadoop流媒体库的一部分
将作业提交到hadoop集群的wordcount驱动程序
事实上我本以为 WordCountReducer 你的问题,但似乎没有。
任何方式:文本将作为一个文件复制到hadoop集群中,并且在运行作业之前必须在hdfs(hadoop文件系统)上。
这行代码引用一个hdfs路径:

FileInputFormat.addInputPath(job, new Path(args[0]));

关于密码的问题:

public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>

这些是泛型类型(请参阅本教程),每次对Map器进行子类化时都必须声明它们。
你的 WordCount Map器实际上是这个的子类 Mapper 类并指定四种类型:

public class WordCountMapper extends Mapper<LongWritable,Text,Text,IntWritable>

这些是通信:

KEYIN    = LongWritable
VALUEIN  = Text
KEYOUT   = Text
VALUEOUT = IntWritable

相关问题