设为首页 加入收藏

TOP

hadoop streaming 排序
2019-04-24 00:44:10 】 浏览:51
Tags:hadoop streaming 排序

一、基础:

首先明确一下两个基本概念:

Partition:分桶过程,用户输出的key经过partition分发到不同的reduce里,因而partitioner就是分桶器,一般用平台默认的hash分桶,也可以自己指定。
Key:是需要排序的字段,相同分桶&&相同key的行排序到一起。

在streaming模式默认hadoop会把map输出的一行中遇到的第一个设定的字段分隔符前面的部分作为key,后面的作为value,如果输出的一行中没有指定的字段分隔符,则整行作为key,value被设置为空字符串。其中默认的分隔符是‘\t'

若要改变默认设置,需要用如下参数进行设置:

stream.num.map.output.key.fields 设置map输出的前几个字段作为key
stream.map.output.field.separator 设置map输出的字段分隔符

demo:

bin/hadoop streaming -input /tmp/comp-test.txt -output /tmp/xx -mapper cat -reducer cat \

-jobconf stream.num.map.output.key.fields=2 \

-jobconf stream.map.output.field.separator=. \

-jobconf mapred.reduce.tasks=5

返回结果:

e.9 4.5

f.8 3.3

——————

d.1 5.23

e.5 1.23

e.5 1.45

e.5 9.22

——————

a.7 2.6

二、进阶

1、KeyFieldBasePartitioner的用法

如果想要灵活设置key中用于partition的字段,而不是把整个key都用来做partition。就需要使用hadoop中的org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner了。
下面只用第一列作partition,但依然使用前两列作为key。

demo:

bin/hadoop streaming -input /tmp/comp-test.txt -output /tmp/xx -mapper cat -reducer cat \

-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \

-jobconf stream.num.map.output.key.fields=2 \

-jobconf stream.map.output.field.separator=. \

-jobconf map.output.key.field.separator=. \

-jobconf num.key.fields.for.partition=1 \

-jobconf mapred.reduce.tasks=5

结果:

d.1 5.23

——————

e.5 1.23

e.5 1.45

e.5 9.22

e.9 4.5

——————

a.7 2.6

f.8 3.3

demo2:

bin/hadoop streaming -input /tmp/comp-test.txt -output /tmp/xx -mapper cat -reducer cat \

-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \

-jobconf stream.num.map.output.key.fields=3 \

-jobconf stream.map.output.field.separator=. \

-jobconf map.output.key.field.separator=. \

-jobconf mapred.text.key.partitioner.options=-k2,3 \

-jobconf mapred.reduce.tasks=5

结果:

e.9.4 5

——————

a.7.2 6

e.5.9 22

——————

d.1.5 23

e.5.1 23

e.5.1 45

f.8.3 3

可见,这次是以前3列作为key的,而partition则以key中的第2-3列,因此以“e”开头的行被拆散了,但第二三列相同的“5,1”被分到一个桶内。在同一个桶内,依然是从key的第一列开始排序的,注意,KeyFieldBasePartitioner只影响分桶并不影响排序。
mapred.text.key.partitioner.options 设置key内某个字段或者某个字段范围用做partition

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇hadoop 文件目录操作 下一篇《Hadoop技术内幕》--(1)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目