2017-10-21 78 views
0

我想了解一个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); 
} 

我的疑问是字计数类如何文本值进入所有脑干?我的意思是它的一个对象,但是在它生成的地方,主类方法没有实例化Text类的实例。

这意味着什么 - ,我从来没有低于格式

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

任何建议,如建立课前看到了这一点?

+0

这份工作,我认为你是在问两个问题被创建。由于语法错误,您的代码不会生成。 – nicomp

+2

您的代码也不可读,因为它没有正确缩进。 –

+0

@nicomp,可能不会建立起来,但这里只是试图理解文本价值是如何产生的? – JonyLinux

回答

3

您粘贴的代码是指使用Hadoop MapReduce framework运行。

基本上,你这里有三类:

  • 字计数映射这似乎分割字符串并将它们写入Hadoop的流上下文
  • 映射类,这是Hadoop的数据流的一部分库
  • WordCount将作业提交到Hadoop集群的驱动程序

其实我本来期望在你的问题中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 
+0

你的意思是说,当我们把数据放入HDFS时,Text对象由hadoop框架实例化。这是你想说的吗?因为文本的对象持有HDFS中的数据,但该对象似乎不是从主方法类生成的,所以只剩下Hadoop本身。不是吗? – JonyLinux

+1

是的,您将文件保存在HDFS中,然后当执行驱动程序时,它将连接到Hadoop集群,Hadoop集群将为您从HDFS中检索文件并将其提供给您的映射器。可以这么说,Text对象由Hadoop框架实例化。 –

+0

这不是Hadoop Streaming代码。流从stdin读取并写入标准输出。这是常规的MapReduce代码 –

0

Hadoop的API创建必要的类。

您可以选择设置InputFormat,该选项需要与setMapperClass(KEYIN,VALUEIN字段)中的类使用的输入格式相同。同样,还设置了输出格式,还有Reducer的输入和输出。

默认格式为TextInputFormat,其中包含LongWritable, Text键值对。 InputSplit类负责读取FileSystem中的字节,并创建传递给Mapper的Writable类。

值得一提的是什么,直到你开始喜欢

System.exit(job.waitForCompletion(true) ? 0 : 1); 
相关问题