使用Eclipse编译运行MapReduce程序 Hadoop2.6.0_Ubuntu/CentOS
来源:http://www.powerxing.com/hadoop-build-project-using-eclipse/
使用Eclipse编译运行MapReduce程序 Hadoop2.6.0_Ubuntu/CentOS
本教程介绍的是如何在 Ubuntu/CentOS 中使用 Eclipse 来开发 MapReduce 程序,在 Hadoop 2.6.0 下验证通过。虽然我们可以使用命令行编译打包运行自己的MapReduce程序,但毕竟编写代码不方便。使用 Eclipse,我们可以直接对 HDFS 中的文件进行操作,可以直接运行代码,省去许多繁琐的命令。本教程由厦门大学数据库实验室出品,转载请注明。
环境
本教程在 Hadoop 2.6.0 下验证通过,适用于 Ubuntu/CentOS 系统,理论上可用于任何原生 Hadoop 2 版本,如 Hadoop 2.4.1,Hadoop 2.7.1。
本教程主要测试环境:
- Ubuntu 14.04
- Hadoop 2.6.0(伪分布式)
- Eclipse 3.8
此外,本教材在 CentOS 6.4 系统中也验证通过,对 Ubuntu 与 CentOS 的不同配置之处有作出了注明。
安装 Eclipse
在 Ubuntu 和 CentOS 中安装 Eclipse 的方式有所不同,但之后的配置和使用是一样的。
在 Ubuntu 中安装 Eclipse,可从 Ubuntu 的软件中心直接搜索安装,在桌面左侧任务栏,点击“Ubuntu软件中心”。
Ubuntu软件中心
在右上角搜索栏中搜索 eclipse,在搜索结果中单击 eclipse,并点击安装。
安装Eclipse
等待安装完成即可,Eclipse 的默认安装目录为:/usr/lib/eclipse。
在 CentOS 中安装 Eclipse,需要下载安装程序,我们选择 Eclipse IDE for Java Developers 版:
- 32位: http://eclipse.bluemix.net/packages/mars.1/?JAVA-LINUX32
- 64位: http://eclipse.bluemix.net/packages/mars.1/?JAVA-LINUX64
下载后执行如下命令,将 Eclipse 安装至 /usr/lib 目录中:
- sudo tar -zxf ~/下载/eclipse-java-mars-1-linux-gtk*.tar.gz -C /usr/lib
解压后即可使用。在 CentOS 中可以为程序创建桌面快捷方式,如下图所示,点击桌面右键,选择创建启动器,填写名称和程序位置(/usr/lib/eclipse/eclipse):
安装Eclipse
安装 Hadoop-Eclipse-Plugin
要在 Eclipse 上编译和运行 MapReduce 程序,需要安装 hadoop-eclipse-plugin,可下载 Github 上的 hadoop2x-eclipse-plugin(备用下载地址:http://pan.baidu.com/s/1i4ikIoP)。
下载后,将 release 中的 hadoop-eclipse-kepler-plugin-2.6.0.jar (还提供了 2.2.0 和 2.4.1 版本)复制到 Eclipse 安装目录的 plugins 文件夹中,运行 eclipse -clean
重启 Eclipse 即可(添加插件后只需要运行一次该命令,以后按照正常方式启动就行了)。
- unzip -qo ~/下载/hadoop2x-eclipse-plugin-master.zip -d ~/下载 # 解压到 ~/下载 中
- sudo cp ~/下载/hadoop2x-eclipse-plugin-master/release/hadoop-eclipse-plugin-2.6.0.jar /usr/lib/eclipse/plugins/ # 复制到 eclipse 安装目录的 plugins 目录下
- /usr/lib/eclipse/eclipse -clean # 添加插件后需要用这种方式使插件生效
配置 Hadoop-Eclipse-Plugin
在继续配置前请确保已经开启了 Hadoop。
启动 Eclipse 后就可以在左侧的Project Explorer中看到 DFS Locations(若看到的是 welcome 界面,点击左上角的 x 关闭就可以看到了。CentOS 需要切换 Perspective 后才能看到,即接下来配置步骤的第二步)。
安装好Hadoop-Eclipse-Plugin插件后的效果
插件需要进一步的配置。
第一步:选择 Window 菜单下的 Preference。
打开Preference
此时会弹出一个窗体,窗体的左侧会多出 Hadoop Map/Reduce 选项,点击此选项,选择 Hadoop 的安装目录(如/usr/local/hadoop,Ubuntu不好选择目录,直接输入就行)。
选择 Hadoop 的安装目录
第二步:切换 Map/Reduce 开发视图,选择 Window 菜单下选择 Open Perspective -> Other(CentOS 是 Window -> Perspective -> Open Perspective -> Other),弹出一个窗体,从中选择 Map/Reduce 选项即可进行切换。
切换 Map/Reduce 开发视图
第三步:建立与 Hadoop 集群的连接,点击 Eclipse软件右下角的 Map/Reduce Locations 面板,在面板中单击右键,选择 New Hadoop Location。
建立与 Hadoop 集群的连接
在弹出来的 General 选项面板中,General 的设置要与 Hadoop 的配置一致。一般两个 Host 值是一样的,如果是伪分布式,填写 localhost 即可,另外我使用的Hadoop伪分布式配置,设置 fs.defaultFS 为 hdfs://localhost:9000,则 DFS Master 的 Port 要改为 9000。Map/Reduce(V2) Master 的 Port 用默认的即可,Location Name 随意填写。
最后的设置如下图所示:
Hadoop Location 的设置
Advanced parameters 选项面板是对 Hadoop 参数进行配置,实际上就是填写 Hadoop 的配置项(/usr/local/hadoop/etc/hadoop中的配置文件),如我配置了 hadoop.tmp.dir ,就要进行相应的修改。但修改起来会比较繁琐,我们可以通过复制配置文件的方式解决(下面会说到)。
总之,我们只要配置 General 就行了,点击 finish,Map/Reduce Location 就创建好了。
在 Eclipse 中操作 HDFS 中的文件
配置好后,点击左侧 Project Explorer 中的 MapReduce Location (点击三角形展开)就能直接查看 HDFS 中的文件列表了(HDFS 中要有文件,如下图是 WordCount 的输出结果),双击可以查看内容,右键点击可以上传、下载、删除 HDFS 中的文件,无需再通过繁琐的 hdfs dfs -ls
等命令进行操作了。
使用Eclipse查看HDFS中的文件内容
如果无法查看,可右键点击 Location 尝试 Reconnect 或重启 Eclipse。
HDFS 中的内容变动后,Eclipse 不会同步刷新,需要右键点击 Project Explorer中的 MapReduce Location,选择 Refresh,才能看到变动后的文件。
在 Eclipse 中创建 MapReduce 项目
点击 File 菜单,选择 New -> Project…:
创建Project
选择 Map/Reduce Project,点击 Next。
创建MapReduce项目
填写 Project name 为 WordCount 即可,点击 Finish 就创建好了项目。
填写项目名
此时在左侧的 Project Explorer 就能看到刚才建立的项目了。
项目创建完成
接着右键点击刚创建的 WordCount 项目,选择 New -> Class
新建Class
需要填写两个地方:在 Package 处填写 org.apache.hadoop.examples;在 Name 处填写 WordCount。
填写Class信息
创建 Class 完成后,在 Project 的 src 中就能看到 WordCount.java 这个文件。将如下 WordCount 的代码复制到该文件中。
package org.apache.hadoop.examples;
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);
}
}
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);
}
}
Java
通过 Eclipse 运行 MapReduce
在运行 MapReduce 程序前,还需要执行一项重要操作(也就是上面提到的通过复制配置文件解决参数设置问题):将 /usr/local/hadoop/etc/hadoop 中将有修改过的配置文件(如伪分布式需要 core-site.xml 和 hdfs-site.xml),以及 log4j.properties 复制到 WordCount 项目下的 src 文件夹(~/workspace/WordCount/src)中:
cp /usr/local/hadoop/etc/hadoop/core-site.xml ~/workspace/WordCount/src
cp /usr/local/hadoop/etc/hadoop/hdfs-site.xml ~/workspace/WordCount/src
cp /usr/local/hadoop/etc/hadoop/log4j.properties ~/workspace/WordCount/src
Shell 命令
没有复制这些文件的话程序将无法正确运行,本教程最后再解释为什么需要复制这些文件。
复制完成后,务必右键点击 WordCount 选择 refresh 进行刷新(不会自动刷新,需要手动刷新),可以看到文件结构如下所示:
WordCount项目文件结构
点击工具栏中的 Run 图标,或者右键点击 Project Explorer 中的 WordCount.java,选择 Run As -> Run on Hadoop,就可以运行 MapReduce 程序了。不过由于没有指定参数,运行时会提示 “Usage: wordcount “,需要通过Eclipse设定一下运行参数。
右键点击刚创建的 WordCount.java,选择 Run As -> Run Configurations,在此处可以设置运行时的相关参数(如果 Java Application 下面没有 WordCount,那么需要先双击 Java Application)。切换到 “Arguments” 栏,在 Program arguments 处填写 “input output” 就可以了。
设置程序运行参数
或者也可以直接在代码中设置好输入参数。可将代码 main() 函数的
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); 改为:
// String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
String[] otherArgs=new String[]{"input","output"}; /* 直接设置输入参数 */
Java
设定参数后,再次运行程序,可以看到运行成功的提示,刷新 DFS Location 后也能看到输出的 output 文件夹。
WordCount 运行结果
至此,你就可以使用 Eclipse 方便的进行 MapReduce程序的开发了。
在 Eclipse 中运行 MapReduce 程序会遇到的问题
在使用 Eclipse 运行 MapReduce 程序时,会读取 Hadoop-Eclipse-Plugin 的 Advanced parameters 作为 Hadoop 运行参数,如果我们未进行修改,则默认的参数其实就是单机(非分布式)参数,因此程序运行时是读取本地目录而不是 HDFS 目录,就会提示 Input 路径不存在。
Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: file:/home/hadoop/workspace/WordCountProject/input
所以我们要么修改插件参数,要么将配置文件复制到项目中的 src 目录来覆盖参数,才能让程序能够正确运行。
此外,log4j 用于记录程序的输出日记,需要 log4j.properties 这个配置文件,如果没有复制该文件到项目中,运行程序后在 Console 面板中会出现警告提示:
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
虽然不影响程序的正确运行的,但程序运行时无法看到任何提示消息(只能看到出错信息)。
参考资料
- http://www.cnblogs.com/xia520pi/archive/2012/05/20/2510723.html
- http://www.blogjava.net/LittleRain/archive/2006/12/31/91165.html
使用Eclipse编译运行MapReduce程序 Hadoop2.6.0_Ubuntu/CentOS相关推荐
- 使用Eclipse编译运行MapReduce程序 Hadoop2.6.0/Ubuntu
上篇介绍了使用命令行编译打包运行自己的MapReduce程序,使用 Eclipse 更加方便.要在 Eclipse 上编译和运行 MapReduce 程序,需要安装 hadoop-eclipse-pl ...
- Hadoop+eclipse运行MapReduce程序
前面,我们已经通过eclipse下安装Hadoop的插件配置好了基于Hadoop+eclipse的MapReduce开发环境.现在,我们在这个Hadoop+eclipse环境下运行MapReduce程 ...
- 关于导入geoserver 源码到Eclipse编译运行
参考http://blog.csdn.net/gisshixisheng/article/details/43016443 和 http://blog.sina.com.cn/s/blog_6e37 ...
- vmware虚拟机上的centos安装Hadoop,以及在本地eclipse上运行mapReduce项目,并将文件输出到HDFS中...
注意centos主机名不支持下划线,所以文章中若出现centos_02.com,请替换为 centos02.com vmware虚拟机上的centos安装Hadoop 安装vmware虚拟机 虚拟机上 ...
- 使用sublime编译运行C程序
原 使用sublime编译运行C程序 2017年04月13日 17:09:16 DragonFreedom 阅读数 13177 1.打开sublime,找到顶部工具(Tool)菜单->编译系统( ...
- Eclipse编译运行Native代码步骤详解
Eclipse编译运行Native代码步骤详解 标签: android jni层 android jni步骤 android jni接口 转自: http://blog.csdn.net/ ...
- 在Ubuntu虚拟机中编译运行C程序
一.准备工具 1.gcc GCC是GNU公社的一个项目.是一个用于编程开发的自由编译器.最初,GCC只是一个C语言编译器,它是GNU C Compiler 的英文缩写.随着众多自由开发者的加入和GCC ...
- mac怎么装java eclipse_如何在Mac系统安装eclipse并运行java程序
展开全部 Mac系统安装eclipse并运行java程序具体操作步骤如下:安装Eclipse前先确认你的Mac上是否已安装java运行环e69da5e6ba9062616964757a68696461 ...
- linux系统运行MapReduce程序报错:exitCode 127
linux系统运行MapReduce程序报错:exitCode 127 hadoop mapreduce 出现 /bin/bash: /bin/java: No such file or direct ...
- linux平台编译运行c++程序
linux平台编译运行c++程序 引言 嵌入式开发的火热引发了不少程序员对Linux的兴趣.那么如何在Linux平台编译并运行c++程序呢? 正文 Linux平台开发运行C++程序大体流程与Windo ...
最新文章
- “机器人迟钝一点,会更有人情味”,迪士尼提出新型人机交互系统
- C# WinForm控件、自定义控件整理(大全)
- vuecli项目文件命名_vue.js学习笔记(一)——vue-cli项目的目录结构
- grub rescue 安装linux,Ubuntu重装启动失败进入修复grub rescue模式
- ArcGIS Engine中的8种数据访问【转】
- spark中local模式与cluster模式使用场景_Spark-Submit 和 K8S Operation For Spark
- Python中简化的验证码功能实现
- C#中将list使用ProtoBuf进行序列化并使用SharpZipLib进行压缩
- php怎么设置网站的字符编码,php如何设置字符编码
- sql server 迁移 mysql_sql server 迁移到 mysql
- csv文件怎么转成excel_Python操作Excel文件(1):花式大师pyexcel
- 修改驱动器重定向显示格式
- 修改java的jre_applet访问本地资源,需要修改jre的java.policy
- 领扣(LeetCode)最长和谐子序列 个人题解
- H5打开APP技术总结
- react插槽Protal
- 嵌入式linux IIO驱动
- TiDB at 丰巢:尝鲜分布式数据库
- 局域网内通过ip获取主机名
- APQP(advanced product quality planning先期产品质量策划)
热门文章
- Android以太网架构源码
- 学习天才犹太人的经商法则
- python制作APP,此APP可识别TEM图片结构轮廓,并将坐标提取到excel中,画出TEM结构轮廓图(tkinter,opencv-python)
- 基于医疗知识图谱的项目构建学习总结(一)—项目构建环境搭建及爬取数据部分
- python translate 中文_Python translate()方法
- 灌区农业水价综合改革解决方案
- IT的道德和伦理-个人隐私
- 反激电源电路电磁干扰抑制措施
- signature=946b61359fb7b919b57e636da83bf538,X-ray tube.
- POJ-3580-SuperMemo(splay的各种操作)