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

最新文章

  1. usb驱动开发24之接口驱动
  2. android知识杂记(二)
  3. td中绝对定位div的垂直居中问题
  4. nagios的nrpe的check_command配置优化
  5. Ubuntu下PHP的扩展
  6. iOS打印Debug日志的方式
  7. HDU 5044(2014 ACM-ICPC上海网络赛)
  8. 简单的LR核心项集和Goto表填充演示程序
  9. Android之Adapter用法总结
  10. quarze的工作原理
  11. C# 线程池的使用
  12. android 定时器总结
  13. hdu4825 01字典树+贪心
  14. 基于注解的SpringMVC添加其他的Servlet、Filter以及Listener
  15. Distance on the tree
  16. pytorch学习-AUTOGRAD: AUTOMATIC DIFFERENTIATION自动微分
  17. Centos7服务器中通过编译源码安装MySQL
  18. 面试汇总——知道什么是同源策略吗?那怎么解决跨域问题?知道 JSONP 原理吗?
  19. Word Ladder - LeetCode
  20. 网口扫盲三:以太网芯片MAC和PHY的关系(转)

热门文章

  1. lua 设置文件运行的环境
  2. SSH整合方案一(带有hibernate.cfg.xml)
  3. linux上安装mysql,tomcat,jdk
  4. Mysql宽字节注入(转)
  5. [C++]2-6 排列
  6. Android视频压缩
  7. 【Math for ML】解析几何(Analytic Geometry)
  8. openstack Q版部署-----nova服务配置-计算节点(6)
  9. 【MongoDB】 Failed to connect to 127.0.0.1:27017, reason: Connection refused
  10. 武汉倍特威视系统有限公司 --- 安全帽识别|烟火识别|智慧工地|BVS智能视频分析