我用的系统是ubuntu14.04
新建一个Java Project。

这里用的是gradle打包,gradle默认找src/main/java下的类编译。src目录已经有了,手动在src下创建main/java(也可以配置gradle去找其他路径的下的文件)。
在项目跟录下创建build.gradle文件。

apply plugin: 'java'
apply plugin: 'eclipse' jar {
baseName = 'hadoop'
version = '0.0.1'
} sourceCompatibility = 1.8
targetCompatibility = 1.8 dependencies {
compile fileTree(dir: 'lib', include: ['*.jar'])
}

根目录下创建一个lib文件夹,将hadoop安装目录下share/hadoop下的 common, common/lib, mapreduce, yarn, yarn/lib目录下的jar包拷进项目的lib文件夹里。选中所有的jar包,右键Build Path-->add to build path。
项目基础环境搭好,把源码包中的WordCount测试类中的代码拷进项目里。

package fzk;

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 MR {
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> [<in>...] <out>");
System.exit(2);
}
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(MR.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class); for (int i = 0; i < otherArgs.length - 1; ++i) {
FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
}
FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length - 1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}

一切准备就绪后,想利用hadoop运行mapreduce项目,需要自己手动打包。利用gradle打包,打开一个终端,在build.gradle的目录下,执行

$ gradle build

等命令执行结束后,会发现项目中多出了一个build文件夹,我们打出来的jar包在build/lib目录下。确保jar下确实包含了我们自己编写的类可以用解压软件进入jar看一下(不用解压,只是查看一下)。里面有src目录下的文件就说明已经打包成功了。
我们在build.gradle中配置的打出来的jar包的名字叫hadoop-0.0.1.jar。随自己起什么名都可以。
接下来测试一下,测试需要的是一个已经存在的文件作文输入,名字随便(这里是input),为了方便把input放在和打出来的jar包放在一个目录下,在测试时还需要一个输出的目录(这里是output),指定的目录下不可以存在这个目录。进入到jar包的目录下执行下面命令测试程序

$ hadoop jar hadoop-0.0.1.jar fzk.MR input output

fzk.MR前面的是包名,在代码中已经把包名粘出来了,说明我就是在fzk包下创建的MR类。这个地方指定类的时候前面需要加上包名。input就是手动创建的一个测试文件,output在这个目录下不可以存在,程序运行后会创建出一个output文件夹,结果就在里边。
为了方便我们可以创建一个run.sh这样每次运行的时候就不用输入那么多的命令:

rm -fr output
hadoop jar build/libs/hadoop-0.0..jar fzk.MR input output

每次执行前先把output文件夹删掉,这行这条命令的目录是在项目根目录下,input应该放在根目录下,也会在根目录生成output结果。

到这里,我们就是完整的运行完一个WordCount程序了。但是这样太麻烦,我们已经用eclipse了为什么还需要打包才能运行。我们确实是不需要每次都去打包才可以测试的。如果向直接在eclipse里运行,jar必须确保把需要的全部导入了,如果程序运行时报什么ClassDefNotFound之类的错误就是哪个jar没有导,自己找找导进去就行了。下面看看怎么直接在eclipse运行程序。
这里只需要把main方法修改一下即可,我们这里需要args中的参数,但是ctrl + f11 运行的时候肯定是传不进去参数的,这里你可以在配置run configuration中添加启动参数,至少两个,从第一个到倒数第一个是input,最后一个是output。也可以偷懒一下我们只是测试,只需要在用到args的时候赋值就可以了,在main方法的第一行加上

    args = new String[] {"input", "output/" + System.currentTimeMillis()};

output后面加上当前时间戳的目的是不用每次运行的时候都去手动删掉output目录。

这里只是对于初学的时候方便自己随便怎么修改。接下来就去探索了。

