Python开发MapReduce系列(二)Python实现MapReduce分桶

版权声明:本文为博主原创文章,未经博主允许不得转载

首先,先引出两点来展开下面的话题。

(1)map阶段的排序是在hash之后,写入磁盘之前进行。排序的两个关键字是partition(分区编号)和key。

(2)map结束后,并不是马上写到磁盘的,而是有个环形缓冲区,数据写到缓冲区中,默认溢出率是80%(这个值可以通过属性设置 io.sort.mb),每达到溢出条件就溢出生成一个小文件,直到全部数据写完,最后把所有的小文件合并成一个大文件,并写到磁盘中。这样做的目的是减少磁盘寻道时间,让每个map只输出一个文件,并为这个文件提供索引文件,记录下每个reduce对应数据的偏移量.(其实就是为map与reduce之间的分发建立映射关系)

1、默认情况介绍

在hadoop streaming的默认情况下,是以”\t”作为分隔符的。对于标准输入来说,以每行读取到的数据的第一个”\t”为分界线, 在其之前的部分为key,在其之后的为value。如果一个 "\t" 字符没有,则整行都被当做是key处理。

2、MapReduce shuffler过程中的sort和partition阶段

mapper阶段除了用户代码,最重要的是shuffle 过程,这个过程是MapReduce耗时和消耗资源的主要地方,因为其涉及到磁盘的写入等操作。这里先不谈优化方面的处理,只研究shuffle 过程中的sort和partition两个过程。为什么只研究这两个过程,因为,sort和partition是MapReduce的核心思想,整个过程就是在不断的重复 排列和分割 的操作。

从第1点可以知道,MapReduce的key默认是以 \t 分割得到的,我们能不能根据自己的需要来获取到特定形式的key?实现类似分桶、根据指定列的排序之类的自由排序呢?答案是可以的。我们可以通过以下的参数来实现:

3、相关的参数介绍

3.1map阶段

-jobconf mapred.reduce.tasks=2【此属性针对下面的例子都有效】

     map.output.key.field.separator:指定map输出<key,value>对之后,其中key内部的分割符。
     num.key.fields.for.partition:指定分桶时,按照分隔符切割后,用于分桶key所占的列数。
     -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner:前两个参数,要配合这个partitioner,没有的话会报错
例如:map.output.key.field.separator = ,
     num.key.fields.for.partition = 2
     -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner
一行数据:1 , 2 , 3 , 4 , 5(在这里1 2 之间的逗号是key内部的分隔符,并且1,2格式key的数据分为到同一桶)

     stream.map.output.field.separator: map中的key与value的分隔符
     stream.num.map.output.key.fields:指定map输出按照分隔符切割后,key所占有的列数,之前的是key,之后的是value
例如:map.output.key.field.separator = ,
     num.key.fields.for.partition = 2
     -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner
     stream.map.output.field.separator = :
     stream.num.map.output.key.fields = 3
     输入:1 , 2 , 3 , 4 , 5
          1 , 2 , 2 , 4 , 5
          1 , 3 , 4 , 4 , 5
          1 , 3 , 3 , 4 , 5

    输出part-00000:1 , 2 , 2 : 4 , 5
                   1 , 2 , 3 : 4 , 5

    输出part-00000:1 , 3 , 3 : 4 , 5
                   1 , 3 , 4 : 4 , 5
    1 , 2 是分桶值,1 , 2 , 3是key, 4 , 5是value。在这里1 2 之间的逗号是key内部的分隔符,1 , 2格式key的数据分为到同一桶

3.2 reduce阶段

stream.reduce.output.field.separator:reduce中key与value的分隔符
stream.num.reduce.output.key.fields:reduce中分隔符的位置

3、分桶测试

run.sh脚本(作为一个会偷懒的程序猿,能偷懒就偷懒,写个脚本省掉每次写入一大串指令的烦恼)

HADOOP_CMD="/home/hadoop/hadoop/bin/hadoop"
STREAM_JAR_PATH="/home/hadoop/hadoop/contrib/streaming/hadoop-streaming-1.2.1.jar"
INPUT_PATH_A="/a.txt"
INPUT_PATH_B="/b.txt"
OUTPUT_PATH="/output"
$HADOOP_CMD fs -rmr  $OUTPUT_PATH    #mapreduce在运行时,文件系统不能存在output目录(目录名字随意)

$HADOOP_CMD jar $STREAM_JAR_PATH     -input $INPUT_FILE_PATH_A,$INPUT_FILE_PATH_B    -output $OUTPUT_SORT_PATH     -mapper "python map.py"     -reducer "python red.py"     -file ./map.py     -file ./red.py     -jobconf mapred.reduce.tasks=2     -jobconf   map.output.key.field.separator=,     -jobconf num.key.fields.for.partition=1 \
    -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner     -jobconf   stream.map.output.field.separator=:     -jobconf stream.num.map.output.key.fields=3

a.txt内容

1,2,3:hadoop
1,2,1:hadoop
1,2,5:hadoop
1,3,4:hadoop
1,2,9:hadoop
1,2,11:hadoop
1,2,7:hadoop
1,3,15:hadoop
1,3,14:hadoop
1,2,19:hadoop

b.txt内容

1,2,0:java
1,2,2:java
1,2,8:java
1,3,4:java
1,2,2:java
1,2,14:java
1,2,12:java
1,3,1:java
1,3,5:java
1,2,3:java

4、结果输出

【part-00000】输出内容如下:

