MapReduce实战1
MapReduce编程规范:
(1)用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行mr程序的客户端)
(2)Mapper的输入数据是KV对的形式(KV的类型可自定义)
(3)Mapper的输出数据是KV对的形式(KV的类型可自定义)
(4)Mapper中的业务逻辑写在map()方法中
(5)map()方法(maptask进程)对每一个<K,V>调用一次
(6)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
(7)Reducer的业务逻辑写在reduce()方法中
(8)Reducetask进程对每一组相同k的<k,v>组调用一次reduce()方法
(9)用户自定义的Mapper和Reducer都要继承各自的父类
(10)整个程序需要一个Drvier来进行提交,提交的是一个描述了各种必要信息的job对象
WordCount:在给定的文本文件中统计输出每一个单词出现的总次数
package com.ahu.bigdata.mr; import java.io.IOException; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
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; /**
* 在给定的文本文件中统计出每一个单词出现的总次数
*
* @author ahu_lichang
*
*/
public class WordCountDriver {
/**
* 自定义mapper类
*
* @author ahu_lichang
*
*/
static class WordCountMapper extends
Mapper<LongWritable, Text, Text, IntWritable> {
// map方法的生命周期:框架每传一行数据就被调用一次
// key:这一行的起始点在文件中的偏移量
// value:这一行的内容
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
// 拿到一行数据转换为String
String line = value.toString();
// 将这一行切分出各个单词
String[] words = line.split("\t");
// 遍历数组,输出<单词,1>
for (String word : words) {
context.write(new Text(word), new IntWritable(1));
}
}
} /**
* 自定义一个reducer类
*
* @author ahu_lichang
*
*/
static class WordCountReducer extends
Reducer<Text, IntWritable, Text, IntWritable> {
// reduce生命周期:框架每传递进来一个KV组,reduce方法就被调用一次
@Override
protected void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
// 定义一个计数器
int count = 0;
// 遍历这一组KV的所有V,累加到count中
for (IntWritable value : values) {
count += value.get();
}
context.write(key, new IntWritable(count));
}
} private static final String INPUT_PATH = "hdfs://hadoop1:9000/data.txt";
private static final String OUT_PATH = "hdfs://hadoop1:9000/wcoutput"; // WordCountDriver是一个主类,用来描述job并提交job
// 相当于一个yarn集群的客户端
// 需要在此封装我们的mr程序的相关运行参数,指定jar包
// 最后提交给yarn
public static void main(String[] args) throws Exception {
if (args == null || args.length == 0) {
args = new String[2];
args[0] = INPUT_PATH;
args[1] = OUT_PATH;
}
// 把业务逻辑相关的信息(哪个是mapper,哪个是reducer,要处理的数据在哪里,输出的结果放在哪里...)描述成一个job对象
// 把这个描述好的job提交给集群去运行
Configuration conf = new Configuration();
Job job = Job.getInstance(conf); // 指定这个job所在的jar包
// job.setJar("/usr/local/wordcount.jar");
job.setJarByClass(WordCountDriver.class); job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class); // 设置业务逻辑Mapper类的输出key和value的数据类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class); // 设置业务逻辑Reducer类的输出key和value的数据类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class); // 指定job的输入原始文件所在目录
//FileInputFormat.setInputPaths(job, new Path(INPUT_PATH));
FileInputFormat.setInputPaths(job, new Path(args[0]));
// 指定job的输出结果所在目录
//FileOutputFormat.setOutputPath(job, new Path(OUT_PATH));
FileOutputFormat.setOutputPath(job, new Path(args[1])); // 将job中配置的相关参数,以及job所用的java类所在的jar包,提交给yarn集群去运行
/* job.submit(); */
boolean res = job.waitForCompletion(true);
System.exit(res ? 0 : 1); } }
1、先在eclipse工程中创建一个用户类库hadoop264jar,将hadoop安装目录中的share文件夹中的common、hdfs、MapReduce、yarn中的jar包全部添加进去。
2、书写代码:创建一个mapper自定义类,在创建一个reducer自定义类,最后创建一个描述job并提交job的主类。
3、运行方式有两种:
(1)直接在eclipse中运行。但是会出现个权限拒绝错误,那是因为没有身份标识造成的。这里再介绍第二种身份标识方式:(第一种身份标识方式,见《HDFS详解》)
(2)在集群上打包运行。先将书写好的代码打成jar包,然后将wordcount.jar复制到Linux的/usr/local/目录下,然后就可以在命令行中运行了。
hadoop jar /usr/local/wordcount.jar /data.txt /wcout
MapReduce程序运行模式:
1、本地运行模式
2、集群运行模式
MapReduce中的Combiner(归约)《Combiner》里面有代码示例
(1)combiner是MR程序中Mapper和Reducer之外的一种组件
(2)combiner组件的父类就是Reducer
(3)combiner和reducer的区别在于运行的位置:
Combiner是在每一个maptask所在的节点运行
Reducer是接收全局所有Mapper的输出结果;
(4) combiner的意义就是对每一个maptask的输出进行局部汇总,以减小网络传输量
具体实现步骤:
1、 自定义一个combiner继承Reducer,重写reduce方法
2、 在job中设置: job.setCombinerClass(CustomCombiner.class)
(5) combiner能够应用的前提是不能影响最终的业务逻辑。而且,combiner的输出kv应该跟reducer的输入kv类型要对应起来
注意:
Combiner的使用要非常谨慎
因为combiner在mapreduce过程中可能调用也可能不调用,可能调一次也可能调多次
所以:combiner使用的原则是:有或没有都不能影响业务逻辑
MapReduce实战1的更多相关文章
- MapReduce实战:统计不同工作年限的薪资水平
1.薪资数据集 我们要写一个薪资统计程序,统计数据来自于互联网招聘hadoop岗位的招聘网站,这些数据是按照记录方式存储的,因此非常适合使用 MapReduce 程序来统计. 2.数据格式 我们使用的 ...
- mapreduce实战:统计美国各个气象站30年来的平均气温项目分析
气象数据集 我们要写一个气象数据挖掘的程序.气象数据是通过分布在美国各地区的很多气象传感器每隔一小时进行收集,这些数据是半结构化数据且是按照记录方式存储的,因此非常适合使用 MapReduce 程序来 ...
- MapReduce实战--倒排索引
本文地址:http://www.cnblogs.com/archimedes/p/mapreduce-inverted-index.html,转载请注明源地址. 1.倒排索引简介 倒排索引(Inver ...
- MapReduce实战(三)分区的实现
需求: 在实战(一)的基础 上,实现自定义分组机制.例如根据手机号的不同,分成不同的省份,然后在不同的reduce上面跑,最后生成的结果分别存在不同的文件中. 对流量原始日志进行流量统计,将不同省份的 ...
- MapReduce实战:邮箱统计及多输出格式实现
紧接着上一篇博文我们学习了MapReduce得到输出格式之后,在这篇博文里,我们将通过一个实战小项目来熟悉一下MultipleOutputs(多输出)格式的用法. 项目需求: 假如这里有一份邮箱数据文 ...
- MapReduce实战项目:查找相同字母组成的字谜
实战项目:查找相同字母组成的字谜 项目需求:一本英文书籍中包含有成千上万个单词或者短语,现在我们要从中找出相同字母组成的所有单词. 数据集和期望结果举例: 思路分析: 1)在Map阶段,对每个word ...
- 《OD大数据实战》MapReduce实战
一.github使用手册 1. 我也用github(2)——关联本地工程到github 2. Git错误non-fast-forward后的冲突解决 3. Git中从远程的分支获取最新的版本到本地 4 ...
- 【原创】MapReduce实战(一)
应用场景: 用户每天会在网站上产生各种各样的行为,比如浏览网页,下单等,这种行为会被网站记录下来,形成用户行为日志,并存储在hdfs上.格式如下: 17:03:35.012ᄑpageviewᄑ{&qu ...
- MapReduce实战(七)GroupingComparator
需求: Order_0000001,Pdt_01,222.8Order_0000001,Pdt_05,25.8Order_0000002,Pdt_05,325.8Order_0000002,Pdt_0 ...
随机推荐
- 【bzoj1044】木棍分割
Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...
- 【转】Example of using the --info linker option
5.3 Example of using the --info linker option This is an example of the output generated by the --in ...
- Oracle 11g DRCP连接方式——基本原理
学习Oracle是一个复杂.繁琐的过程.在浩如烟海的Oracle官方资料.新特性.MOS资料和各种Internal知识面前,我们总是觉得力不从心.不知所措.但是,这往往也就是我们不断坚持.积累和追寻的 ...
- spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置
spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置 jdbc.properties 文件信息如下: ---------- ...
- mybatis与分布式事务的面试
mybatis的面试: https://www.cnblogs.com/huajiezh/p/6415388.html 本地事务与分布式事务: https://www.cnblogs.com/xcj2 ...
- OpenStack 存储服务 Cinder存储节点部署LVM(十六)
Cinder存储节点部署 部署在192.168.137.12主机 1.安装lvm2软件包 yum install lvm2 -y 2.启动LVM的metadata服务并且设置该服务随系统启动 syst ...
- Hadoop生态圈-Flume的主流source源配置
Hadoop生态圈-Flume的主流source源配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客只是配置的是Flume主流的Source,想要了解更详细的配置信息请参 ...
- Golang的文件处理方式-常见的读写姿势
Golang的文件处理方式-常见的读写姿势 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在 Golang 语言中,文件使用指向 os.File 类型的指针来表示的,也叫做文件句柄 ...
- [Spring] 学习Spring Boot之二:整合MyBatis并使用@Trasactional管理事务
一.配置及准备工作 1.在 Maven 的 pom 文件中新增以下依赖: <dependency> <groupId>mysql</groupId> <art ...
- RESTful记录-RESTful服务
按照REST架构,一个RESTful Web服务不应该继续服务器的客户端的状态.这种限制被称为无状态.它负责客户以它的上下文传递给服务器,然后服务器可以存储这样的上下文,以处理客户端的进一步请求.例如 ...