分享

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

pig2 发表于 2014-7-2 16:25:39 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 16 61003
问题导读:

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





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));

}

}

}

我们知道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

还是



我们在做填空题,框架之外的我们还没有看到,所以我需要明白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
chajian.png
hadoop-common-2.2.0-bin-master.zip (273.06 KB, 下载次数: 27, 售价: 2 云币)

已有(16)人评论

跳转到指定楼层
Landau 发表于 2014-7-2 16:34:18
好好好好好好好好好好好
回复

使用道具 举报

梦回三国 发表于 2014-9-19 21:41:42
为什么我的单机伪分布模式下在Eclipse中运行main函数,只有运行结果,有关hadoop的信息都没有呢,更别提counter的值了,请问怎么设置啊?
回复

使用道具 举报

pig2 发表于 2014-9-19 21:47:10
梦回三国 发表于 2014-9-19 21:41
为什么我的单机伪分布模式下在Eclipse中运行main函数,只有运行结果,有关hadoop的信息都没有呢,更别提cou ...

把这句话加到reduce  
org.apache.hadoop.mapreduce.Counter count1= ctx.getCounter("reduce中的初始化值测试");


回复

使用道具 举报

梦回三国 发表于 2014-9-19 22:44:50
pig2 发表于 2014-9-19 21:47
把这句话加到reduce  
org.apache.hadoop.mapreduce.Counter count1= ctx.getCounter("reduce中的初始化 ...

我加了,没有输出,我是这么加的 ctx.getCounter("reduce中的初始化").increment(1).这样也可以吧,我的eclipse好像直接不输出hadoop的处理过程,什么的。 是不是应该配置log4j啊,怎么配置呢,网上找的一些,输出的是一些看不懂的东西,不过也没有counter的值。
回复

使用道具 举报

admin 发表于 2014-9-19 23:25:38
梦回三国 发表于 2014-9-19 22:44
我加了,没有输出,我是这么加的 ctx.getCounter("reduce中的初始化").increment(1).这样也可以吧,我的e ...

它这个遗漏了,你的没有报错吗?
这样加进去:
org.apache.hadoop.mapreduce.Counter count1= ctx.getCounter("reduce中的值", “”);
回复

使用道具 举报

梦回三国 发表于 2014-9-21 18:25:42
admin 发表于 2014-9-19 23:25
它这个遗漏了,你的没有报错吗?
这样加进去:
org.apache.hadoop.mapreduce.Counter count1= ctx.getC ...

我的方法也是这样,没问题,就是控制台不输出任何关于hadoop的信息,counter的信息不输出也应该是正常的,我想知道怎么配置让eclipse控制台输出hadoop工作的信息呢,比如map完成了多少,reduce完成了多少等。期待大神指导。
回复

使用道具 举报

howtodown 发表于 2014-9-21 18:30:54
梦回三国 发表于 2014-9-21 18:25
我的方法也是这样,没问题,就是控制台不输出任何关于hadoop的信息,counter的信息不输出也应该是正常的 ...

默认都是有的,你是不是做了什么特殊的改变。

回复

使用道具 举报

梦回三国 发表于 2014-9-21 22:21:05
howtodown 发表于 2014-9-21 18:30
默认都是有的,你是不是做了什么特殊的改变。

啊,默认就有吗?我没改变什么啊,我是自己搭的单机集群,然后在集群主机系统上的eclipse中直接开发的。
回复

使用道具 举报

pig2 发表于 2014-9-21 23:21:29
梦回三国 发表于 2014-9-21 22:21
啊,默认就有吗?我没改变什么啊,我是自己搭的单机集群,然后在集群主机系统上的eclipse中直接开发的。
...
把这个程序放到你的eclipse里,如果还不输出,说明就是环境的问题了。新手指导,该如何在开发环境中,创建mapreduce程序
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条