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

标签 java hadoop

我正在尝试理解一段 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));

        }

    }

映射器类

    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 类中文本值是如何产生的?我的意思是它是一个对象,但是在生成它的地方,没有登录主方法类来实例化 Text 类的实例。

这意味着什么 - 在创建如下格式的类之前我从未见过这个

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

有什么建议吗?

最佳答案

您粘贴的代码旨在使用 Hadoop MapReduce framework 运行.

基本上你在这里有三个类:

  • WordCount 映射器似乎可以拆分字符串并将其写入 Hadoop 流上下文
  • Mapper 类是 Hadoop 流媒体库的一部分
  • 将作业提交到 Hadoop 集群的 WordCount 驱动程序

实际上,我希望您的问题中有一个 WordCountReducer 类,但似乎不存在。

任何方式:通过将文本作为文件复制到 Hadoop 集群中,文本将“存在”,并且在运行作业之前必须位于 HDFS(Hadoop 文件系统)上。

这行代码引用了一个HDFS路径:

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

关于代码的问题:

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

这些是泛型类型(参见此处的 tutorial),每次您对映射器进行子类化时都必须声明它们。

您的 WordCount 映射器实际上继承了这个 Mapper 类并指定了四种类型:

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

这些是通信:

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

关于java - 如何在下面的代码中生成对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46862129/

相关文章:

java - 在 Java 中使用 JSoup 解析 HTML 中的标签数据

java - 当桶中的条目对象从阈值减少后,JDK 8中的hashmap是否会再次调整自身大小?

shell - Oozie shell 工作流程

hadoop - Oozie 作业错误 - java.io.IOException : configuration is not specified

java - 比较 JSP 中的枚举值

java - 当我从 html 表单传递值时,为什么我在 post api 期间收到 'Column cannot be null' 错误

java - 如何将 XSSF 颜色转换为 Java.awt.color 格式。因为XSSF颜色无法进行比较

python - 在 hadoop 集群上运行时出现 MRJob 错误

Hadoop 映射减少 : Order of records while grouping

apache - Hadoop hive 加载错误