eclipse 中部署 Hadoop 包括两大部分:Hdfs 环境部署和 MapReduce 任务执行环境部署。一般 Hdfs 环境部署比较简单,部署后就可以在 eclipse 中像操作 windows 目录一样操作 Hdfs 文件。而 MapReduce 任务执行环境的部署就比较复杂一点,不同版本对环境的要求度高低不同就导致部署的复杂度大相径庭。例如 Hadoop1 包括以前的版本部署就比较简单,可在 Windows 和 Linux 执行部署运行,而 Hadoop2 及以上版本对环境要求就比较严格,一般只能在 Linux 中部署,如果需要在 windows 中部署需要使用 cygwin 等软件模拟 Linux 环境,该篇介绍在 Linux 环境中部署 Hadoop 环境。该篇假设 hadoop2.5.0-cdh5.3.2 集群已经部署完成,集群访问权限为 hadoop5 用户。这种在 eclipse 上操作 Hdfs 和提交 MapReduce 任务的方式为 Hadoop 客户端操作,故无须在该机器上配置 Hadoop 集群文件,也无须在该机器上启动 hadoop 相关进程。
1. 下载部署 eclipse
下载 eclipse ,笔者所用版本为 eclipse-jee-juno-SR2-linux-gtk-x86_64.tar
下载地址为:链接:http://pan.baidu.com/s/1qWVQbLi 密码:ea08
解压后,将 eclipse 压缩包放置在当前用户的 /home/hadoop5/softwares/tar_packages
路径下,然后解压到 ~/softwares/
的路径下
tar -zxvf eclipse-jee-juno-SR2-linux-gtk-x86_64.tar.gz -C ~/softwares/
解压后的 eclipse 的路径目录如下图所示:
2. 下载插件
插件用的是 hadoop-eclipse-plugin-2.5.1.jar
下载地址:http://download.csdn.net/detail/u011414200/9390800
将自己打包或者下载的 hadoop-eclipse 直接的插件导入 eclipse 的 plugins 目录(复制进去即可),该篇使用直接下载的插件 hadoop-eclipse-plugin-2.5.1.jar,然后启动 eclipse。
./eclipse
打开 eclipse 后,出现进程 org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar
Note: 建议安装第三方插件 FatJar,点击这里查看
1. 切换到 Hadoop 的编程主界面
Window -> Show View -> Other -> Map/Reduce Locations
然后恢复到初始的 MapReduce 的编程界面
Window -> Reset Perspective -> Yes
2. 可见 Hadoop-eclipse 插件已生效
将下载的 hadoop-eclipse-plugin-2.5.1.jar 文件放到 Eclipse 的 plugins 目录下,重启 Eclipse 即可看到该插件已生效,一个是 DFS 显示的位置,一个是 mapreduce 显示的位置,具体如下图所示:
3. 选择 Hadoop 安装目录
在 eclipse 中配置 hadoop 安装目录:
Window—>Preference,选择 Hadoop Map/Reduce
红线圈出的部分为 Hadoop 的安装目录
4. 创建 New hadoop location
在 MapReduce Locations 出处点击右键新建 mapreduce 配置环境,具体图示如下:
5. 配置新建的 New hadoop location
进入 mapreduce 配置环境,具体如下图所示。
6. 查看最终连接效果
上一步骤配置完成后,我们看到的界面如下图所示。左侧栏中即为 hdfs 目录,在每个目录上可点击右键操作
当然,上面的 data 的目录是预先创建好的,而 tmp 和 hbase 是开始历史服务器和 HBase 后自动生成的
eclipse 中直接提交 mapreduce 任务(此处以 wordcount 为例,同时注意 hadoop 集群防火墙需对该机器开放相应端口,关闭防火墙最省事了)
如果我们将 hadoop 自带的 wordcount 在 eclipse 中执行是不可以的,调整后具体操作如下。
新建Map/Reduce工程的特点就是 无须手动导入 hadoop jar 包
1. 创建 Map/Reduce 工程
2. 点击 next 输入 hadoop 工程名即可
3. 新建 Wordcount 类
在新建的 WordCount 类中添加如下代码:
package net.csdn.blog.zephyr.main;
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 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 = Job.getInstance(conf);
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);
}
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);
}
}
}
4. 运行程序
首先上传文件到 HDFS 上,这步骤笔者我就不赘述了,笔者我上传的是 slaves 文件
要么 右击文件夹 -> Refresh ,要么 右击蓝色小象 -> Reconnect ,或者 右击 “DFS Locations” -> Disconnect ,这样才能看到最新的输出结果目录。右击 “蓝色小象”和 “DFS Locations” 的 Refresh 是没有作用的。
1. 新建 java 工程
新建 java 工程的特点就是 需要手动导入 hadoop 相应 jar 包,具体如下图所示:
2. 添加默认的 JRE
新建 java 工程完成后,下面添加 hadoop 相应 jar 包,hadoop2.5.0-cdh5.3.2 相应 jar 包在 ${HADOOP_HOME}/share/hadoop 目录中。
进入 Libraries,点击 Add Library ,点击 JRE System Library 添加 Eclipse 默认的 JRE 环境
3. 添加 hadoop jar 包
新建 hadoop 相应 library 成功后添加 hadoop 相应 jar 包到该 library下面即可。
进入 Libraries,点击 Add Library,点击 User Library 添加 hadoop 相应 jar 包
自定义 library 的名字
笔者我创建了 4 个 Library ,分别取名为 hadoop-common、hadoop-yarn、hadoop-hdfs、hadoop-mapreduce
4. 需要添加的 hadoop 相应 jar 包有
${HADOOP_HOME}/share/hadoop/common下所有jar包,及里面的lib目录下所有jar包
${HADOOP_HOME}/share/hadoop/hdfs下所有jar包,及里面lib下的jar包
${HADOOP_HOME}/share/hadoop/mapreduce下所有jar包,及里面lib下的jar包
${HADOOP_HOME}/share/hadoop/yarn下所有jar包,及里面lib下的jar包
在上述的 4 个自定义的 Library 中添加相应的 jar 包。选中某一个 User Library,然后点击旁边的 “Add External JARs”,然后根据 ${HADOOP_HOME}/share/hadoop 路径下选择与之对应的 jar 包。
5. 运行 Java 工程
步骤和代码和之前是一样的。唯一区别的启动选项,选择的是 Java Application
与 Hadoop 运行方式不同的是,在 Console 控制台上,能看到更加详细的输出信息,这里就不上图了,且运行的方式却是本地运行模式。用线程模拟 map,reduce 的过程。
1. 导出 Jar 包
所要填的就是 Jar 的输出路径以及文件名
2. 运行 Jar 包
可以在相应输出目录下生成 WordCount.jar 的 Jar 包,运行之
hadoop jar WordCount.jar net.csdn.blog.zephyr.main.WordCount /data/wordcount/slaves /output
这里需要填类名,如果是在包下,请确保填写详细的包名,如这里的 net.csdn.blog.zephyr.main,否则会报找不到类的错误。
/data/wordcount 为 HDFS 存放文本的目录,如果指定一个目录为 MapReduce 输入的路径,则 MapReduce 会将该路径下的所有文件作为输入。如果指定一个文件,则 MapReduce 只会将该文件作为输入。/output 为作业输出路径,该路径在作业运行之前必须不存在,否则会报错。
1. File -> Export ->Other -> Fat Jar Exporter
2. 配置各种参数
Note: 注意别选中 Merge individual-sections of all MANIFEST.MF Files,如果选中的话,很有可能在运行有 fat jar 打包的 JAR 文件时控制台出现各种警告,原因:在 MANIFEST.MF
文件中,有多个 SHA1-Digest,导致控制台报错。
在运行有fat jar打包的JAR文件时控制台出现各种警告:
008-12-2 8:55:20 java.util.jar.Attributes read
警告: Duplicate name in Manifest: SHA1-Digest.
Ensure that the manifest does not have duplicate entries, and
that blank lines separate individual sections in both your
manifest and in the META-INF/MANIFEST.MF entry in the jar file.
2008-12-2 8:55:20 java.util.jar.Attributes read
警告: Duplicate name in Manifest: SHA1-Digest.
Ensure that the manifest does not have duplicate entries, and
that blank lines separate individual sections in both your
manifest and in the META-INF/MANIFEST.MF entry in the jar file.
3. 选择要打包的第三方 JAR 文件,这些文件会打包进最终的 readXml_fat.jar
4. 运行新生成的 jar 文件
cd /home/hadoop5/workspace/hadoop_project
hadoop jar hadoop_project_fat.jar /data/wordcount/slaves /output/
注意:此时就不用再写执行的主类了,因为在打包的时候已经设置啦~
FatJar 是一个非常简单的软件打包解决方案,它利用 Java 的定制类装入器,动态地从单一档案文件中装入应用程序所有的类,同时保留支持 JAR 文件的结构。随着 FatJar Eclipse 插件 FJEP 的推出, Eclipse 的用户现在只要在向导中选中一个复选框,就可以创建 One-JAR 应用程序。依赖的库被放进 lib/ 目录,主程序和类被放进 main/main.jar,并自动写好 META-INF/MANIFEST.MF 文件。
1. 下载 FatJar
链接献上:http://download.csdn.net/detail/u011414200/9403413
2. 安装 FatJar
将该插件直接放置在 eclipse目录下的 plugin 目录下即可!然后重启 eclipse 就 OK 了。