大数据mapreduce全局排序top-N之python实现
a.txt、b.txt文件如下:
a.txt
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
hadoop
b.txt如下:
java
java
java
java
java
java
java
java
java
java
java
java
java
java
java
java
java
java
java
java
java
java
java
java
java
java
java
java
java
java
将a.txt、b.txt上传至hdfs文件 /mapreduce/allsort 内:
hadoop fs -put a.txt b.txt /mapreduce/allsort
实验一:第一种全局排序为,将数字列作为key,其余为value,设置一个reduce,利用shffer阶段,进行排序:(sgffer排序默认字符串排序,需要注意)
map.py代码如下:
#!usr/bin/python
import sys
base_count=9000000000
for line in sys.stdin:
ss=line.strip().split('\t')
key,val=ss
new_key=base_count-int(key)
print "%s\t%s"%(new_key,val)
red.py代码如下:
#!usr/bin/python
import sys
base_count=9000000000
for line in sys.stdin:
ss=line.strip().split()
key=9000000000-int(ss[0])
print "%s\t%s"%(key,ss[1])
run.sh代码如下:
HADOOP=/usr/local/src/hadoop-1.2.1/bin/hadoop
HADOOP_STREAMING=/usr/local/src/hadoop-1.2.1/contrib/streaming/hadoop-streaming-1.2.1.jar
INPUT_PATH=/mapreduce/allsort
OUT_PATH=/mapreduce/allsort/out
$HADOOP jar $HADOOP_STREAMING \
-input $INPUT_PATH \
-output $OUT_PATH \
-mapper "python map.py" \
-reducer "python red.py" \
-file "./map.py" \
-file "./red.py"
不设置reduce的运行个数,默认red.py的个数为1,结果输出为一个文件,且完成了倒排序;
实验二:设置3个reduce,每个ruduce内部完成排序,且3个reduce间也可以排序;思路:3个桶,60-40为0号桶、40-20为1号桶,20以下为3号桶,每个桶内部依赖shffer排序
map.py
#!usr/bin/python
import sys
base_count=9000000000
for line in sys.stdin:
ss=line.strip().split('\t')
key,val=ss
new_key=base_count-int(key)
if int(key)>=40:
print "%s\t%s\t%s"%("",new_key,val)
elif int(key)>=20:
print "%s\t%s\t%s"%("",new_key,val)
else:
print "%s\t%s\t%s"%("",new_key,val)
red.py
#!usr/bin/python
import sys
base_count=9000000000
for line in sys.stdin:
ss=line.strip().split()
key=base_count-int(ss[1])
print "%s\t%s"%(key,ss[2])
run.sh
HADOOP="/usr/local/src/hadoop-1.2.1/bin/hadoop"
HADOOP_STREAMING="/usr/local/src/hadoop-1.2.1/contrib/streaming/hadoop-streaming-1.2.1.jar"
INPUT_PATH="/mapreduce/allsort"
OUT_PATH="/mapreduce/allsort/out"
$HADOOP fs -rmr $OUT_PATH
$HADOOP jar $HADOOP_STREAMING \
-input $INPUT_PATH \
-output $OUT_PATH \
-mapper "python map.py" \
-reducer "python red.py" \
-file "./map.py" \
-file "./red.py" \
-jobconf "mapred.reduce.tasks=3" \
-jobconf "stream.num.map.output.key.fields=2" \#设置前2个为key
-jobconf "num.key.fields.for.partition=1" \ #设置第一个为partition
-partitioner "org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner"
实验三:通过参数调控实现全局排序:
数据如下:
aaa.txt
d.1.5.
e.9.4.
e.5.9.
e.5.1.
e.5.1.
a.7.2.
f.8.3.
目的:在streaming模式默认hadoop会把map输出的一行中遇到的第一个设定的字段分隔符前面的部分作为key,后面的作为 value,这里我们将map输出的前2个字段作为key,后面字段作为value,并且不使用hadoop默认的“\t”字段分隔符,而是根据该 文本特点使用“.”来分割
实现前3个字段为key排序,后面为value;
第2个和第三个字段为partition
run.sh如下:
HADOOP="/usr/local/src/hadoop-1.2.1/bin/hadoop"
HADOOP_STREAMING="/usr/local/src/hadoop-1.2.1/contrib/streaming/hadoop-streaming-1.2.1.jar"
INPUT_PATH="/mapreduce/allsort/aaa.txt"
OUT_PATH="/mapreduce/allsort/out"
$HADOOP fs -rmr $OUT_PATH
$HADOOP jar $HADOOP_STREAMING \
-input $INPUT_PATH \
-output $OUT_PATH \
-mapper "cat" \
-reducer "cat" \
-jobconf stream.num.map.output.key.fields= \
-jobconf stream.map.output.field.separator=. \
-jobconf map.output.key.field.separator=. \
-jobconf mapred.text.key.partitioner.options=-k2, \
-jobconf mapred.reduce.tasks= \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner
大数据mapreduce全局排序top-N之python实现的更多相关文章
- 三种方法实现Hadoop(MapReduce)全局排序(1)
我们可能会有些需求要求MapReduce的输出全局有序,这里说的有序是指Key全局有序.但是我们知道,MapReduce默认只是保证同一个分区内的Key是有序的,但是不保证全局有序.基于此,本文提供三 ...
- 我要进大厂之大数据MapReduce知识点(2)
01 我们一起学大数据 今天老刘分享的是MapReduce知识点的第二部分,在第一部分中基本把MapReduce的工作流程讲述清楚了,现在就是对MapReduce零零散散的知识点进行总结,这次的内容大 ...
- 我要进大厂之大数据MapReduce知识点(1)
01 我们一起学大数据 老刘今天分享的是大数据Hadoop框架中的分布式计算MapReduce模块,MapReduce知识点有很多,大家需要耐心看,用心记,这次先分享出MapReduce的第一部分.老 ...
- 大数据 --> MapReduce原理与设计思想
MapReduce原理与设计思想 简单解释 MapReduce 算法 一个有趣的例子:你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查并且数出有多少张是黑桃? MapReduce方法则是: 给在座 ...
- 大数据mapreduce俩表join之python实现
二次排序 在Hadoop中,默认情况下是按照key进行排序,如果要按照value进行排序怎么办?即:对于同一个key,reduce函数接收到的value list是按照value排序的.这种应用需求在 ...
- 大数据mapreduce二分法ip定位之Python实现
ip定位数据大约12M,采用-chacheFile 分发 文件来源https://pan.baidu.com/s/1J0pwTafHgt4T0k3vV_gC-A 格式大致格式如下: 0.0.0.0 0 ...
- 大数据MapReduce相关的运维题
1.在集群节点中/usr/hdp/2.4.3.0-227/hadoop-mapreduce/目录下,存在一个案例 JAR 包 hadoop-mapreduce-examples.jar.运行 JAR ...
- 一起学Hadoop——TotalOrderPartitioner类实现全局排序
Hadoop排序,从大的范围来说有两种排序,一种是按照key排序,一种是按照value排序.如果按照value排序,只需在map函数中将key和value对调,然后在reduce函数中在对调回去.从小 ...
- 大数据学习day24-------spark07-----1. sortBy是Transformation算子,为什么会触发Action 2. SparkSQL 3. DataFrame的创建 4. DSL风格API语法 5 两种风格(SQL、DSL)计算workcount案例
1. sortBy是Transformation算子,为什么会触发Action sortBy需要对数据进行全局排序,其需要用到RangePartitioner,而在创建RangePartitioner ...
随机推荐
- None.js 第六步 Stream(流)
输出流 var fs = require("fs"); var data = ''; // 创建可读流 var readerStream = fs.createReadStream ...
- 【bzoj 1143】[CTSC2008]祭祀river
Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成 ...
- Coursera, Big Data 1, Introduction (week 1/2)
Status: week 2 done. Week 1, 主要讲了大数据的的来源 - 机器产生的数据,人产生的数据(比如社交软件上的update, 一般是unstructed data), 组织产生的 ...
- Python文件打包成exe
1. 安装pyinstaller pip install pyinstaller 2.如果有外部依赖包 将外部依赖包放到你的python安装的site-packages D:\Python27\Lib ...
- new、override关键字
1.如果我想彻底覆盖父类的方法,此时可以使用override .假有classB继承自classA,代码如下: public class B : A { public bool _flag; publ ...
- ECLIPSE最常用快捷键排名
快捷键应该是节省时间的一个要素 ,所以自己在网上找了下面这些快捷键, 以便让更多的程序员更快捷的使用Eclipse. ECLIPSE最常用快捷键排名 1. Alt + / 自动完成 2. Ctrl + ...
- require/exports 与 import/export 的区别?
文章作者:寸志链接:https://www.zhihu.com/question/56820346/answer/150724784来源:知乎 遵循的模块化规范不一样 模块化规范:即为 JavaScr ...
- mysql 架构 ~ 异地多活
一 业务异地多活 二 核心思想 多机房提供就近服务,只有当本地机房出现问题时,才会被允许异地机房进行查询和事务操作三 数据库角度 1 多机房之间需要进行数据同步,保证每个机房都保留多机房的全部副本 ...
- Struts2-052 漏洞复现
s2-052漏洞复现 参考链接: http://www.freebuf.com/vuls/147017.html http://www.freebuf.com/vuls/146718.html 漏洞描 ...
- TCP通信实现对接硬件发送与接收十六进制数据 & int与byte的转换原理 & java中正负数的表示
今天收到的一份需求任务是对接硬件,TCP通信,并给出通信端口与数据包格式,如下: 1.首先编写了一个简单的十六进制转byte[]数组与byte[]转换16进制字符串的两个方法,如下: /** * 将十 ...