起因:
在搭建过程中,出现Myeclipse和HDFS无法连接的问题,因为,网络上的博客都说单击finish按钮,关闭窗口,如果左侧的project explore DFS Locations下会展现hdfs集群中的文件表示连接成功。现实相当骨干残忍,我倒腾了好几遍,project explore下都没有出现DFS Locations。
有问题百度啊!百度后,发现网络上只要带myeclipse+hadoop插件关键词的文章,对我的问题都不适用。google了stackoverflow,也看得迷迷糊糊,说什么是因为全局代理balbalbla之类的问题。出不来DFS Locations就得尝试啊,我在centos里把百度和google到的解法都一一实现了一遍,然而,,,然而并没有什么进展。ps(哪位大神可以教教我怎么看apache的hadoop2.2.0的官方文档)
解决:
现实很浪漫跟我开了个玩笑,只需在myeclipse点击 ,windows->open perspective->other->map/reduce(蓝色大象图标)。DFS Locations就出现了,并且在其中出现了hdfs集群中的文件。激动~ ~原来我的各种配置都没有问题,调不出DFS Locations是因为对Myeclipse不熟悉。
啰嗦了一大堆,下面上干货,搭建基于Myeclipse的hadoop开发环境。
1.在windows下安装对应的java jdk。32位的安装32位的jdk,64位的安装64位的jdk。具体怎么安装java jdk,请移步百度,1.)搜索安装java jdk。这里需要注意2.)环境变量的设置,具体可以在安装完,jdk后百度java环境变量的设置。jdk安装和环境变量设置完成后,win+r 然后cmd回车,在控制台输入java -version。jdk如果ok,会出现下图结果。
2.安装myeclipse。点我下载Myeclipse
1).下载hadoop插件:hadoop-eclipse-plugin-2.2.0 (自行百度下载)。插件放在MyEclipse 10\dropins目录下
2).关闭,并重新启动Myeclipse。配置Hadoop installation directory。
选择windows下的hadoop安装目录,即在w10上解压hadoop2.2.0的路径。(下载hadoop2.2.0点我)
3).点击show view -> other… ,在mapreduce tools下选择Map/ReduceLocations,在myeclipse右下侧,点击蓝色大象。添加一个新的HadoopLocation,并配置。
locationname:随意写
Map/Reduce Master
host:sunchen2
port:50070
DFS Master
Use M/R Master host:(打勾,因为我们是单机模式)
User name:Administrator(因为我的w10默认的用户是 Administrator)
Port:9000
Ps:这里的Host和Port在Centos中搭建Hadoop环境时已经设置了。在core-site.xml和mapred-site.xml中查看。
然后,再点击Advanced parameters,(1).查找hadoop.tmp.dir,修改成在hadoop环境搭建时设置的地址,这个参数在core-site.xml中已经设置过了。(2).查找dfs.replication,myeclipse里面默认设置是3,而我们在配置时设置的是1,所以把3改成1。(3).点击finish。(4).windows->open perspective->other->map/reduce(蓝色大象图标)。DFS Locations就出现了,并且在其中出现了hdfs集群中的文件。
至此w10下hadoop开发环境搭建完成。
跑一下hadoop自带的wordcount案例,步骤自行百度。(环境搭好了,跑起来很容易的,copy wordcount源码,past就可以搞定的。)
这里注意下,输出文件路径,和输入路径文件,还有在src下添加一个log4j.properties日志文件,否则控制台会报错(点我下载)。如果重复运行wordcount,请先把输出文件删除,再运行,否则会报错,日志文件如下。
`// 输入文件路径
FileInputFormat.addInputPath(job, new Path(
“hdfs://sunchen2:9000/sunchen2/sunchen2.txt”));
// 输出文件路径
FileOutputFormat.setOutputPath(job, new Path(
“hdfs://sunchen2:9000/sunchen2/wordcount-out”));
2017-02-21 11:50:24,395 INFO [org.apache.hadoop.conf.Configuration.deprecation] - session.id is deprecated. Instead, use dfs.metrics.session-id
2017-02-21 11:50:24,398 INFO [org.apache.hadoop.metrics.jvm.JvmMetrics] - Initializing JVM Metrics with processName=JobTracker, sessionId=
2017-02-21 11:50:24,575 ERROR [org.apache.hadoop.security.UserGroupInformation] - PriviledgedActionException as:hadoop (auth:SIMPLE) cause:org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://sunchen2:9000/sunchen2/wordcount-out already exists
Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://sunchen2:9000/sunchen2/wordcount-out already exists
at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:146)
at org.apache.hadoop.mapreduce.JobSubmitter.checkSpecs(JobSubmitter.java:456)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:342)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1268)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1265)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:1265)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1286)
at com.hadoop.test.WordCount.main(WordCount.java:72)
刚才编辑的都没了,,,web编辑器总是这么不靠谱吗?
懒癌,再爬上来,把跑wordcount的实例步骤写写,顺道思考人生。
1.打开Myeclipse,File -> New -> Other -> MapReduce project。
名字随便起,我这里写的name是1.
然后点finish
2.在1这个工程下,右键new -> class,创建一个WordCount类WordCount。
然后把如下的apache的wordcount源代码拷贝到我新建的这个WordCount类中。
ps。此处注意,输出输入路径,都要写你的hdfs里的路径,而不是copy我的。
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.input.NLineInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
* 第一个MapReduce程序
*
* @author sunchen
*
*/
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 = Job.getInstance(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);
job.setInputFormatClass(NLineInputFormat.class);
// 输入文件路径
FileInputFormat.addInputPath(job, new Path(
"hdfs://sunchen2:9000/sunchen2/sunchen3.txt"));
// 输出文件路径
FileOutputFormat.setOutputPath(job, new Path(
"hdfs://sunchen2:9000/sunchen2/wordcount-out43"));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
3.run一下,发现报错了。好尴尬。
看了下console,原来是缺少一个叫log4j的东西。
解决办法:下载一个log4j放到src的根目录下。(点我下载log4j)
添加log4j后,把hdfs里的wordcount-out43这个输出文件删掉。再run一下。发现WordCount成功的跑起来了。