在eclipse中用gradle搭建MapReduce项目
我用的系统是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项目的更多相关文章
- ubuntu14.04 Hadoop单机开发环境搭建MapReduce项目
Hadoop官网:http://hadoop.apache.org/ 目前最新的版本是Hadoop 3.0.0-alpha1前提:java 1.6 版本以上 首先从官网下载压缩包(hadoop-3.0 ...
- maven -- 学习笔记(四)实现在Eclipse用maven搭建springmvc项目(附构建步骤和详细实现代码)
Learn from:http://www.cnblogs.com/fangjins/archive/2012/05/06/2485459.html,感谢楼主的分享,才有下面的这篇学习小结 一.环境准 ...
- 从0到1用eclipse用maven搭建web项目
1,默认已经搭建了JDK1.5以上,以及eclipseEE版本,和maven. 2,修改maven的本地仓库和镜像,修改本地仓库是为了方便我们管理,maven的默认仓库是在C盘的USER文件夹下,我一 ...
- eclipse中用maven创建web项目
上一节中完成了本地的maven环境搭建,在eclipse中怎么创建一个maven项目呢 一.eclipse中配置maven环境 eclipse版本4.3 1.打开菜单Help->Eclipse ...
- gradle学习系列之eclipse中简单构建android项目
看不到图片能够去訪问这个网址看看:http://pan.baidu.com/s/1o6FrFkA 一.什么是Gradle 官网www.gradle.org上介绍Gradle是升级版(evolved)的 ...
- eclipse 导入gradle引入多模块项目,引入eclipse后变成了好几个工程
1.eclipse 导入gradle 项目 ,选择项目文件夹. 2.导入完成后,文档结构变成 ,多个子项目并列了,而且互不依赖,没有层级结构了. 3.点击项目目录,右上角这个小箭头,选择projec ...
- Eclipse搭建maven项目的流程,聚合所有的子模块项目
Eclipse搭建maven项目的流程 2018年03月01日 15:47:03 阅读数:22 1:搭建parent工程,用来聚合所有的子模块项目 2:搭建公共使用的模块common 这里你要点击空白 ...
- eclipse上的git命令使用浅析,搭建Maven项目
eclipse上的git命令使用浅析 2016-03-31 14:44 关于eclipse上git的安装和建立代码仓库的文章比较多,但作为一个初识git的人更希望了解每个命令的作用. 当项目连接到 ...
- 解决Eclipse导入Gradle项目时在 Building gradle project info 一直卡住
问题描述 在使用 Eclipse 导入 Gradle 项目时一直卡住,不能导入项目 问题解决 解决办法主要有两种:一是直接下载 gradle 离线包,二是修改项目的 ..\gradle\wrapp ...
随机推荐
- 源代码编译安装Python3.5.2
由于没有找到Python3.5的rpm安装包,因此进行源代码编译安装 1.下载Python3.5.2 [root@seastar ~]# cd /usr/local/src [root@seastar ...
- zw.delphi不同版本程序运行速度测试
{ zw.delphi不同版本程序运行速度测试 delphi无论是开发,编译,还是运行,速度方面向来不差,笔者很少进行这种微粒度的优化,调试. 最近,因为项目需要,发现:同一个函数模块,差不多同样的代 ...
- 二十四、JDK1.5新特性---泛型
由于本人认知有限,泛型在使用上没有太大压力,但是尚未具备详细介绍泛型的能力,因此本文只是粗略的描述泛型的相关知识,在以后的学习过程中会对这篇文章进行修改,希望这篇文章不会给读者带来迷惑,特此声明 什么 ...
- EntityFramework 使用经验
1.Nuget控制台常用命令 1.获取EntityFramework命令帮助:get-help EntityFramework 2.在项目中启动数据迁移:Enable-Migrations 3.添加 ...
- CSS3 Border-image
CSS3中有关于border的属性我们一起学习完了圆角border-radius和边框颜色border-color,只剩下最后一个边框图片border-image.今天我们就一起来学习这个border ...
- 初学者-ASCII码 数字转字母
var index=1; var byt = new byte[1] {(byte) (index + 64)}; var grade = Encoding.ASCII.GetString(byt); ...
- java获取两个时间的相隔时间,包括年、月、日、时、分、秒
public static final int YEAR_RETURN = 0; public static final int MONTH_RETURN = 1 ...
- linq+映射数据库调用方法
关于这一块.我在网上了解了很多.但是都没有找到自己想要的.通过各方面了解在linq 中调用映射的数据库函数以及存储过程方法如下. 1.传递对象参数//*注意:参数必须和你函数或者存储过程的参数一样 ...
- JavaScript使用技巧(1)——JS常用的函数
1.字符串对象函数和属性 函数: charAt():返回在指定位置的字符. charCodeAt():返回在指定的位置的字符的 Unicode 编码. concat():连接字符串. indexOf( ...
- build/envsetup.sh 生成的命令详解表
参考: https://wiki.cyanogenmod.org/w/Envsetup_help 它是一个.sh文件,用source后就生成android编译相关函数,具体如下. 速查 Invokin ...