복붙노트

[HADOOP] 아래 코드에서 객체가 어떻게 생성됩니까?

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 클래스의 인스턴스를 인스턴스화하기위한 main 메소드 클래스의 사인이 없다.

그리고 이것이 의미하는 바는 - 나는 아래의 형식처럼 클래스를 생성하기 전에 이것을 본 적이 없다.

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

어떤 제안?

해결법

  1. ==============================

    1.붙여 넣은 코드는 Hadoop MapReduce 프레임 워크를 사용하여 실행됩니다.

    붙여 넣은 코드는 Hadoop MapReduce 프레임 워크를 사용하여 실행됩니다.

    기본적으로 여기에 세 개의 클래스가 있습니다.

    실제로 나는 당신의 질문에 WordCountReducer 클래스를 예상했을 것입니다,하지만 거기에없는 것 같습니다.

    어떤 방식 으로든 : 텍스트는 Hadoop 클러스터에 파일로 복사하여 "존재하게 될 것"이며 작업을 실행하기 전에 HDFS (Hadoop File System)에 있어야합니다.

    이 코드 행은 하나의 HDFS 경로를 나타냅니다.

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

    그리고 코드에 관한 질문 :

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

    이들은 매퍼 (mapper)를 서브 클래스 할 때마다 선언되어야하는 제네릭 타입 (이 튜토리얼 참조)이다.

    WordCount 매퍼는 실제로이 Mapper 클래스를 하위 클래스로 지정하고 네 가지 유형을 지정합니다.

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

    다음은 해당 사항입니다.

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

    2.Hadoop API는 필요한 클래스를 생성합니다.

    Hadoop API는 필요한 클래스를 생성합니다.

    선택적으로 InputFormat을 설정할 수 있습니다.이 형식은 setMapperClass (KEYIN, VALUEIN 필드)의 클래스에서 사용하는 입력 형식과 동일해야합니다. 마찬가지로 출력 형식도 설정되며 감속기의 입력과 출력이 있습니다.

    기본 형식은 LongWritable, Text 키 값 쌍을 읽는 TextInputFormat입니다. InputSplit 클래스는 FileSystem에서 바이트를 읽고 Mapper에 전달되는 Writable 클래스를 작성합니다.

    당신이 직업을 시작할 때까지 아무 것도 창조되지 않는다는 것을 언급할만한 가치가 있습니다.

    System.exit(job.waitForCompletion(true) ? 0 : 1);
    
  3. from https://stackoverflow.com/questions/46862129/how-object-is-getting-generated-in-below-code by cc-by-sa and MIT license