您的位置:首页 > 编程语言 > Java开发

windows下Eclipse的Hadoop运行调试环境搭建

2016-03-27 09:18 585 查看
环境说明:

windows 7

Eclipse mars

hadoop-eclipse插件

hadoop-core-1.2.1-forwinlocal.jar

hadoop集群

hadoop-1.2.1-bin.tar.gz

3.4的下载地址见http://pan.baidu.com/s/1i4ejXch

首先有两种运行方式:

MR程序以Local模式运行在windows本地,操作hdfs的文件。适用于利用小规模的数据集调试MR程序,之后打包成jar上传到集群进行正式的作业。

MR程序直接运行在hadoop集群上,省去打包上传到集群的步骤,Eclipse的Console会打印相关信息

推荐使用第一种方式,一是由于配置简单,二是由于正式作业时间较长,这样就可以不用直接开着自己电脑上的Eclipse了。调试好的程序直接去运行即可。以下分开对两种运行模式的配置做说明。

注:为解决部分权限问题,需要将windows的用户名Administrator或者自定义的用户名修改为hadoop集群的用户名称,如root,或hadoop等。

Windows的Local模式运行

将hadoop-eclispe插件放入eclipse安装目录的plugins文件夹下

解压hadoop-1.2.1-bin.tar.gz,将hadoop-core-1.2.1.jar替换为hadoop-core-1.2.1-forwinlocal.jar。如不替换,运行时会报文件权限的错误。

启动Eclipse,打开Map/Reduce视图。window-Preferences-Hadoop Map/Reduce下选择hadoop-1.2.1-bin.tar.gz的解压目录

在视图正下方的Map/Reduce Locations页面New Hadoop Location,填入hadoop集群配置文件core-site.xml和mapred-site.xml中指定的Map/Reduce Master和DFS Master的IP地址和端口号。其余选项默认即可

在左侧的Project Explorer中即可看到DFS Location中有了我们刚才新增的hdfs。可以新建文件夹删除文件看是否已经可用。

然后New一个Project,选择Map/Reduce Project,这里我们以WordCount为例,代码如下:

import java.io.IOException;
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.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {

public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable> {

private final static IntWritable one = new IntWritable(1);
private Text word = new Text();

public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}

public static class IntSumReducer
extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();

public void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}

public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = new Job(conf, "word count");

job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
String input = "hdfs://XXX:9000/data/input";    //hdfs完整输入路径
String output = "hdfs://XXX:9000/data/output";  //hdfs完整输出路径,必须是不存在的
FileInputFormat.addInputPath(job, new Path(input));
FileOutputFormat.setOutputPath(job, new Path(output));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}


在代码区域右键,Run as-run on hadoop,即可看到wordcount正确运行。之后再将MR打包发布到集群上作业。

至此,结束。

hadoop集群模式运行

和上一部分配置步骤完全一致,有几点区别,如下:

上一部分第二步中解压完hadoop-1.2.1-bin.tar.gz,可不替换hadoop-core-1.2.1.jar。集群模式运行不存在上述的文件权限问题。

WordCount程序的main方法中需要多加两行代码,在
Configuration conf = new Configuration();
语句后添加

conf.set("mapred.job.tracker", "ip地址:端口号"); //MR master的ip地址和端口号
conf.set("mapred.jar", "XXXXX");    //wordcount程序打包成jar的本地路径,如"E:/XXX/xxx/wordcount.jar"


如何才能打包wordcount成jar包?右击项目名,export-jar file-选择需要打包的文件(.classpath和.project可不打包),选择需要导出的jar包路径即可。

以上是所有内容。

完全Local化模式

这是写本文档时想起的。第一部分我们说的是如何利用Local模式调试MR程序,但是仍然依赖于现有的Hadoop集群的HDFS环境。其实这是完全没必要的。调试环境可以直接在windows本地进行。wordcount的main方法中指定input和output的路径可以改写为:

String input = "E:/XXX/data/input"; //本地路径即可
String output = "E:/XXX/data/output";


这样整个MR程序的调试都完全脱离了hadoop的集群,完全在windows本地运行。即可以省略第一部分是步骤四。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: