浅谈mapreduce程序部署
虽然我们在虚拟机客户端上能很快通过shell命令,进行执行一些已经封装好实例程序,但是在应用中还是是自己写程序,然后部署到服务器中去,下面,我通过程序进行浅谈一个程序的部署过程。在启动Hadoop之后,然后把程序达成可执行的jar包,并把相应的第三方jar包 包含进去。执行hadoop jar XXX. +驱动名称。package com.mapred;import java.i
虽然我们在虚拟机客户端上能很快通过shell命令,进行执行一些已经封装好实例程序,但是在应用中还是是自己写程序,然后部署到服务器中去,下面,我通过程序进行浅谈一个程序的部署过程。
在启动Hadoop之后,然后把程序达成可执行的jar包,并把相应的第三方jar包 包含进去。执行hadoop jar XXX. +驱动名称。
package com.mapred;
import java.io.IOException;
import java.io.PrintStream;
import java.util.StringTokenizer;
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.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;
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.GenericOptionsParser;
public class WordCount
{
public static void main(String[] args)
throws Exception
{
Configuration conf = new Configuration();
/* String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: wordcount <in> <out>");
System.exit(2);
}*/
Job job = new Job(conf, "word count");
job.setJarByClass(WordCount.class);
FileInputFormat.addInputPath(job, new Path("hdfs://ubuntu:9000/Input"));
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
FileOutputFormat.setOutputPath(job, new Path("hdfs://ubuntu:9000/output09"));
job.waitForCompletion(true);
}
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable>
{
private IntWritable result;
public IntSumReducer()
{
this.result = new IntWritable();
}
public void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException
{
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
this.result.set(sum);
context.write(key, this.result);
}
}
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>
{
private static final IntWritable one = new IntWritable(1);
private Text word;
public TokenizerMapper()
{
this.word = new Text();
}
public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
this.word.set(itr.nextToken());
context.write(this.word, one);
}
}
}
}
在执行的过程中要注意以下几个事项:
首先要注意的就是,文件在hdfs上的位置是否正确,记住只需要指定文件夹名称即可,里面有多少具体文件,Hadoop都一并给你处理,注意观察在执行过程中所出现的异常。
因为我在执行和调试过程中也出现很多异常,我认为这些异常是情况很多的,希望有兴趣的同学和我一起交流,共同分析和研究它。
1:注意观察虚拟机终端中报的错误,根据错误进行相应改进,因为关联jar较多,所以当提示你少相应的某一个包时,你要注意引进过来。
2:这里我是部署到虚拟机中执行的,不过在网上看过很多资料说,通过Eclipse也可以直接进行数据的处理,但是我没有调试成功,希望大家谁成功了,告知我一声。我感觉我是版本和虚拟机可能没有绑定好。
3:用Java命令(Java -jar XXX.jar)也可以执行。而且在这种情况下不需要安装和部署Hadoop环境。但是因为我的Java虚拟机在运行时,老是提示内存不足。没有成功,我还是在Hadoop环境和总成功的。大家可以尝试并交流着去做一下。这个东西,处理数据有点意思。
更多推荐
所有评论(0)