首先来赞叹maven是真的好用。可以使apache的相关项目配置变得非常简单。。。
1.Windows下的maven安装:
前提:jdk及相关的环境变量配置好。
下载maven:http://mirror.bit.edu.cn/apache/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.zip
解压D:\Java\apache-maven-3.0.5
Maven环境配置:
变量名:MVN_HOME
变量值:D:\Java\apache-maven-3.0.5–根据自己的解压目录修改
找到path
在环境变量值尾部加入:;%MVN_HOME%\bin;—前面注意分号
配置调试
打开命令提示符(win+R,cmd),检查我们的java环境和maven环境是否有误。
mvn -v
如果能打印出maven的版本号,说明配置成功
修改本地仓库配置
修改我们仓库地址,仓库用于存放我们项目所依赖的所有jar包。
我的仓库路径:E:\maven\repo—-这个路径是我自己创建,你可以将路径创建在任何位置。
我们打开D:\Java\apache-maven-3.0.5\conf目录下的setting.xml文件,设置成我们创建的仓库路径
打开命令提示符,输入:mvn help:system
该命令会打印出所有的java系统属性和环境变量。
如果运行的过程中没有错误,打开我们仓库(E:\maven\repo)会发现里面多了一些文件。这些文件就是我们从maven的中央仓库下载到本地仓库的。
Myeclipse 结合Maven快速配置搭建web项目。
1打开Myeclipse, 进入window-preference-myeclipse-maven4myeclipse
设置maven安装路径
2设置当前库地址
3新建一个Web项目
进入Myeclipse,选择File-New Project-web project
完成后,
打开pom.xml可以看到myeclipse自动生成的依赖。
点击项目文件,右键->Run as->Maven install将依赖install至本地maven库
(这时候安装可能会出现一些错误,maven clean一下。然后执行maven install就可以了)
maven工程只要是apache的依赖直接在pom.xml中修改就会自动添加
(my)eclipse的配置
将编译好的hadoop-eclipse-plugin-2.2.0.jar插件拷贝到~\eclipse\plugins下
Hadoop路径,将之前搭建Hadoop集群的压缩包,在Windows中解压一份,window-preference-Hadoop Map/Reduce中设置目录到刚刚解压的Hadoop文件夹
打开Map/Reduce视图
新建并编辑hadoop参数:
Host:master的IP
Prot:8020
然后可以在eclipse中看见hdfs中的信息,证明连接成功。
新建Hadoop的maven工程
以下配置文件涵盖了hadoop、hive、hbase开发支持库的配置。
仅需针对maven工程pom.xml文件做相应更改就可以自动生成hadoop开发支持库。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hadoop.version>2.5.0</hadoop.version>
<hive.version>0.13.1</hive.version>
<hbase.version>0.98.6-hadoop2</hbase.version>
</properties>
<dependencies>
<!-- hadoop client -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<!-- hive client -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>${hive.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>${hive.version}</version>
</dependency>
<!-- hbase client -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>${hbase.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>${hbase.version}</version>
</dependency>
</dependencies>
package mapreduce;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
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.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;
public class MyWordCountJob {
/**
* @author Edison Chou
* @version 1.0
* @param KEYIN
* →k1 表示每一行的起始位置(偏移量offset)
* @param VALUEIN
* →v1 表示每一行的文本内容
* @param KEYOUT
* →k2 表示每一行中的每个单词
* @param VALUEOUT
* →v2 表示每一行中的每个单词的出现次数,固定值为1
*/
public static class MyMapper extends
Mapper<LongWritable, Text, Text, LongWritable> {
protected void map(LongWritable key, Text value,
Mapper<LongWritable, Text, Text, LongWritable>.Context context)
throws java.io.IOException, InterruptedException {
String[] spilted = value.toString().split(" ");
for (String word : spilted) {
context.write(new Text(word), new LongWritable(1L));
}
};
}
/**
* @author Edison Chou
* @version 1.0
* @param KEYIN
* →k2 表示每一行中的每个单词
* @param VALUEIN
* →v2 表示每一行中的每个单词的出现次数,固定值为1
* @param KEYOUT
* →k3 表示每一行中的每个单词
* @param VALUEOUT
* →v3 表示每一行中的每个单词的出现次数之和
*/
public static class MyReducer extends
Reducer<Text, LongWritable, Text, LongWritable> {
protected void reduce(Text key,
java.lang.Iterable<LongWritable> values,
Reducer<Text, LongWritable, Text, LongWritable>.Context context)
throws java.io.IOException, InterruptedException {
long count = 0L;
for (LongWritable value : values) {
count += value.get();
}
context.write(key, new LongWritable(count));
};
}
// 输入文件路径
public static final String INPUT_PATH = "hdfs://hadoop-master:9000/testdir/input/words.txt";
// 输出文件路径
public static final String OUTPUT_PATH = "hdfs://hadoop-master:9000/testdir/output/wordcount";
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
// 0.0:首先删除输出路径的已有生成文件
FileSystem fs = FileSystem.get(new URI(INPUT_PATH), conf);
Path outPath = new Path(OUTPUT_PATH);
if (fs.exists(outPath)) {
fs.delete(outPath, true);
}
Job job = new Job(conf, "WordCount");
job.setJarByClass(MyWordCountJob.class);
// 1.0:指定输入目录
FileInputFormat.setInputPaths(job, new Path(INPUT_PATH));
// 1.1:指定对输入数据进行格式化处理的类(可以省略)
job.setInputFormatClass(TextInputFormat.class);
// 1.2:指定自定义的Mapper类
job.setMapperClass(MyMapper.class);
// 1.3:指定map输出的<K,V>类型(如果<k3,v3>的类型与<k2,v2>的类型一致则可以省略)
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
// 1.4:分区(可以省略)
job.setPartitionerClass(HashPartitioner.class);
// 1.5:设置要运行的Reducer的数量(可以省略)
job.setNumReduceTasks(1);
// 1.6:指定自定义的Reducer类
job.setReducerClass(MyReducer.class);
// 1.7:指定reduce输出的<K,V>类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
// 1.8:指定输出目录
FileOutputFormat.setOutputPath(job, new Path(OUTPUT_PATH));
// 1.9:指定对输出数据进行格式化处理的类(可以省略)
job.setOutputFormatClass(TextOutputFormat.class);
// 2.0:提交作业
boolean success = job.waitForCompletion(true);
if (success) {
System.out.println("Success");
System.exit(0);
} else {
System.out.println("Failed");
System.exit(1);
}
}
}
创建mr类。
run as …
可以直接用eclipse查看结果了。
但是这是在pc机上跑的单机模式,要使用集群跑mr程序要打包成mr程序,上传到服务器上去,然后用集群跑。