版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/oSayMissyou0/article/details/51981728
注:本文为自用,随时更新。
一.系统环境
Windows7、Ecplise 4.4.0,Hadoop2.7.2
二.安装步骤
1.安装hadoop插件
2.启动myeclipse,打开Perspective:
【Window】->【Open Perspective】->【Other...】->【Map/Reduce】->【OK】
3、
打开一个View:
【Window】->【Show View】->【Other...】->【MapReduce Tools】->【Map/Reduce Locations】->【OK】
4.添加Hadoop Location:
点击New Hadoop location
修改其中的内容:
我的hadoop安装在虚拟机上,地址为192.168.48.129
修改其中内容:
Map/Reduce Master 这个框里
Host:就是jobtracker 所在的集群机器,这里写192.168.48.129
Hort:就是jobtracker 的port,这里写的是9001
Map/Reduce Master 这个框里:这两个参数就是mapred-site.xml里面mapred.job.tracker里面的ip和port
DFS Master 这个框里
Host:就是namenode所在的集群机器,这里写192.168.48.129
Port:就是namenode的port,这里写9000
DFS Master 这个框里:这两个参数就是core-site.xml里面fs.defaultFS(或fs.default.name)里面的ip和port
user name:这个是连接hadoop的用户名
因为我是用hadoop用户安装的hadoop,而且没建立其他的用户,所以用hadoop。下面的不用填写。然后点击finish按钮,此时,这个视图中就有多了一条记录。
重启eclipse并重新编辑刚才建立的那个连接记录,现在我们编辑advance parameters tab页
(重启编辑advance parameters tab页原因:在新建连接的时候,这个advance paramters tab页面的一些属性会显示不出来,显示不出来也就没法设置,所以必须重启一下eclipse再进来编辑才能看到)
这里大部分的属性都已经自动填写上了,其实就是把core-site.xml,hdfs-site.xml,mapred-site.xml里面的一些配置属性展示出来。因为在安装hadoop的时候,其site系列配置文件里有改动,所以这里也要弄成一样的设置。主要关注的有以下属性:
fs.defualt.name(fs.defaultFS):这个在General tab页已经设置了
mapred.job.tracker:这个在General tab页也设置了
dfs.replication:这个这里默认是3,因为我在hdfs-site.xml里面设置成了1,所以这里也要设置成1
hadoop.tmp.dir:这里填写你在core-site.xml中设置的hadoop.tmp.dir
需要修改的内容如下图
然后点击finish,然后就连接上了(先要启动sshd服务,启动hadoop进程),连接上的标志如图:
注1:我在这里遇到一个小问题,我在ubutun上安装hadoop时,core-site.xml属性fs.defaultFS设置的地址是localhost,由于权限原因,我在windows上用eclipse进行连接hadoop,被hadoop拒绝了连接.如下所示:
出现这种情况只需要把fs.defaultFS属性改为你的ip地址即可,如下所示:
注2:可以在文件上右击,选择删除试下,通常第一次是不成功的,会提示一堆东西,大意是权限不足之类,原因是当前的win7登录用户不是虚拟机里hadoop的运行用户,解决办法有很多,比如你可以在win7上新建一个hadoop的管理员用户,然后切换成hadoop登录win7,再使用eclipse开发,但是这样太烦,最简单的办法:
hdfs-site.xml里添加
1 <property>
2 <name>dfs.permissions</name>
3 <value>false</value>
4 </property>
然后在虚拟机里,运行hadoop dfsadmin -safemode leave
保险起见,再来一个hadoop fs -chmod 777 /
总而言之,就是彻底把hadoop的安全检测关掉(学习阶段不需要这些,正式生产上时,不要这么干),最后重启hadoop,再到eclipse里,重复刚才的删除文件操作试下,应该可以了。
5.跑一个wordcount例子
(1)新建Map/Reduce Project:
【File】->【New】->【Project...】->【Map/Reduce】->【Map/Reduce Project】->【Project name: TestHadoop】->【Configure Hadoop install directory...】->【Hadoop installation directory: D:\hadoop\hadoop-2.7.2\hadoop-2.7.2】->【Apply】->【OK】->【Next】->【Allow output folders for source
folders】->【Finish】
如下图所示:
(2)新建WordCount类,代码是从Hadoop自带的例子中copy过来的,如下
代码:
package com.wimang.test;
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;
import org.apache.hadoop.util.GenericOptionsParser;
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);
}
}
@SuppressWarnings("deprecation")
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);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) 0 : 1);
}
}
(3)造一些模拟数据
为了运行程序,需要一个输入的文件夹和输出的文件夹。输出文件夹,在程序运行完成后会自动生成。我们需要给程序一个输入文件夹。
主要可以用两种方法:
方法一:在eclipse上用鼠标右键即可创建文件夹(首先要把权限解决了,上面有解决的方法),一个输入文件夹input(名字你任意命名),上传一两个带有单词的文件到该文件夹中即可。
(4)配置运行参数
①在新建的项目WordCount,点击WordCount.java,右键-->Run As-->Run Configurations
②在弹出的Run Configurations对话框中,点Java Application,右键-->New,这时会新建一个application名为WordCount
③配置运行参数,点Arguments,在Program arguments中输入“你要传给程序的输入文件夹和你要求程序将计算结果保存的文件夹”,如:
(5)点击run,运行程序。
出现如下图,即为运行成功。
或者在hadoop运行的虚拟机上通过敲击命令查看也可以,可以在终端中用命令如下,查看是否生成文件夹output:
bin/hadoop fs -ls
用下面命令查看生成的文件内容:
bin/hadoop fs -cat output1/*
(6)运行WordCount中出现的问题。
情况1
如下图:
如果双击运行windows安装hadoop目录下的bin文件夹中的winutils.exe出现如下图所示:
出现如上问题,只需要下载安装vc+2013组件即可,下载地址为:http://www.microsoft.com/en-us/download/confirmation.aspxid=40784
情况2
就是没有没有写的权限,这时候可以参考上面按照eclipse hadoop插件时有提到过解决办法。如果是安装我的这个流程走,应该不会出现这个问题。
到此,就可以在windows上进行eclipse远程开发调试ubutun上的Hadoop了。
注:本文为自用,随时更新。