2017-10-21 140 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); 
相關問題