0 准备工作:
本篇以hadoop2.7.7 + eclipse 2019 03为例
先在windows上下载如下包:
JDK: Java Downloads | Oracle 进入下载页面选择一个版本进行下载
eclipse: Eclipse Packages | The Eclipse Foundation - home to a global community, the Eclipse IDE, Jakarta EE and over 350 open source projects... 进入下载页面选择一个版本进行下载
Hadoop: http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz
其他工具:hadoop-eclipse-plugin-2.7.7+winutils+hadoop.dll_hadoop-eclipse-plugin-2.7.7.jar-Hadoop工具类资源-优快云下载 这里包含hadoop-eclipse-plugin-2.7.7.jar + winutils.exe + hadoop.dll
1. 下载JDK进行安装
1)打开下载页面,找到对应版本的JDK下载连接
2)找到对应版本的下载
3)等下载完成后,打开安装包进行安装
4)根据自己的情况选择安装目录,点击更改可以选择安装目录,设置完成后下一步继续(为了避免出现不必要的问题,目录不要包含空格或中文字符等)
确定,继续安装
5)这里选择jre安装目录,同样根据自己的情况进行更改,前面选择的是JDK安装目录
6)点击关闭完成安装,接着配置环境变量
7)下面开始设置环境变量,使用快捷方式”WIN+Pause”打开系统属性框,点击更改设置
环境变量里有用户变量和系统变量, 用户变量只针对当前用户有效,系统变量是针对所有用户有效,我们这里添加的是用户变量,当然你也可以用同样的方式添加系统变量
新建JAVA_HOME
新建CLASSPATH变量,多个路径之间以分号隔开,最后一个是 . 表示当前目录
修改PATH变量,添加JAVA的执行路径 %JAVA_HOME%\bin
验证JAVA
WIN+R找开运行框,输入cmd 回车, 输入java –version, 显示如下页面,JDK安装成功。
2.下载安装Hadoop
1)解压下载的包
将压缩包解压到某一目录,这里解压到了D:ProgramData目录
如果在解压中出现如下图所示的错误时,请将解压软件以管理员身份运行
2)配置Hadoop环境变量
配置HADOOP_HOME
以====包含的步骤到可以不做,不影响开发环境的搭建
=============开始==============
添加Hadoop的PATH路径
在%HADOOP_HOME%\etc/hadoop目录下找到hadoop-env.cmd文件,编辑该文件,找到
set JAVA_HOME行,修改为(目录为你JAVA的目录,根据自己情况调整)
set JAVA_HOME="D:\java\jdk1.8.0_201"
打开命令行(win+r打开运行框输入cmd回车)输入hadoop version 看是否能看到版本号,
添加CLASSPATH
在cmd中运行hadoop classpath
将输出的结果添加到CLASSPATH里
重新找开cmd窗口,输出 echo %CLASSPATH%检验CLASSPATH配置情况
=================结束================
添加winutils.exe 和 hadoop.dll 到 hadoop安装目录下的bin目录
3.下载安装Eclipse
1)解压eclipse运行包(这里下载的版本是eclipse-java-2019-03-R-win32-x86_64.zip)到某一个目录,我这里解压到了G盘的Software目录
2) 下载其他工具包,解压后将hadoop-eclipse-plugin-2.7.7.jar 拷贝到eclipse的dropins目录(注意,在Eclipse3.5版本之前是放在plugins目录,之后的版本放在dropins目录)
3) 启动Eclipse并配置工程
选择Workspace, Launch开始
配置Hadoop安装目录
配置Map/ReduceLocations
新建Map/Reduce工程
为工程添加一个Class WordCount
为WordCount添加代码
package Demo;
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 WordCount {
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 {
//伪装成hadoop用户提交作业
System.setProperty("HADOOP_USER_NAME", "hadoop");
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");
//使用eclipse直接提交作业时需要设置jar包,
//具体jar文件全路径以后面打包输出的地址为准
job.setJar("E:\\eclipse-workspace\\MRDemo\\bin\\MRDemo.jar");
job.setJarByClass(WordCount.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用户提交作业
System.setProperty("HADOOP_USER_NAME", "hadoop");
//使用eclipse直接提交作业时需要设置jar包,
//具体jar文件全路径以后面打包输出的地址为准
job.setJar("E:\\eclipse-workspace\\MRDemo\\bin\\MRDemo.jar");
向src目录添加配置文件
拷贝集群上的配置文件到工程的src目录
log4j.properties
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
更改配置文件,方便远程提交,下面方法二选一:
- 修改配置文件中的服务器名为对应的IP, 比如 fs.defaultFS的值为 hdfs://master:9000, master服务器实际的IP为192.168.1.8, 则修改为 hdfs://192.168.1.8:9000
- 修改windows的hosts文件,该文件位于:C:\Windows\System32\drivers\etc,修改之前,将文件属性的只读去掉,然后以管理员身份运行notepad.exe,打开hosts文件进行修改,修改完后将属性改回只读
修改很简单,在hosts文件添加一行 192.168.1.8 master 即可,前面的IP是你Hadoop服务器IP, master是你配置文件里使用的服务器名
修改完成后,在mapred-site.xml文件中添加下列两个属性
其中192.168.1.8为你jobhistory服务器IP,
<property>
<name>mapreduce.app-submission.cross-platform</name>
<value>true</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoopslaves:10020</value>
</property>
刷新文件列表
打包class到工程bin目录下
运行MapReduce程序
/mydir为输入目录,请事先上传一个测试文件到这个目录, /output为输出目录