我试图理解一个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));
}
}
Mapper Class
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方法类中没有符号来实例化Text类的实例。
这意味着什么 - 我在创建类之前从未见过这样的格式
public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
{
有什么建议吗?
答案 0 :(得分:3)
您粘贴的代码是使用Hadoop MapReduce framework运行的。
基本上你有三个班级:
实际上我会在你的问题中预期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
答案 1 :(得分:0)
Hadoop API会创建必要的类。
您可以选择设置setMapperClass
,这需要与TextInputFormat
(KEYIN,VALUEIN字段)中的类使用的输入格式相同。同样,还设置了输出格式,还有Reducer的输入和输出。
默认格式为LongWritable, Text
,可读取InputSplit
个键值对。 Writable
类负责读取FileSystem上的字节并创建传递给Mapper的System.exit(job.waitForCompletion(true) ? 0 : 1);
类。
值得一提的是,在你开始这项工作之前不会创造任何东西,比如
php /path/ artisan schedule:run