【大数据笔记】- Hadoop MapReduce API
一.基础环境:
本文默认了你已经有一点的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相关推荐
- 大数据之Hadoop(MapReduce):FileInputFormat实现类
目录 1.FileInputFormat的实现类 2.TextInputFormat 2.1TextInputFormat实例 3.KeyValueTextInputFormat 3.1TextInp ...
- 【快速入门大数据】hadoop和它的hdfs、yarn、mapreduce
文章目录 导学 大数据概述 初识Hadoop 概述 核心组件 HDFS分布式文件系统 资源调度系统YARN MapReduce 优势 发展史 生态系统 发行版本选择 企业应用案例 第3章 分布式文件系 ...
- 大数据之Hadoop学习——动手实战学习MapReduce编程实例
文章目录 一.MapReduce理论基础 二.Hadoop.Spark学习路线及资源收纳 三.MapReduce编程实例 1.自定义对象序列化 需求分析 报错:Exception in thread ...
- 尚硅谷大数据技术Hadoop教程-笔记02【Hadoop-入门】
视频地址:尚硅谷大数据Hadoop教程(Hadoop 3.x安装搭建到集群调优) 尚硅谷大数据技术Hadoop教程-笔记01[大数据概论] 尚硅谷大数据技术Hadoop教程-笔记02[Hadoop-入 ...
- 好程序员大数据笔记之:Hadoop集群搭建
好程序员大数据笔记之:Hadoop集群搭建在学习大数据的过程中,我们接触了很多关于Hadoop的理论和操作性的知识点,尤其在近期学习的Hadoop集群的搭建问题上,小细节,小难点拼频频出现,所以,今天 ...
- 尚硅谷大数据技术Hadoop教程-笔记01【大数据概论】
视频地址:尚硅谷大数据Hadoop教程(Hadoop 3.x安装搭建到集群调优) 尚硅谷大数据技术Hadoop教程-笔记01[大数据概论] 尚硅谷大数据技术Hadoop教程-笔记02[Hadoop-入 ...
- 尚硅谷大数据技术Hadoop教程-笔记03【Hadoop-HDFS】
视频地址:尚硅谷大数据Hadoop教程(Hadoop 3.x安装搭建到集群调优) 尚硅谷大数据技术Hadoop教程-笔记01[大数据概论] 尚硅谷大数据技术Hadoop教程-笔记02[Hadoop-入 ...
- Hadoop专业解决方案-第1章 大数据和Hadoop生态圈
一.前言: 非常感谢Hadoop专业解决方案群:313702010,兄弟们的大力支持,在此说一声辛苦了,经过两周的努力,已经有啦初步的成果,目前第1章 大数据和Hadoop生态圈小组已经翻译完成,在此 ...
- 大数据技术之MapReduce
大数据技术之MapReduce 目录 大数据技术之MapReduce 第 1 章 MapReduce 概述 1.1 MapReduce 定义 1.2 MapReduce 优缺点 1.2.1 优点 1. ...
- AI时代:聊聊大数据中的MapReduce
各位朋友,大家好,我是Payne,欢迎大家关注我的博客.最近读一本并行计算相关的书籍,在这本书中作者提到了MapReduce.相信熟悉大数据领域的朋友,一定都知道MapReduce是Hadoop框架中 ...
最新文章
- win7x64注册表显卡渲染速度_Geek3D GpuTest GUI(显卡测试软件)下载-Geek3D GpuTest GUI(显卡测试软件)免费版下载v0.7.0...
- 嵌入式系统笔记之自动登录
- Java抓取网页数据(原网页+Javascript返回数据)
- cdn加速的原理是怎么样的
- jsp九大内置对象和四大作用域_JSP学习3
- discuz mysql data_Discuz!显示 Database Error的原因和解决方法
- 设置访问权限_CentOS7利用Firewall对PostgreSQL设置安全的访问权限
- java中10个用户注册_JavaWeb(十)Session
- 关于数据库#1063 - Incorrect column specifier for column 'xxx'异常
- day64 django django零碎知识点整理
- Windows Phone App Studio 无码开发手机应用
- java.util.ConcurrentModificationException的解决办法
- Atitit 图像资料文档分类器 netpic image 网络图片与人像图片分类 微信图片分类 D:\0workspace\atiplat_img\src\com\attilax\img\ut
- Java实现简易文本编辑器
- 怎么做视频伪原创 快手视频修改md5
- 如何修改路由器dns服务器,怎么修改路由器DNS地址
- Python中三个双引号的作用是什么?
- JAVA 获取某天、某周、某月、某年的开始时间和结束时间
- php 索引数组应用实例,php数字索引数组实例用法总结
- taishan服务器修改为u盘启动,bios改成u盘启动
热门文章
- mac 启动 进度条卡在一半处
- javascript 综合
- Invalid header signature; read 0x6D78206C6D74683C, expected 0xE11AB1A1E011CFD0(错误excel文件导入头)
- 实例讲解扁平化设计的步骤和要点
- braycote castrol 600EF 601EF 602EF 815Z 614EF 615 631A 631RP 640AC 640ACMS 802RP 803EP 803RP 804 806
- 项目沟通管理干系人管理
- 工具 | 快速视频压缩与格式转换 | 格式工厂
- okcc呼叫中心的收费标准
- Griffon 0.3发布
- 虚拟机winxp纯净_虚拟机 win7系统ghostxp纯净版