概述
这是一个简单的计算词频的程序,利用hadoop运行出结果。
简单的分析图:
代码如下:
import java.io.IOException;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
public class WordCount extends Configured implements Tool{
@Override
public int run(String[] args) throws Exception {
//获取hadoop的系统配置
Configuration conf = new Configuration() ;
//加上URI可以在eclipse上运行改程序
URI uri = new URI("hdfs://hadoop:9000") ;
//获取文件系统的配置
FileSystem fs = FileSystem.get(uri, conf) ;
//输出文件的目录,结果文件存储的位置
Path outPath = new Path("hdfs://hadoop:9000/ming/wordout") ;
//输入文件的目录,含有单词的文件
Path inPath = new Path("hdfs://hadoop:9000/ming/word.txt") ;
//如果输出文件存在则删除,不能含有相同的输出文件目录
if(fs.isDirectory(outPath)){
fs.delete(outPath, true) ;
}
//创建一个工作的对象
Job job = new Job(conf) ;
job.setJarByClass(WordCount.class);
//设置Mapper的类和输出格式
job.setMapperClass(WCMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
//设置Reducer的类和输出格式
job.setReducerClass(WCReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
//增加文件的输入和输出格式
FileInputFormat.addInputPath(job, inPath);
FileOutputFormat.setOutputPath(job, outPath);
return job.waitForCompletion(true)?1:0;
}
public static void main(String[] args) throws Exception {
//主函数的入口点
int ec = ToolRunner.run(new Configuration(), new WordCount(), args);
System.exit(ec);
}
public static class WCMapper extends Mapper<LongWritable,Text,Text,LongWritable>{
@Override
protected void map(LongWritable key,Text value,Context context) throws IOException, InterruptedException{
//对每行的单词进行切分,以单词作为key,每个单词的词频为1作为value
String[] line = value.toString().split("t") ;
for(String s : line){
context.write(new Text(s), new LongWritable(1));
}
}
}
public static class WCReducer extends Reducer<Text,LongWritable,Text,Text>{
@Override
protected void reduce(Text key,Iterable<LongWritable> values,Context context) throws IOException, InterruptedException{
//计算每个单词的词频总数
long sum = 0 ;
for(LongWritable l:values){
sum = sum + l.get();
}
context.write(key, new Text(String.valueOf(sum)));
}
}
}
最后
以上就是不安鸡翅为你收集整理的利用hadoop计算WordCount的全部内容,希望文章能够帮你解决利用hadoop计算WordCount所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复