1,2,0:java
1,2,1:hadoop
1,2,2:java
1,2,2:java
1,2,3:hadoop
1,2,3:java
1,2,5:hadoop
1,2,7:hadoop
1,2,8:java
1,2,9:hadoop
1,2,11:hadoop
1,2,14:java
1,2,19:hadoop

【part-00001】输出内容如下:

1,3,1:java
1,3,4:hadoop
1,3,4:java
1,3,5:java
1,3,14:hadoop
1,3,15:hadoop

5、结果分析

由结果可以看出:

(1)以前2列为分桶标志,因为part-00000,part-00001分别以1,2和1,3开头。

(2)以前3列为key,并且第3列为分桶之后排序的key。

(3)key内部之间是以 , 分隔。

(4)key与value之间是以 : 分隔。

参考:

(1)《Hadoop技术内幕:深入解析MapReduce架构设计与实现原理》

时间: 2024-10-13 14:42:33

Python开发MapReduce系列(二)Python实现MapReduce分桶的相关文章

iOS开发UINavigation系列二——UINavigationItem

iOS开发UINavigation系列二--UINavigationItem 一.引言 UINavigationItem是导航栏上用于管理导航项的类,在上一篇博客中,我们知道导航栏是通过push与pop的堆栈操作来对item进行管理的,同样,每一个Item自身也有许多属性可供我们进行自定制.这篇博客,主要讨论UINavigationItem的使用方法. UINavigationBar:http://my.oschina.net/u/2340880/blog/527706. 二.来说说UINavi

python装饰器系列(二)

对python装饰器系列(一)的deco函数进行修改: 1 def deco(fn): 2 def wrap(): 3 print('ha ha ha') 4 print('call {0} funtion'.format(fn.__name__)) 5 fn() 6 return wrap 1 @deco 2 def myfun(): 3 print('call myfun') 1 myfun() 2 3 ha ha ha 4 call myfun funtion 5 call myfun m

python开发初期及二次开发C api

1,python2 or python 区别, https://wiki.python.org/moin/Python2orPython3 python software foundation 2,python 应用(最近Ruiy在搞openstack知道在openstack上有一个web框架(django)和openstack服务上的每一个组件的客户端都是由python写的) python C api https://docs.python.org/3/c-api/index.html pyt

转 《python开发_常用的python模块及安装方法》

http://www.cnblogs.com/hongten/p/hongten_python_more_modules.html adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctypes:用来调用动态链接库DBUtils:数据库连接池django:一个WEB frameworkdocutils:用来写文档的dpkt:数据包的解包和组包MySQLdb:

win7安装python开发环境,运行python

在win7上安装python的开发环境是非常简单的事情 Step1:下载python安装文件 url:https://www.python.org/download 去这里找到你想要下载的文件 Step2:安装 windows上当然是傻瓜式安装了,你还在纠结什么呢 Step3:配置环境变量 我的电脑-> 高级设置 -> 环境变量 ->path -> :python安装路径 Ok啦 进入命令行window+R输入python显示如下 C:\Users\YiXian>python

Python开发【十二章】:ORM sqlalchemy

一.对象映射关系(ORM) orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言 优点: 隐藏了数据访问细节,"封闭"的通用数据库交互,ORM的核心.他使

web多终端开发学习系列(二)--- 硬件交互框架Phonegap学习

目前对于移动端.桌面端的原生开发各平台都有各自的开发语言.开发工具等.如果要开发出一个适配多个终端的系统,我们需要用各自的平台工具分别开发出各自的应用,这对于一个团队或者一个开发人员来说要求非常高,并且非常耗时.前一篇学习了Bootstrap框架,对于多终端的界面适配有了解决方案.但一个系统除了与用户之间的交互外,其内部还可能需要与硬件进行交互来实现某些特殊需求,比如摄像头的调用,相册的获取等等.对于这些硬件的调用我们可以选择Phonegap. 介绍 Phonegap是一个适配多个终端进行硬件交

Python开发实战教程(8)-向网页提交获取数据

来这里找志同道合的小伙伴!↑↑↑ Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习Python这门语言. 本次课程是在掌握python基础之上进行的.基础没有学习的话建议先查看文章学习基础目录:Python开发实战系列教程-链接汇总,持续更新.进行学习. 最近几天感冒中,四肢乏力以及最近比较忙导致,更新较慢.还请见谅. 概述 很多时候我们需要给网

Windows搭建python开发环境,python入门到精通[一]

从大学开始玩python到现在参加工作,已经有5年了,现在的公司是一家.net的公司用到python的比较少,最近公司有新项目需要用到python,领导希望我来跟其他同事training,就有了这篇博客,打算将python的training弄成一个简易的python系列,供大家入门使用.Python语言自从20世纪90年代初诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程.今天就让我们来搭建一个python的开发环境,Windows搭建python开发环境.一切从"Hello world

快速搭建Python开发环境

快速搭建Python开发环境·Python入门学习速成系列<1> 当我们在学习一门新的技术或者新的编程语言时,经常感觉无从下手.学习初期往往不知道事先应该准备什么:或者刚开始准备,在安装问题就栽了一个大跟头:甚至我们准备完成后,开始学习是,才发现事先应该准备安装的软件没有到位等.这样或那样的问题就困扰我们学习之初,花费了大量的时间. 本文主要介绍在Windows和Linux主流操作系统上快速部署Python开发环境. 准备Python开发环境 在准备部署Python开发环境时,往往会选择不同的