以实例让你真正明白mapreduce---填空式、分布(分割)编程


问题导读:

1.如何在讲mapreduce函数中的字符串等信息,输出到eclipse控制台?
2.除了使用下文方法,还有其它方法输出到控制台?
3.map中,系统默认接受的value值是什么?
4.reduce输出不是自己想要的结果,可能的原因是什么?


附件不能下载,可查看原文链接:
http://www.aboutyun.com/thread-8303-1-1.html

mapreduce不是很好理解,为什么?
因为我们传统编程,运行程序,都在本地,怎么会跑到别的客户端或则服务器那,总之运行程序就是一太电脑。mapreduce牛啊,他竟然可以让一个程序多台电脑一块跑,这也是它的神奇不同之处,同时也让mapreduce蒙上了一层神秘的面纱。

这里我们就来揭开这个面纱。

这里难以理解的地方是什么?它是如何分割的,如何分组、如何分区的,什么shuffer,等等各种概念涌入初学者脑海中,然后就是云里雾里、似看清、又看不清。





这里我们抛弃这些所有的概念,让我们来一个短平快、更直接、更简单的的认识。

记得我们在上学的时候,有一种题型是填空题,而mapreduce就是一个填空式编程。

为什么被认为是填空式编程,因为mapreduce是一个框架,我们所作的就是编写map函数、reduce函数、然后驱动函数main()。

填空,让我们填写的就是map、reduce函数。剩下的则是由整个mapreduce框架来完成。


首先从map函数入手

// map类
static class MyMapper extends
Mapper<LongWritable, Text, Text, LongWritable> {
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {


final String[] splited = value.toString().split(" ");
org.apache.hadoop.mapreduce.Counter count= context.getCounter("map中的值value", value.toString());
count.increment(1l);

for (String word : splited) {
context.write(new Text(word), new LongWritable(1L));
//org.apache.hadoop.mapreduce.Counter count= context.getCounter("map中的值value", new Text(word).toString()+"个数"+new LongWritable(1L).toString());
//count.increment(1l);
}

}

}

我们知道map接受了数据,那么这个数据是是怎么个数据??

假如我们有下面数据
hello www.aboutyun.com hello word
hello hadoop
hello mapreduce

我们map函数如下:
map(LongWritable key, Text value, Context context)
上面有三个参数,其中key是偏移量,这里不是我们的重点,对于Context不了解,可以查看hadoop开发必读:认识Context类的作用.
我们这里重点讲value,这个value到底是什么?

hello www.aboutyun.com hello word

还是
hello

还是


hello www.aboutyun.com

我们在做填空题,框架之外的我们还没有看到,所以我需要明白value到底是什么?
下面我们开始运行程序





运行程序,这里让我们犯愁了,为什么,因为在运行这个程序之前,你有环境了吗?没有,
一、搭建环境
参考新手指导:Windows上使用Eclipse远程连接Hadoop进行程序开发,首先搭建环境,这里还用到了eclipse插件,
二、插件下载
hadoop-eclipse-plugin-2.2.0.jar
链接: http://pan.baidu.com/s/1sjQ6Nnv密码: uvwx
更多插件:hadoop家族、strom、spark、Linux、flume等jar包、安装包汇总下载(持续更新)

三、遇到问题
环境搭建好了,我们开发运行程序了,遇到各种问题该如何解决,可参考
Win7 Eclipse调试Centos Hadoop2.2-Mapreduce出现问题解决方案
在window中,我们遇到最多的问题就是缺少
1.winutils.exe
2.hadoop.dll
 hadoop-common-2.2.0-bin-master.zip (273.06 KB, 下载次数: 0, 售价: 2 云币) 

上面下载附件,上面没有必要都放到hadoop_home/bin下面,缺什么我们放到里面就ok了。我们的路径是
  1. D:\hadoop2\hadoop-2.2.0\bin
复制代码





环境有了,我们需要准备数据以及mapreduce程序

一、准备数据
首先第一步我们上传待分析文件:

 

第二步:找到文件 


第三步:上传成功

 


二、mapreduce函数分析


