一.基础环境:

本文默认了你已经有一点的java基础,本机环境已安装java、maven、ide,配置好了相关的环境变量,且已经有可用的hadoop环境,已经用idea新建一个java maven项目。还要有一台linux客户机,可执行hadoop命令的。

以上环境有没完成的,自行去百度完成。

二.pom.xml引入包:

      <dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.7.3</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>2.7.3</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.7.3</version></dependency>

三.准备统计文件并上传

1.新建一个文件word_test.txt

I have searched a thousand years,And I have cried a thousand tears。
I found everything I need,You are everything to me。

2.上传到hadoop

先 rz 上传到linux客户机,再执行下边命令上传到hdfs

hadoop fs -mkdir /tmp/mr_test/
hadoop fs -put ./word_test.txt /tmp/mr_test/

四.上代码(官方WordCount V1)

package com.yixin;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 java.io.IOException;
import java.util.StringTokenizer;public class WordCount {public static class TokenizerMapperextends Mapper<Object, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);private final 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 IntSumReducerextends Reducer<Text,IntWritable,Text,IntWritable> {private final 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();Job job = Job.getInstance(conf, "word count");job.setJarByClass(WordCount.class);job.setMapperClass(TokenizerMapper.class);job.setCombinerClass(IntSumReducer.class);job.setReducerClass(IntSumReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));System.exit(job.waitForCompletion(true) ? 0 : 1);}
}

五.打包上传执行

1.用ide或maven打包代码成jar,

2.rz上传到linux客户机

3.执行代码

hadoop jar mrtest-1.0-SNAPSHOT.jar com.yixin.WordCount /tmp/mr_test/word_test.txt /tmp/mr_test/output

4.查看结果

hadoop fs -cat /tmp/mr_test/output/*

六.官方WordCount V2

与v1的主要差别,在Map类中是增加了 setup(Context context) 方法,增加2个参数对大小写和忽略字符进行控制。具体说明我在代码中有备注。

实际上,map和reduce都有setup(Context context) ,cleanup(Context context),前一个是初始化操作,后一个是做清理工作。在map或reduce方法的前后执行,大家可以根据业务合理使用。

1.上v2代码

package com.yixin;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
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.mapreduce.Counter;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.util.StringUtils;public class WordCount2 {/*** 这里可以设置map和reduce用到的变量和方法。* 注:正常每个map和reduce是各用各的,修改互相不可见。除非你用的全局计数器或分布式缓存。*/public static class TokenizerMapperextends Mapper<Object, Text, Text, IntWritable> {/*** 这里可以设置map用到的变量和方法。* 注:正常每个map是各用各的,修改互相不可见。除非你用的全局计数器或分布式缓存。*/// 这就是个全局计数器,各map是可共享的,修改可见的。static enum CountersEnum {INPUT_WORDS}private final static IntWritable one = new IntWritable(1);private Text word = new Text();private boolean caseSensitive;private Set<String> patternsToSkip = new HashSet<String>();private Configuration conf;private BufferedReader fis;/*** setup方法可以执行一些map执行前的一些初始化工作,* 如对变量做初始化加工,设置数据库连接,输入路径过滤等。* 这个例子是对是否大小写做了个处理,对跳过字符的规则做了处理。*/@Overridepublic void setup(Context context) throws IOException,InterruptedException {conf = context.getConfiguration();caseSensitive = conf.getBoolean("wordcount.case.sensitive", true);if (conf.getBoolean("wordcount.skip.patterns", true)) {URI[] patternsURIs = Job.getInstance(conf).getCacheFiles();if(patternsURIs!=null){for (URI patternsURI : patternsURIs) {Path patternsPath = new Path(patternsURI.getPath());String patternsFileName = patternsPath.getName().toString();parseSkipFile(patternsFileName);}}}}private void parseSkipFile(String fileName) {try {fis = new BufferedReader(new FileReader(fileName));String pattern = null;while ((pattern = fis.readLine()) != null) {patternsToSkip.add(pattern);}} catch (IOException ioe) {System.err.println("Caught exception while parsing the cached file '"+ StringUtils.stringifyException(ioe));}}@Overridepublic void map(Object key, Text value, Context context) throws IOException, InterruptedException {String line = (caseSensitive) ?value.toString() : value.toString().toLowerCase();for (String pattern : patternsToSkip) {line = line.replaceAll(pattern, "");}StringTokenizer itr = new StringTokenizer(line);while (itr.hasMoreTokens()) {word.set(itr.nextToken());context.write(word, one);Counter counter = context.getCounter(CountersEnum.class.getName(),CountersEnum.INPUT_WORDS.toString());counter.increment(1);}}}public static class IntSumReducerextends 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();GenericOptionsParser optionParser = new GenericOptionsParser(conf, args);String[] remainingArgs = optionParser.getRemainingArgs();if (!(remainingArgs.length != 2 || remainingArgs.length != 4)) {System.err.println("Usage: wordcount <in> <out> [-skip skipPatternFile]");System.exit(2);}Job job = Job.getInstance(conf, "word count");job.setJarByClass(WordCount2.class);job.setMapperClass(TokenizerMapper.class);job.setCombinerClass(IntSumReducer.class);job.setReducerClass(IntSumReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);List<String> otherArgs = new ArrayList<String>();for (int i = 0; i < remainingArgs.length; ++i) {if ("-skip".equals(remainingArgs[i])) {job.addCacheFile(new Path(remainingArgs[++i]).toUri());job.getConfiguration().setBoolean("wordcount.skip.patterns", true);} else {otherArgs.add(remainingArgs[i]);}}FileInputFormat.addInputPath(job, new Path(otherArgs.get(0)));FileOutputFormat.setOutputPath(job, new Path(otherArgs.get(1)));System.exit(job.waitForCompletion(true) ? 0 : 1);}
}

