Hadoop2.7.5链接:https://pan.baidu.com/s/12ef3m0CV21NhjxO7lBH0Eg
提取码:hhhh
将下载的hadoop包解压到D盘下方便找
然后右击此电脑点属性→点击右边的高级系统设置→点击环境变量→选到下面的Path,点编辑再点新建→进入hadoop包解压过后的下一级bin目录,把完整的路径复制到里面
然后注销一下机器 ,使文件生效
然后可以win+R 打开命令行 输入:hadoop -version 看一下版本 输出版本信息就没问题了
2.配置Maven 阿里源Maven3.6链接:https://pan.baidu.com/s/1_4MT6v2RZMiSccsUoMX_TQ
提取码:hhhh
将下载的maven包解压到D盘下方便找
然后右击此电脑点击属性→点击右边的高级系统设置→点击环境变量→选到下面的Path,点编辑再点新建→进入maven包解压过后的下一级bin目录,把完整的路径复制到里面
设置阿里云仓库:进入到Maven目录的conf目录下,有一个settings.xml文件,把下面这段代码添加进去
安装JDK1.8nexus-aliyun * Nexus aliyun http://maven.aliyun.com/nexus/content/groups/public
如果已经安装了可以跳过此步骤
机器原本就有jDK但是需要使用另一个JDK版本的安装步骤:第一步 把下载好的JDK包解压到D盘目录下,安装JDK 选择安装目录 安装过程中会出现两次 安装提示 。第一次是安装 JDK ,第二次是安装 jre 。建议两个都安装在同一个java文件夹中的不同文件夹中。
第二步 安装完JDK后配置环境变量 计算机→属性→高级系统设置→环境变量
第三步 系统变量→新建 JAVA_HOME 变量 。 变量值填写jdk的安装目录 : D:Javajdk1.8.0
第五步 系统变量→寻找 Path 变量→编辑→新建 %JAVA_HOME%bin
机器没有JDK,需要安装JDK:第一步 : 把下载好的JDK包解压到D盘目录下,安装JDK 选择安装目录 安装过程中会出现两次 安装提示 。第一次是安装 JDK ,第二次是安装 jre 。建议两个都安装在同一个java文件夹中的不同文件夹中。
第二步: 安装完JDK后配置环境变量 计算机→属性→高级系统设置→环境变量
第三步 : 系统变量→新建 JAVA_HOME 变量 。 变量值填写jdk的安装目录 : D:Javajdk1.8.0
第四步: 系统变量→寻找 Path 变量→编辑→新建 %JAVA_HOME%bin
再新建一个 变量值填: %JAVA_HOME%jrebin
第五步: 系统变量→新建 CLASSPATH 变量
变量值填写 .;%JAVA_HOME%lib;%JAVA_HOME%libtools.jar(注意最前面有一点)
win+R 打开CMD命令行 输入java -version 若显示版本信息则安装成功
开始写MR程序
第一步:打开IDEA→New Project→ 选择Maven→ 看到上面有一个Project SDK 在这里可以选择JDK版本 我们选择1.8→点击下面的Next
第二步:设置一下Maven项目的名字 ,Name 那一栏填写 MyMRCode→ Finsh
第三步:Maven项目创建后会创建一个 pom.xml 文件,然后把下面的代码插入到的标签内(使用的hadoop是什么版本就把下面的版本号修改一下,比如我使用的是2.7.5,就把标签里的内容修改成2.7.5):
org.apache.hadoop hadoop-common2.7.5 org.apache.hadoop hadoop-hdfs2.7.5 org.apache.hadoop hadoop-client2.7.5 org.apache.hadoop hadoop-mapreduce-client-core2.7.5 junit junit4.12
然后它会自己下载所需要的资源包,等待下面的进度条加载完就可以进一步写MR程序了!
WordCount案例
然后在D盘的mr/input/目录下新建一个word.txt文件,并在里面写一些单词
Hello Hadoop Hello Word Hello MapReduce
在Maven项目的src文件夹下新建一个package -> 在这个包下面新建一个WordCountMapper类
Map阶段代码实例:
import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; public class WordCountMapper extends Mapper{ @Override protected void map(LongWritable key, Text value, Mapper .Context context) throws IOException, InterruptedException { // 拿到传入进来的一行内容,把数据类型转换为String String line = value.toString(); // 将这行内容按照分隔符切割 String[] words = line.split(" "); // 遍历数组,每出现一个单词就标记一个数组1 例如:<单词,1> for (String word : words) { // 使用MR上下文context,把Map阶段处理的数据发送给Reduce阶段作为输入数据 context.write(new Text(word), new IntWritable(1)); //第一行 Hello Hadoop 发送出去的是 } } }
在新建一个WordCountReducer 类
代码实例:
import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class WordCountReducer extends Reducer{ protected void reduce(Text key, Iterable value, Reducer .Context context) throws IOException, InterruptedException { //定义一个计数器 int count = 0; //遍历一组迭代器,把每一个数量1累加起来就构成了单词的总次数 // for (IntWritable iw : value) { count += iw.get(); } context.write(key, new IntWritable(count)); } }
再写一个Runner类:
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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class Runner {
public static void main(String[] args) throws Exception {
// 通过Job来封装本次MR的相关信息
Configuration conf = new Configuration();
Job wcjob = Job.getInstance(conf);
// 指定MR Job jar包运行主类
wcjob.setJarByClass(Runner.class);
// 指定本次MR所有的Mapper Reducer类
wcjob.setMapperClass(WordCountMapper.class);
wcjob.setReducerClass(WordCountReducer.class);
// 设置我们的业务逻辑 Mapper类的输出 key和 value的数据类型
wcjob.setMapOutputKeyClass(Text.class);
wcjob.setMapOutputValueClass(IntWritable.class);
// 设置我们的业务逻辑 Reducer类的输出 key和 value的数据类型
wcjob.setOutputKeyClass(Text.class);
wcjob.setOutputValueClass(IntWritable.class);
//设置Combiner组件
wcjob.setCombinerClass(WordCountCombiner.class);
// 指定要处理的数据所在的位置
FileInputFormat.setInputPaths(wcjob, "D:/mr/input");
// 指定处理完成之后的结果所保存的位置
FileOutputFormat.setOutputPath(wcjob, new Path("D:/mr/output"));
// 提交程序并且监控打印程序执行情况
boolean res = wcjob.waitForCompletion(true);
System.exit(res ? 0 : 1);
}
}
最后再运行一下这个Runner程序!
然后在D盘的output目录下可以查看生成的文件.