map函数:
static class MyMapper extends
                        Mapper<LongWritable, Text, Text, LongWritable> {
                protected void map(LongWritable key, Text value, Context context)
                                throws IOException, InterruptedException {
                        
                        
                        final String[] splited = value.toString().split(" ");
                        org.apache.hadoop.mapreduce.Counter count= context.getCounter("map中的值value",  value.toString());
                        count.increment(1l);

                
                        for (String word : splited) {
                                context.write(new Text(word), new LongWritable(1L));

                        }

                }

我们看到上面红字部分他的作用是什么,这也正是很多犯愁的地方,因为我们想把我们想看到的数据输出到eclipse的控制台,可惜的是 System.out.println并不如我们愿,所以我们可以使用 getCounter输出我们想看到的内容:
  1. org.apache.hadoop.mapreduce.Counter count= context.getCounter("map中的值value", value.toString());
  2. count.increment(1l);
复制代码
这里我们主要验证:value值传递过来到底是什么?
运行之后下面结果
结果分析:


  1. map中的值value
  2.                 hello hadoop=1
  3.                 hello mapreduce=1
  4.                 hello www.aboutyun.com hello word=1
复制代码
 


上面我们看到输出数据输出了3次,也就是说,我们的map执行了3次,那么我们的原始数据是什么情况,看下图:



结论:
从这里我们看到有多少行就有多少个map,也就是说,系统默认一行调用一个map函数,value值为一行的数据



同理reduce也是如此:


// reduce类
        static class MyReduce extends
                        Reducer<Text, LongWritable, Text, LongWritable> {
                @Override
                protected void reduce(Text k2, java.lang.Iterable<LongWritable> v2s,
                                Context ctx) throws java.io.IOException, InterruptedException {
                        
                        long times = 0L;
                        for (LongWritable count : v2s) {
                                times += count.get();
                                
                                
                        }
                        org.apache.hadoop.mapreduce.Counter count1= ctx.getCounter("reduce中的值"+k2.toString(), new LongWritable(times).toString());
                        count1.increment(1l);

                        ctx.write(k2, new LongWritable(times));

                }

                
        }

这里我们主要验证:reduce中key出现的次数:

 

从上面结果我们看到
hadoop:                      1个
hello :                           4个
mapreduce:               1个
www.aboutyun.com:1个

这里我们并没有通过mapreduce的输出文件来查看,而是通过getCounter来实现的。
我们来看看reduce的输出文结果:
 



这里在做一个有趣的实验:
为什么那,因为很多初学者,可能会遇到一个问题,就是reduce的输出结果不正确,为什么会不正确,下面我们对reduce稍微做一些改动:

static class MyReduce extends
Reducer<Text, LongWritable, Text, LongWritable> {
@Override
protected void reduce(Text k2, java.lang.Iterable<LongWritable> v2s,
Context ctx) throws java.io.IOException, InterruptedException {

long times = 0L;
for (LongWritable count : v2s) {
times += count.get();
org.apache.hadoop.mapreduce.Counter count1= ctx.getCounter("reduce中的值"+k2.toString(), new LongWritable(times).toString());
count1.increment(1l);
ctx.write(k2, new LongWritable(times));
}



}


}

我们查看下面结果:


 


我们来看看reduce的输出文结果:

 


仔细对比我们把


org.apache.hadoop.mapreduce.Counter count1= ctx.getCounter("reduce中的值"+k2.toString(), new LongWritable(times).toString());
count1.increment(1l);
ctx.write(k2, new LongWritable(times));

一个放在循环内,一个放在了循环外,所以产生了下面的结果。这是很多初学者,在学习之初可能会碰到的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Spring编写和使用SOAP Web服务

在RESTful Web服务时代&#xff0c;我有机会使用SOAP Web Service。 为此&#xff0c;我选择了Spring &#xff0c;这是因为我们已经在项目中使用Spring作为后端框架&#xff0c;其次它提供了一种直观的方式来与具有明确定义的边界的服务进行交互&#xff0c;以通过WebServiceT…

前端---vscode 的基本使用

1. vscode 的基本介绍 全拼是 Visual Studio Code (简称 VS Code) 是由微软研发的一款免费、开源的跨平台代码编辑器&#xff0c;目前是前端(网页)开发使用最多的一款软件开发工具。 2. vscode 的安装 下载网址: Download Visual Studio Code - Mac, Linux, Windows选择对应…

建立Win32 Console Project时会出“error LNK1123” 错误

VS2010在经历一些更新后&#xff0c;建立Win32 Console Project时会出“error LNK1123” 错误&#xff0c;解决方案为将 项目|项目属性|配置属性|清单工具|输入和输出|嵌入清单 “是”改为“否”即可&#xff0c;但是没新建一个项目都要这样设置一次。在建立VS2010 Win32 Proje…

将同时共享的用户数量限制为20_共享充电宝市场需求及计划

18269363827 冯从2016-2018年这些时间中共享充电宝市场空间巨大&#xff0c;据权威数据显示共享充电宝市场整个用户数量实现了从0-5888万的巨大增幅&#xff0c;2019年共享充电市场用户规模将继续保持大幅增长至年底达1亿用户规模。在2019年充电宝租赁市场气势盛大&#xff0c;…

mysql中limit用法

使用查询语句的时候&#xff0c;经常要返回前几条或者中间某几行数据&#xff0c;这个时候怎么办呢&#xff1f;不用担心&#xff0c;mysql已 经为我们提供了这样一个功能。 SELECT*FROMtableLIMIT [offset,]rows |rows OFFSET offsetLIMIT 子句可以被用于强制 SELECT 语句返回…

Redis实现之整数集合

整数集合 整数集合&#xff08;insert&#xff09;是集合键的底层实现之一&#xff0c;当一个集合只包含整数值元素&#xff0c;并且这个集合的元素数量不多时&#xff0c;Redis就会使用整数集合作为集合键的底层实现。举个栗子&#xff0c;如果我们创建一个只包含五个元素的集…

启动rocketmq 报错_RocketMQ为什么要保证订阅关系的一致性?

前段时间有个朋友向我提了一个问题&#xff0c;他说在搭建 RocketMQ 集群过程中遇到了关于消费订阅的问题&#xff0c;具体问题如下&#xff1a;然后他发了报错的日志给我看&#xff1a;the consumers subscription not exist我第一时间在源码里找到了报错的位置&#xff1a;or…

scala rest_使用路标的Scala和Java的Twitter REST API

scala rest如果您已经阅读了此博客上的其他文章&#xff0c;您可能会知道我喜欢创建各种数据集的可视化。 我刚刚开始一个小项目&#xff0c;在这里我想可视化来自Twitter的一些数据。 为此&#xff0c;我想直接从Twitter检索有关关注者的信息和个人资料信息。 我实际上开始寻找…

MySql中关于某列中相同数值连续出现次数的统计

MySql中关于某列中相同数值连续出现次数的统计 原表如下&#xff1a; www.2cto.com 100 101 102 100 100 103 104 102 102 105 106 101 101 输出如下&#xff1a; www.2cto.com 100 1 101 2 102 3 100 4 100 4 103 5 104 6 10…

设计模式之- 外观模式(Facade Pattern)

外观模式 外观模式(Facade Pattern)&#xff1a;外部与一个子系统的通信必须通过一个统一的外观对象进行&#xff0c;为子系统中的一组接口提供一个一致的界面&#xff0c;外观模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。外观模式又称为门面模式&…

python的while和for循环

while语句&#xff0c;提供了编写通用循环的一种方法&#xff0c;而for语句是用来遍历序列对象内的元素&#xff0c;并对每个元素运行一个代码块。break,continue用在循环内&#xff0c;跳出整个循环或者跳出一次循环。 一、while循环 1、一般格式 格式&#xff1a;首行以及测试…

go build 无文件_GO笔记之详解GO的编译执行流程

上篇文章介绍了Golang在不同系统下的安装&#xff0c;并完成了经典的Hello World案例。在这个过程中&#xff0c;我们用到了go run命令&#xff0c;它完成源码从编译到执行的整个过程。今天来详细介绍下这个过程。简单理解&#xff0c;go run 可等价于 go build 执行。 build命…

使用Spring Security和jdbc的Spring Boot第2部分

在上一篇文章中&#xff0c;我们基于Spring Security发出请求的默认表架构实现了安全性。 考虑到用户和角色&#xff0c;应用程序开发人员使用适合其需求的架构。 Spring使我们能够指定所需的查询&#xff0c;以便检索用户名&#xff0c;密码和角色等信息。 我们的自定义表将…

MySQL的一些简单语句

mysql 统计 表的数量&#xff1a;SELECT COUNT(1) FROM information_schema.TABLES WHERE TABLE_SCHEMA 你的数据库; MySQL的一些基础语句&#xff1a; 行是记录 列是字段 创建库 CREATE DATABASE [IF NOT EXISTS] 数据库名 [参数[ 参数] [ 参数]...]; 参数: CHARACTER …

【题解】Atcoder ARC#90 F-Number of Digits

Atcoder刷不动的每日一题... 首先注意到一个事实&#xff1a;随着 \(l, r\) 的增大&#xff0c;\(f(r) - f(l)\) 会越来越小。考虑暴力处理出小数据的情况&#xff0c;我们可以发现对于左端点 \(f(l) < 7\) 的情况下&#xff0c;右端点的最大限度为 \(\frac{10^8}{8} 10^7…

java分页查询_面试官:数据量很大,分页查询很慢,有什么优化方案?

准备工作一般分页查询使用子查询优化使用 id 限定优化使用临时表优化关于数据表的id说明《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与…

Python逐行读取文件内容

f open("foo.txt") # 返回一个文件对象 line f.readline() # 调用文件的 readline()方法 while line:print line, # 后面跟 , 将忽略换行符# print(line, end )   # 在 Python 3中使用line f.readline()f.close() 也…

原型模式精讲

原型模式是一种创建型模式,也是属于创建对象的一种方式,像西游记里面的孙悟空吹猴毛也属于原型模式,克隆出来了一群的猴子猴孙,还有细胞的分裂,spring中的Bean的生命周期好像有一个单例还有个原型&#xff0c;那个原型就是每次请求都复制一个对象出来,官方的定义是:用原型实例指…

Python中map()函数浅析

MapReduce的设计灵感来自于函数式编程&#xff0c;这里不打算提MapReduce&#xff0c;就拿python中的map()函数来学习一下。 文档中的介绍在这里&#xff1a; map(function, iterable, ...) Apply function to every item of iterable and return a list of the results. If ad…

选择与循环:剪刀石头布_Python之石头剪刀布小游戏(史上最详细步骤)

​嗨&#xff0c;各位好呀&#xff0c;我是真小凡。相信你如果是一个刚学习Python的小白&#xff0c;一定会很想做一个自己的Python小游戏&#xff08;我就是这样子的&#xff09;&#xff0c;那么今天我们就一起实操一下&#xff01;首先要清楚&#xff0c;做一个项目必须的流…