2.运行方式a,和v1参数一样

打包上传和v1一样不说了,运行是如下命令:

hadoop fs -rm -r /tmp/mr_test/output
hadoop jar mrtest-1.0-SNAPSHOT.jar com.yixin.WordCount2 /tmp/mr_test/word_test.txt /tmp/mr_test/output

结果:

hadoop fs -cat /tmp/mr_test/output/*

3.新建文件patterns.txt(跳过字符的规则),并上传到集群。

新建,编辑,保存

vim patterns.txt
\.
\,
\!
to
\,
\。

上传:

hadoop fs -put patterns.txt /tmp/mr_test/

运行方法b,多加2个参数,跳过不需要统计的字符

hadoop fs -rm -r /tmp/mr_test/output
hadoop jar mrtest-1.0-SNAPSHOT.jar com.yixin.WordCount2 /tmp/mr_test/word_test.txt /tmp/mr_test/output -skip /tmp/mr_test/patterns.txt

结果:

hadoop fs -cat /tmp/mr_test/output/*

相关字符已经过滤掉。

七.MR简化配置工具ToolRunner:

可以使这个工具来预配置,这样能简化使用方的代码量,如精简main方法,只需要2行代码,这个我就不写例子,推荐大家看这个文章:

使用ToolRunner运行Hadoop程序基本原理分析_jediael_lu的专栏-CSDN博客

【大数据笔记】- Hadoop MapReduce API相关推荐

  1. 大数据之Hadoop(MapReduce):FileInputFormat实现类

    目录 1.FileInputFormat的实现类 2.TextInputFormat 2.1TextInputFormat实例 3.KeyValueTextInputFormat 3.1TextInp ...

  2. 【快速入门大数据】hadoop和它的hdfs、yarn、mapreduce

    文章目录 导学 大数据概述 初识Hadoop 概述 核心组件 HDFS分布式文件系统 资源调度系统YARN MapReduce 优势 发展史 生态系统 发行版本选择 企业应用案例 第3章 分布式文件系 ...

  3. 大数据之Hadoop学习——动手实战学习MapReduce编程实例

    文章目录 一.MapReduce理论基础 二.Hadoop.Spark学习路线及资源收纳 三.MapReduce编程实例 1.自定义对象序列化 需求分析 报错:Exception in thread ...

  4. 尚硅谷大数据技术Hadoop教程-笔记02【Hadoop-入门】

    视频地址:尚硅谷大数据Hadoop教程(Hadoop 3.x安装搭建到集群调优) 尚硅谷大数据技术Hadoop教程-笔记01[大数据概论] 尚硅谷大数据技术Hadoop教程-笔记02[Hadoop-入 ...

  5. 好程序员大数据笔记之:Hadoop集群搭建

    好程序员大数据笔记之:Hadoop集群搭建在学习大数据的过程中,我们接触了很多关于Hadoop的理论和操作性的知识点,尤其在近期学习的Hadoop集群的搭建问题上,小细节,小难点拼频频出现,所以,今天 ...

  6. 尚硅谷大数据技术Hadoop教程-笔记01【大数据概论】

    视频地址:尚硅谷大数据Hadoop教程(Hadoop 3.x安装搭建到集群调优) 尚硅谷大数据技术Hadoop教程-笔记01[大数据概论] 尚硅谷大数据技术Hadoop教程-笔记02[Hadoop-入 ...

  7. 尚硅谷大数据技术Hadoop教程-笔记03【Hadoop-HDFS】

    视频地址:尚硅谷大数据Hadoop教程(Hadoop 3.x安装搭建到集群调优) 尚硅谷大数据技术Hadoop教程-笔记01[大数据概论] 尚硅谷大数据技术Hadoop教程-笔记02[Hadoop-入 ...

  8. Hadoop专业解决方案-第1章 大数据和Hadoop生态圈

    一.前言: 非常感谢Hadoop专业解决方案群:313702010,兄弟们的大力支持,在此说一声辛苦了,经过两周的努力,已经有啦初步的成果,目前第1章 大数据和Hadoop生态圈小组已经翻译完成,在此 ...

  9. 大数据技术之MapReduce

    大数据技术之MapReduce 目录 大数据技术之MapReduce 第 1 章 MapReduce 概述 1.1 MapReduce 定义 1.2 MapReduce 优缺点 1.2.1 优点 1. ...

  10. AI时代:聊聊大数据中的MapReduce

    各位朋友,大家好,我是Payne,欢迎大家关注我的博客.最近读一本并行计算相关的书籍,在这本书中作者提到了MapReduce.相信熟悉大数据领域的朋友,一定都知道MapReduce是Hadoop框架中 ...

最新文章

  1. win7x64注册表显卡渲染速度_Geek3D GpuTest GUI(显卡测试软件)下载-Geek3D GpuTest GUI(显卡测试软件)免费版下载v0.7.0...
  2. 嵌入式系统笔记之自动登录
  3. Java抓取网页数据(原网页+Javascript返回数据)
  4. cdn加速的原理是怎么样的
  5. jsp九大内置对象和四大作用域_JSP学习3
  6. discuz mysql data_Discuz!显示 Database Error的原因和解决方法
  7. 设置访问权限_CentOS7利用Firewall对PostgreSQL设置安全的访问权限
  8. java中10个用户注册_JavaWeb(十)Session
  9. 关于数据库#1063 - Incorrect column specifier for column 'xxx'异常
  10. day64 django django零碎知识点整理
  11. Windows Phone App Studio 无码开发手机应用
  12. java.util.ConcurrentModificationException的解决办法
  13. Atitit 图像资料文档分类器 netpic image 网络图片与人像图片分类 微信图片分类 D:\0workspace\atiplat_img\src\com\attilax\img\ut
  14. Java实现简易文本编辑器
  15. 怎么做视频伪原创 快手视频修改md5
  16. 如何修改路由器dns服务器,怎么修改路由器DNS地址
  17. Python中三个双引号的作用是什么?
  18. JAVA 获取某天、某周、某月、某年的开始时间和结束时间
  19. php 索引数组应用实例,php数字索引数组实例用法总结
  20. taishan服务器修改为u盘启动,bios改成u盘启动

热门文章

  1. mac 启动 进度条卡在一半处
  2. javascript 综合
  3. Invalid header signature; read 0x6D78206C6D74683C, expected 0xE11AB1A1E011CFD0(错误excel文件导入头)
  4. 实例讲解扁平化设计的步骤和要点
  5. braycote castrol 600EF 601EF 602EF 815Z 614EF 615 631A 631RP 640AC 640ACMS 802RP 803EP 803RP 804 806
  6. 项目沟通管理干系人管理
  7. 工具 | 快速视频压缩与格式转换 | 格式工厂
  8. okcc呼叫中心的收费标准
  9. Griffon 0.3发布
  10. 虚拟机winxp纯净_虚拟机 win7系统ghostxp纯净版