在eclipse中用gradle搭建MapReduce项目的更多相关文章

  1. ubuntu14.04 Hadoop单机开发环境搭建MapReduce项目

    Hadoop官网:http://hadoop.apache.org/ 目前最新的版本是Hadoop 3.0.0-alpha1前提:java 1.6 版本以上 首先从官网下载压缩包(hadoop-3.0 ...

  2. maven -- 学习笔记(四)实现在Eclipse用maven搭建springmvc项目(附构建步骤和详细实现代码)

    Learn from:http://www.cnblogs.com/fangjins/archive/2012/05/06/2485459.html,感谢楼主的分享,才有下面的这篇学习小结 一.环境准 ...

  3. 从0到1用eclipse用maven搭建web项目

    1,默认已经搭建了JDK1.5以上,以及eclipseEE版本,和maven. 2,修改maven的本地仓库和镜像,修改本地仓库是为了方便我们管理,maven的默认仓库是在C盘的USER文件夹下,我一 ...

  4. eclipse中用maven创建web项目

    上一节中完成了本地的maven环境搭建,在eclipse中怎么创建一个maven项目呢 一.eclipse中配置maven环境 eclipse版本4.3 1.打开菜单Help->Eclipse ...

  5. gradle学习系列之eclipse中简单构建android项目

    看不到图片能够去訪问这个网址看看:http://pan.baidu.com/s/1o6FrFkA 一.什么是Gradle 官网www.gradle.org上介绍Gradle是升级版(evolved)的 ...

  6. eclipse 导入gradle引入多模块项目,引入eclipse后变成了好几个工程

    1.eclipse  导入gradle 项目 ,选择项目文件夹. 2.导入完成后,文档结构变成 ,多个子项目并列了,而且互不依赖,没有层级结构了. 3.点击项目目录,右上角这个小箭头,选择projec ...

  7. Eclipse搭建maven项目的流程,聚合所有的子模块项目

    Eclipse搭建maven项目的流程 2018年03月01日 15:47:03 阅读数:22 1:搭建parent工程,用来聚合所有的子模块项目 2:搭建公共使用的模块common 这里你要点击空白 ...

  8. eclipse上的git命令使用浅析,搭建Maven项目

    eclipse上的git命令使用浅析 2016-03-31 14:44   关于eclipse上git的安装和建立代码仓库的文章比较多,但作为一个初识git的人更希望了解每个命令的作用. 当项目连接到 ...

  9. 解决Eclipse导入Gradle项目时在 Building gradle project info 一直卡住

    问题描述 在使用 Eclipse 导入 Gradle 项目时一直卡住,不能导入项目 问题解决   解决办法主要有两种:一是直接下载 gradle 离线包,二是修改项目的 ..\gradle\wrapp ...

随机推荐

  1. 想学习Android开发

    最近被别人说知识面窄,心里受伤了.准备学学Android开发,如果能在手机里运行自己写的app,那是多么high ~~~ Android开发需要看什么资料呢? 说明:本人一直从事windows下的C+ ...

  2. Wireshark工控协议

    Wireshark是一个强大开源流量与协议分析工具,除了传统网络协议解码外,还支持众多主流和标准工控协议的分析与解码. 序号 协议类型 源码下载 简介 1 Siemens S7 https://git ...

  3. 动态SQL字符长度超过8000

    动态SQL字符长度超过8000,我记得SQL SERVER 2008中用SP_EXECUTESQL打破了这个限制. 平常用动态SQL,可能都会用EXEC(),但是有限制,就是8000字符串长度.自从S ...

  4. 判断一个 int 向量里是否有相同的数(1)

    class Solution { public: bool containsDuplicate(vector<int>& nums) { map<int,char> e ...

  5. mysql 修改密码

    安装完成后,默认本地登录超级管理员root,密码为空连接服务后(先停止服务,在wamp中运行mysql控制台enterpass:直接回车),执行set password for root@localh ...

  6. C语言-两个库函数

    两个库函数 --1-- printf函数 1.1 printf 函数的介绍 1.2 格式控制字符串 1.3 %f输出精度的问题 1.4 printf 函数使用注意事项 --2-- scanf函数 2. ...

  7. Codeforces617 E . XOR and Favorite Number(莫队算法)

    XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...

  8. noi 6047 分蛋糕

    题目链接:http://noi.openjudge.cn/ch0405/6047/ 和Uva1629很类似,不过,可能用记忆化难写一点,状态初始化懒得搞了.就用循环好了. 状态描叙也可以修改,那个题目 ...

  9. Mysql空用户导致数据库登陆故障处理 (原创帖,转载请注明出处)

    首先感谢在本次故障中阿铭对我的无私帮助,万分感谢!阿铭linux论坛:http://www.apelearn.com/study_v2/   问题描述: 公司安全部门扫描到数据库空密码漏洞,用户名密码 ...

  10. Linux之RHEL6的开机流程分析

    开机——很多人觉得很简单的事情,只要按下电源开关,然后系统就会自然启动,没有什么需要学习的.其实不然,如果系统没有什么问题,可以正常登陆的时候,当然开机很简单.但更多的时候,我们需要知道当机子不能正常 ...