Eclipse编译运行MapReduce程序 Hadoop

来源:互联网 发布:乐天72纯黑巧克力 知乎 编辑:程序博客网 时间:2024/04/30 03:14

方法行,但代码如是2.0请修改

准备工作

安装好 Eclipse,可在 Ubuntu 软件中心直接搜索安装。

在左侧任务栏,点击“Ubuntu软件中心”。

Ubuntu软件中心Ubuntu软件中心

在右上角搜索栏中搜索 eclipse,在搜索结果中单击 eclipse,并点击安装。

安装Eclipse安装Eclipse

如此,就完成了 eclipse 的安装。Eclipse 的默认安装目录为:/usr/lib/eclipse。

安装 Hadoop-Eclipse-Plugin

下载 hadoop2x-eclipse-plugin ,将 release 中的 hadoop-eclipse-kepler-plugin-2.2.0.jar (虽然标注的是 2.2.0,但在 2.6.0 下是没问题的,应该在 2.x 版本下都可以)复制到 Eclipse 安装目录的 plugin 文件夹中,运行 eclipse -clean 重启 Eclipse 即可。

  1. cd ~/下载/
  2. unzip ./hadoop2x-eclipse-plugin-master.zip
  3. cd /usr/lib/eclipse
  4. sudo cp ~/下载/hadoop2x-eclipse-plugin-master/release/hadoop-eclipse-kepler-plugin-2.2.0.jar ./plugins/
  5. ./eclipse -clean

配置 Hadoop-Eclipse-Plugin

启动 Eclipse 后就可以在左侧的Project Explorer中看到 DFS Locations(若看到的是 welcome 界面,点击左上角的 x 关闭就可以看到了)。

安装好Hadoop-Eclipse-Plugin插件后的效果安装好Hadoop-Eclipse-Plugin插件后的效果

插件需要进一步的配置。

第一步:选择 Window 菜单下的 Preference。

打开Preference打开Preference

此时会弹出一个窗体,窗体的左侧会多出 Hadoop Map/Reduce 选项,点击此选项,选择 Hadoop 的安装目录(如/usr/local/hadoop,Ubuntu不好选择目录,直接输入就行)。

选择 Hadoop 的安装目录选择 Hadoop 的安装目录

第二步:切换 Map/Reduce 工作目录,选择 Window 菜单下选择 Open Perspective -> Other,弹出一个窗体,从中选择 Map/Reduce 选项即可进行切换。

切换 Map/Reduce 工作目录切换 Map/Reduce 工作目录

第三步:建立与 Hadoop 集群的连接,点击 Eclipse软件右下角的 Map/Reduce Locations 面板,在面板中单击右键,选择 New Hadoop Location。

建立与 Hadoop 集群的连接建立与 Hadoop 集群的连接

在弹出来的 General 选项面板中进行 Master 的设置,设置要要 Hadoop 的配置一致,如我使用的Hadoop伪分布式配置,设置了 fs.defaultFS 为 hdfs://localhost:9000,则 DFS Master 那的 Post 也应改为 9000。

Location Name 随意填写,Map/Reduce Master 的 Host 就填写你本机的IP(localhost 也行),Port 默认就是 50020。最后的设置如下:

Hadoop Location 的设置Hadoop Location 的设置

接着再切换到 Advanced parameters 选项面板,这边有详细的配置,切记需要与 Hadoop 的配置(/usr/local/hadoop/etc/hadoop中的配置文件)一致,如我配置了 hadoop.tmp.dir ,就要进行修改。

Hadoop Location 的设置Hadoop Location 的设置

最后点击 finish,Map/Reduce Location 就创建好了。

这样配置就完成了。

在 Eclipse 中查看HDFS中的文件内容

配置成功后,点击左侧 Project Explorer中的 MapReduce Location 就能直接查看 HDFS 中的文件内容了(如下图是 WordCount 的输出结果),而无需再通过繁琐的 hdfs dfs -ls 命令。如果无法查看,可尝试重启Eclipse!

使用Eclipse查看HDFS中的文件内容使用Eclipse查看HDFS中的文件内容

Tips

HDFS 中的内容变动后,Eclipse 不会同步刷新,需要右键点击 Project Explorer中的 MapReduce Location,选择 Refresh,才能看到变动后的文件。

在Eclipse中创建MapReduce项目

点击 File 菜单,选择 New -> Project…:

创建Project创建Project

选择 Map/Reduce Project,点击 Next。

创建MapReduce项目创建MapReduce项目

填写 Project name 为 WordCount 即可,点击 Finish 就创建好了项目。

填写项目名填写项目名

此时在左侧的 Project Explorer 就能看到刚才建立的项目了。

项目创建完成项目创建完成

接着右键点击刚创建的 WordCount 项目,选择 New -> Class

新建Class新建Class

需要填写两个地方:在 Package 处填写 org.apache.hadoop.examples;在 Name 处填写 WordCount。

填写Class信息填写Class信息

