- 前置环境
- Eclipse环境配置
- 1. 安装插件:
- 2. 配置MapReduce环境:
- 3. 新建MapReduce工程
- 设置 log4j.properties
- 其他杂七杂八的坑点及环境设置
- 1. 计算机用户名不能出现空格
- 2. hadoop.dll 缺失
- 3. Windows下还需要winutils.exe文件
- 4. 修改dfs.permissions为false
- MapReduce程序案例——词频统计程序
- 目录结构
- 代码
- 在本地执行
- 在Hadoop伪分布式集群上执行
需要搭建好hadoop伪分布式集群平台,未搭建好的可以看这个教程 万字详解,Hadoop大数据技术简介及 伪分布式集群搭建快速入门教程
Eclipse环境配置Eclipse(Windows 本地系统的)
1. 安装插件:hadoop-eclipse-plugin-2.7.3.jar
地址:https://pan.baidu.com/s/1BaAOQkZaY4RvUPuBPVlgJg 提取码:067u
将插件复制到eclipse目录下的dropins目录
配置好Hadoop插件后,接下来配置开发环境,连接到Hadoop集群,相关步骤如下:
(1) 增加Map/Reduce功能区
(2) 增加Hadoop集群的连接
点蓝色小象新建一个Locations
这里需要填的有:
相关的连接配置信息有:
①Location name:命名新建的Hadoop连接,随便写
②Map/Reduce(V2)Master:填写Hadoop集群的ResourceManager的IP和端口,从以前配置Hadoop集群的yarn-site.xml找
③DFS Master:填写Hadoop集群的NameNode的IP和端口,从以前配置的core-site.xml找
如果没有配置相关端口,那么就用默认的设置即可,最后finish配置完成。
这里有一个坑,点击已创建的Locations可能会报错,如果设置没问题的话,不用管他
(3) 浏览HDFS上的目录及文件
配置完成Hadoop集群的连接信息后,就可以在Eclipse界面浏览HDFS上的目录和文件了,还可以通过鼠标来进行文件操作
需要注意的是,执行操作后,需要刷新HDFS列表,从而获得文件目录的最新状态。
3. 新建MapReduce工程本部分将在Eclipse建立MapReduce工程MemberCount,大体按照下面四个步骤进行:
(1)导入MapReduce运行依赖的jar包
首先将虚拟环境中的hadoop包导入到本地环境下,导入过程如下:
这里需要在本地windows系统下解压一个hadoop,并将路径设置上去。
(2)创建MapReduce工程
(3)在MapReduce Project的界面创建工程
(4)查验是否创建好工程
需要在工程的src目录下新建一个log4j.properties文件,其内容如下
log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n log4j.appender.logfile=org.apache.log4j.FileAppender log4j.appender.logfile.File=target/spring.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n其他杂七杂八的坑点及环境设置 1. 计算机用户名不能出现空格
cmd中使用下述命令查看用户名
whoami
修改方法如下:
右键开始按钮,选择【计算机管理】,如下图所示进行修改,修改后需重启后生效,但是不急着重启,因为后边还有。
在这个链接中https://github.com/4ttty/winutils找到相应版本的hadoop.dll下载
然后将其放到C:WindowsSystem32目录下
3. Windows下还需要winutils.exe文件https://github.com/4ttty/winutils找到相应版本的winutils.exe下载
然后将其放到本地hadoop目录下的bin文件夹里,然后进行环境变量的设置
新建如下系统变量HADOOP_HOME,值为hadoop的安装目录
然后设置Path变量,添加一项内容为
%HADOOP_HOME%bin
重启后生效
切换到下图路径下
使用命令vim hdfs-site.xml新增下面的property,若已存在将其value修改为false
MapReduce程序案例——词频统计程序 目录结构 代码dfs.permissions false
WordCountMapper类,继承于Hadoop的Mapper:
import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; public class WordCountMapper extends Mapper{ @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // key 偏移量 value 每行文本:I love Guiyang // 按照空格对每行文本进行分词操作:[I,love,Guiyang] String line = value.toString(); // 数据类型的转换 String[] words = line.split(" "); // 对字符串进行拆分 [I,love,Guiyang] for (int i = 0; i < words.length; i++) { // (I,1) Text word = new Text(words[i]); IntWritable value2 = new IntWritable(1); context.write(word,value2); } } }
WordCountReducer类,继承于Hadoop的Reducer:
import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; public class WordCountReducer extends Reducer{ @Override protected void reduce(Text k3, Iterable v3, Context context) throws IOException, InterruptedException { // 进行求和操作,需要计算v3的长度 // int count = 0; for (IntWritable v: v3) { int value = v.get(); count += value; } context.write(k3,new IntWritable(count)); } }
WordCountJob类:
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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
public class WordCountJob {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { // 实列化Job
Job job = Job.getInstance();
job.setJarByClass(WordCountJob.class); // 设置Mapper
job.setMapperClass(WordCountMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class); // 设置Reducer
job.setReducerClass(WordCountReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class); // 指明输入文件的路径
FileInputFormat.setInputPaths(job,new Path("hdfs://192.168.80.128:8020/input/One Hundred Years of Solitude.txt")); // 指明输出文件的路径
FileOutputFormat.setOutputPath(job,new Path("d:/mr_result/wc01")); // 开始运行任务
boolean completion = job.waitForCompletion(true);
if (completion){
System.out.println("程序运行成功~");
}
else { System.out.println("程序运行失败~"); }
}
}
在本地执行
创建输入文件wordcount.txt,其内容为:
I love Guiyang I love Guizhou Guiyang is the capical of Guizhou
在WordCountJob类中的第16行设置好本地输入文件路径
FileInputFormat.setInputPaths(job,new Path("d:/wordcount.txt"));
在WordCountJob类中右键,选择【Run As】-【1 Java Application】
若报错如下图所示,说明输出路径已存在,删掉就可以了
成功运行则如下图所示
结果如下:
需先启动相应服务,命令为:
start-all.sh
在DFS Locations相应路径上右键,点击【Upload files to DFS】
将测试文件One Hundred Years of Solitude.txt上传至HDFS文件服务器上
在WordCountJob类中的第16行设置好云输入文件路径
FileInputFormat.setInputPaths(job,new Path("hdfs://192.168.80.128:8020/input/One Hundred Years of Solitude.txt")); // 指明输出文件的路径
在WordCountJob类中右键,选择【Run As】-【2 Run on Hadoop】
成功运行则如下图所示
结果如下:
在:8088中可以看到程序在hadoop上运行的记录



