版权声明:本文为博主原创文章,未经博主允许不得转载
 
首先,先引出两点来展开下面的话题。
(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=2 \
-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架构设计与实现原理》

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

  1. WCF开发实战系列二:使用IIS发布WCF服务

    WCF开发实战系列二:使用IIS发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇中,我们创建了一个简单的WCF服务,在测试的时候,我们使用VS200 ...

  2. 【神经网络与深度学习】【python开发】caffe-windows使能python接口使用draw_net.py绘制网络结构图过程

    [神经网络与深度学习][python开发]caffe-windows使能python接口使用draw_net.py绘制网络结构图过程 标签:[神经网络与深度学习] [python开发] 主要是想用py ...

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

    1,python2 or python 区别, https://wiki.python.org/moin/Python2orPython3 python software foundation 2,p ...

  4. python开发_常用的python模块及安装方法

    adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctype ...

  5. Python开发 第01课 Python 简介

    一.Python 介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  6. 【开发者portal在线开发插件系列二】多条上下行消息(messageId的使用)【华为云技术分享】

    前言和基本操作请参考[开发者portal在线开发插件系列一]profile和基本上下行消息,此处不再复述,没操作过的小伙伴一定要先去看看哦~ 话不多说,开始今天的演(表)示(演) 场景说明: 假设一: ...

  7. Python学习笔记之二——Python的运行机制,一般人肯定不会

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:XX   Python解释器简介   解释器是一种让其他程序运行起来的程 ...

  8. 【Python开发】C和Python之间的接口实现

    作者:Jerry Jho 链接:https://www.zhihu.com/question/23003213/answer/56121859 ## 更新:关于ctypes,见拙作 聊聊Python ...

  9. python开发第二篇 :python基础

    python基础a.Python基础      -基础1. 第一句python       -python后缀名可以任意?     -导入模块时如果不是.py文件,以后的文件后缀名是.py.2.两种 ...

  10. Python开发篇——构建虚拟Python开发环境(Conda+Poetry)

    前言 之前虽略有提及Python,但是没有实际地写点料.惭愧,惭愧,所以这次先起个头,讲讲如何构建虚拟Python开发环境.相信之前看过我博客的人可能会想:博主不会又要聊聊Docker吧?放心,不会. ...

随机推荐

  1. [故障及解决]SoundPool没有声音

    问题描述:使用SoundPool类进行播放声音时,在手机上没有声音. 问题代码: /** * 声音播放 */ private void playSound() { SoundPool soundPoo ...

  2. Elasticsearch之kopf插件安装之后的浏览详解

    前提, Elasticsearch之插件介绍及安装 https://i.cnblogs.com/posts?categoryid=950999&page=2  (强烈建议,从头开始看) 比如, ...

  3. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 7 Regularization 正则化

    Lecture7 Regularization 正则化 7.1 过拟合问题 The Problem of Overfitting7.2 代价函数 Cost Function7.3 正则化线性回归  R ...

  4. Android输入法部分遮挡UI的问题(与EditText框相切)

    首先,我们来看看遇到问题的图片 遇到的问题是,当点击输入框之后,输入法会切到红线的位置,理想状态应该是在绿线位置 那么,是什么原因造成的呢? 问题其实很简单,是因为drawableleft图片比该输入 ...

  5. libevent 源码深度剖析十三

    libevent 源码深度剖析十三 —— libevent 信号处理注意点 前面讲到了 libevent 实现多线程的方法,然而在多线程的环境中注册信号事件,还是有一些情况需要小心处理,那就是不能在多 ...

  6. c++ 组合模式(composite)

    原文地址:http://www.cnblogs.com/jiese/p/3168844.html 当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用 ...

  7. Tensorflow CPU mask-rcnn 训练模型

    基于cpu版的tensorflow ,使用mask_rcnn训练识别箱子的模型 代码参考(https://blog.csdn.net/disiwei1012/article/details/79928 ...

  8. BT下载的原理 和疑问

    我心中有几个疑问,同时也搜索了点素材,肯能对理解问题有帮助. BT下载,即P2P下载,是一种不需要中心化服务器的下载,实现原理是,每个客户端在下载的时候也作为服务器. 我的疑问是,P2P各个节点是如何 ...

  9. 6.AND & OR 运算符

    AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤 AND 和 OR 运算符 AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来. 如果第一个条件和第二个条件都成立,则 A ...

  10. 2.Books

    Books示例说明了Qt中SQL类如何被Model/View框架使用,使用数据库中存储的信息,创建丰富的用户界面. 首先介绍使用SQL我们需要了解的类: 1.QSqlDatabase: QSqlDat ...