创建 Class 完成后,在 Project 的 src 中就能看到 WordCount.java 这个文件。将如下 WordCount 的代码复制到该文件中。

  1. package org.apache.hadoop.examples;
  2. import java.io.IOException;
  3. import java.util.StringTokenizer;
  4. import org.apache.hadoop.conf.Configuration;
  5. import org.apache.hadoop.fs.Path;
  6. import org.apache.hadoop.io.IntWritable;
  7. import org.apache.hadoop.io.Text;
  8. import org.apache.hadoop.mapreduce.Job;
  9. import org.apache.hadoop.mapreduce.Mapper;
  10. import org.apache.hadoop.mapreduce.Reducer;
  11. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  12. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  13. import org.apache.hadoop.util.GenericOptionsParser;
  14. public class WordCount {
  15. public static class TokenizerMapper
  16. extends Mapper<Object, Text, Text, IntWritable>{
  17. private final static IntWritable one = new IntWritable(1);
  18. private Text word = new Text();
  19. public void map(Object key, Text value, Context context
  20. ) throws IOException, InterruptedException {
  21. StringTokenizer itr = new StringTokenizer(value.toString());
  22. while (itr.hasMoreTokens()) {
  23. word.set(itr.nextToken());
  24. context.write(word, one);
  25. }
  26. }
  27. }
  28. public static class IntSumReducer
  29. extends Reducer<Text,IntWritable,Text,IntWritable> {
  30. private IntWritable result = new IntWritable();
  31. public void reduce(Text key, Iterable<IntWritable> values,
  32. Context context
  33. ) throws IOException, InterruptedException {
  34. int sum = 0;
  35. for (IntWritable val : values) {
  36. sum += val.get();
  37. }
  38. result.set(sum);
  39. context.write(key, result);
  40. }
  41. }
  42. public static void main(String[] args) throws Exception {
  43. Configuration conf = new Configuration();
  44. String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
  45. if (otherArgs.length != 2) {
  46. System.err.println("Usage: wordcount <in> <out>");
  47. System.exit(2);
  48. }
  49. Job job = new Job(conf, "word count");
  50. job.setJarByClass(WordCount.class);
  51. job.setMapperClass(TokenizerMapper.class);
  52. job.setCombinerClass(IntSumReducer.class);
  53. job.setReducerClass(IntSumReducer.class);
  54. job.setOutputKeyClass(Text.class);
  55. job.setOutputValueClass(IntWritable.class);
  56. FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
  57. FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
  58. System.exit(job.waitForCompletion(true) ? 0 : 1);
  59. }
  60. }

通过Eclipse运行MapReduce

在运行 MapReduce 程序前,还需要执行一项操作:将 /usr/local/hadoop/etc/hadoop 中将有修改过的配置文件(如伪分布式需要 core-site.xml 和 hdfs-site.xml),以及 log4j.properties 复制到 WordCount 项目下的 src 文件夹(~/workspace/WordCount/src)中。否则程序将无法正确运行,文章最后解释了为什么需要复制这些文件。

复制完成后,右键点击 WordCount 进行刷新,可以看到文件结构如下所示:

WordCount项目文件结构WordCount项目文件结构

点击工具栏中的 Run 图标,或者右键点击 Project Explorer 中的 WordCount.java,选择 Run As -> Run on Hadoop,就可以运行 MapReduce 程序了。不过由于没有指定参数,运行时会提示 “Usage: wordcount “,需要通过Eclipse设定一下运行参数。

右键点击刚创建的 WordCount.java,选择 Run As -> Run Configurations,在此处可以设置运行时的相关参数。切换到 “Arguments” 栏,在 Program arguments 处填写 “input output” 就可以了。

设置程序运行参数设置程序运行参数

或者也可以直接在代码中设置好输入参数。可将代码 main() 函数的 String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); 改为:

  1. // String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
  2. String[] otherArgs=new String[]{"input","output"}; /* 直接设置输入参数 */

设定参数后,再次运行程序,可以看到运行成功的提示,刷新 DFS Location 后也能看到输出的 output 文件夹。

WordCount 运行结果WordCount 运行结果

至此,你就可以使用 Eclipse 方便的进行 MapReduce程序的开发了。

在 Eclipse 中运行 MapReduce 项目会遇到的问题

虽然配置了 Hadoop-Eclipse-Plugin,但一些设置项似乎没有正确配置,如果没有复制 core-site.xml 和 hdfs-site.xml ,程序将无法运行,会提示 Input 路径不存在(实际读取的是当前目录而非 HDFS 目录)。

Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: file:/home/hadoop/workspace/WordCountProject/input

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.

虽然不影响程序的正确运行的,但程序运行时无法看到任何提示消息(只能看到出错信息)。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 京东退货后发票怎么办 京东金融被盗刷怎么办 京东e卡丢了怎么办 京东e卡没有密码怎么办 同一个订单微信付款两次怎么办 京东购物卡掉了怎么办 京东购物卡丢了怎么办 京东快递丢了怎么办 京东e卡支付多了怎么办 京东帐号忘了怎么办 京东白条风控怎么办 我有个破袄…没有衣服怎么办办 轩辕传奇手游灵宠融合错了怎么办 各尧学生不能用怎么办? 山东一卡通商务卡丢了怎么办 和信通过期了怎么办 和信通过期怎么办延期 和信通过期余额怎么办 超市储蓄卡丢了怎么办 提现提到注销卡怎么办 美通卡过期2年了怎么办 物美美通卡丢失怎么办 网上购物电话留错了怎么办 微信斗牛一直输怎么办 微信斗牛输了钱怎么办 微信举报诈骗不成功该怎么办 沙河拿服装太贵怎么办 包上的暗扣掉了怎么办 银手镯暗扣松老是掉怎么办 包包纽扣锁坏了怎么办 包的纽扣坏了怎么办 包上的纽扣坏了怎么办 洗衣服不小心用了色渍净怎么办 洗衣服不小心沾了卫生纸怎么办 麻料裤子扎皮肤怎么办 衣服没洗干净有点发光怎么办 桑蚕丝衣服脏了发光洗不掉怎么办 厨师衣服的油味怎么办 看上夜场的小姐了怎么办 楼卖完了水吧员怎么办 窗帘短了20公分怎么办