[置顶] Hadoop 实战之Streaming(一)

Hadoop 的Streaming

1、概述

Hadoop Streaming是Hadoop提供的一个编程工具,它允许用户使用任何可执行文件或者脚本文件作为Mapper和Reducer,例如:

采用shell脚本语言中的一些命令作为mapper和reducer(cat作为mapper,wc作为reducer)

$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \

-input myInputDirs \

-output myOutputDir \

-mapper cat \

-reducer wc

2、Hadoop Streaming原理

mapper和reducer会从标准输入中读取用户数据,一行一行处理后发送给标准输出。Streaming工具会创建MapReduce作业,发送给各个tasktracker,同时监控整个作业的执行过程。

如果一个文件(可执行或者脚本)作为mapper,mapper初始化时,每一个mapper任务会把该文件作为一个单独进程启动,mapper任务运行时,它把输入切分成行并把每一行提供给可执行文件进程的标准输入。 同时,mapper收集可执行文件进程标准输出的内容,并把收到的每一行内容转化成key/value对,作为mapper的输出。 默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。如果没有tab,整行作为key值,value值为null。

对于reducer,类似。

以上是Map/Reduce框架和streaming mapper/reducer之间的基本通信协议。

3、Hadoop Streaming用法

Usage: $HADOOP_HOME/bin/hadoop jar \

$HADOOP_HOME/hadoop-streaming.jar [options]

options:

(1)-input:输入文件路径

(2)-output:输出文件路径

(3)-mapper:用户自己写的mapper程序,可以是可执行文件或者脚本

(4)-reducer:用户自己写的reducer程序,可以是可执行文件或者脚本

(5)-file:打包文件到提交的作业中,可以是mapper或者reducer要用的输入文件,如配置文件,字典等。

(6)-partitioner:用户自定义的partitioner程序

(7)-combiner:用户自定义的combiner程序(必须用java实现)

(8)-D:作业的一些属性(以前用的是-jonconf),具体有:

             1)mapred.map.tasks:map task数目
             2)mapred.reduce.tasks:reduce task数目
             3)stream.map.input.field.separator/stream.map.output.field.separator: map task输入/输出数
据的分隔符,默认均为\t。
             4)stream.num.map.output.key.fields:指定map task输出记录中key所占的域数目
             5)stream.reduce.input.field.separator/stream.reduce.output.field.separator:reduce task输入/输出数据的分隔符,默认均为\t。
             6)stream.num.reduce.output.key.fields:指定reduce task输出记录中key所占的域数目
另外,Hadoop本身还自带一些好用的Mapper和Reducer:
(1)    Hadoop聚集功能

Aggregate提供一个特殊的reducer类和一个特殊的combiner类,并且有一系列的“聚合器”(例如“sum”,“max”,“min”等)用于聚合一组value的序列。用户可以使用Aggregate定义一个mapper插件类,这个类用于为mapper输入的每个key/value对产生“可聚合项”。Combiner/reducer利用适当的聚合器聚合这些可聚合项。要使用Aggregate,只需指定“-reducer aggregate”。

(2)字段的选取(类似于Unix中的‘cut’)

Hadoop的工具类org.apache.hadoop.mapred.lib.FieldSelectionMapReduc帮助用户高效处理文本数据,就像unix中的“cut”工具。工具类中的map函数把输入的key/value对看作字段的列表。 用户可以指定字段的分隔符(默认是tab),可以选择字段列表中任意一段(由列表中一个或多个字段组成)作为map输出的key或者value。 同样,工具类中的reduce函数也把输入的key/value对看作字段的列表,用户可以选取任意一段作为reduce输出的key或value。

4、Mapper和Reducer实现

本节试图用尽可能多的语言编写Mapper和Reducer,包括Java,C,C++,Shell脚本,python等。

由于Hadoop会自动解析数据文件到Mapper或者Reducer的标准输入中,以供它们读取使用,所有应先了解各个语言获取标准输入的方法。

环境:Vmware 8.0 和ubuntu11.04

Hadoop 实战之Streaming(一)---通过Unix命令使用Streaming

第一步: 首先在/home/tanglg1987目录下新建一个start.sh脚本文件,每次启动虚拟机都要删除/tmp目录下的全部文件,重新格式化namenode,代码如下:
sudo rm -rf /tmp/*
rm -rf /home/tanglg1987/hadoop-0.20.2/logs
hadoop namenode -format
hadoop datanode -format
start-all.sh
hadoop fs -mkdir input 
hadoop dfsadmin -safemode leave

第二步:给start.sh增加执行权限并启动hadoop伪分布式集群,代码如下:

chmod 777 /home/tanglg1987/start.sh
./start.sh 

执行过程如下:

[置顶] Hadoop 实战之Streaming(一)_第1张图片

第三步:编写一个名为:list-4-1.sh的shell脚本

$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-0.20.2-streaming.jar \
    -input input/cite75_99.txt \
    -output output \
    -mapper 'cut -f 2 -d ,' \
   -reducer  'uniq'

第四步:给list-4-1.sh增加执行权限并启动脚本,代码如下:

chmod 777 /home/tanglg1987/list-4-1.sh
./list-4-1.sh

第五步:Run On Hadoop,运行过程如下:

tanglg1987@tanglg1987:~/test/streaming$ ./list-4-1.sh
packageJobJar: [/tmp/hadoop-tanglg1987/hadoop-unjar6010847675622454264/] [] /tmp/streamjob1903205486478029700.jar tmpDir=null
12/10/19 21:07:00 INFO mapred.FileInputFormat: Total input paths to process : 1
12/10/19 21:07:00 INFO streaming.StreamJob: getLocalDirs(): [/tmp/hadoop-tanglg1987/mapred/local]
12/10/19 21:07:00 INFO streaming.StreamJob: Running job: job_201210192029_0004
12/10/19 21:07:00 INFO streaming.StreamJob: To kill this job, run:
12/10/19 21:07:00 INFO streaming.StreamJob: /home/tanglg1987/hadoop-0.20.2/bin/../bin/hadoop job  -Dmapred.job.tracker=localhost:9101 -kill job_201210192029_0004
12/10/19 21:07:00 INFO streaming.StreamJob: Tracking URL: http://localhost:50030/jobdetails.jsp?jobid=job_201210192029_0004
12/10/19 21:07:01 INFO streaming.StreamJob:  map 0%  reduce 0%
12/10/19 21:07:16 INFO streaming.StreamJob:  map 7%  reduce 0%
12/10/19 21:07:19 INFO streaming.StreamJob:  map 10%  reduce 0%
12/10/19 21:07:22 INFO streaming.StreamJob:  map 15%  reduce 0%
12/10/19 21:07:25 INFO streaming.StreamJob:  map 19%  reduce 0%
12/10/19 21:07:28 INFO streaming.StreamJob:  map 23%  reduce 0%
12/10/19 21:07:31 INFO streaming.StreamJob:  map 26%  reduce 0%
12/10/19 21:07:34 INFO streaming.StreamJob:  map 29%  reduce 0%
12/10/19 21:07:37 INFO streaming.StreamJob:  map 33%  reduce 0%
12/10/19 21:07:40 INFO streaming.StreamJob:  map 36%  reduce 0%
12/10/19 21:07:43 INFO streaming.StreamJob:  map 40%  reduce 0%
12/10/19 21:07:46 INFO streaming.StreamJob:  map 45%  reduce 0%
12/10/19 21:07:49 INFO streaming.StreamJob:  map 48%  reduce 0%
12/10/19 21:07:52 INFO streaming.StreamJob:  map 50%  reduce 0%
12/10/19 21:08:19 INFO streaming.StreamJob:  map 58%  reduce 0%
12/10/19 21:08:22 INFO streaming.StreamJob:  map 58%  reduce 17%
12/10/19 21:08:25 INFO streaming.StreamJob:  map 63%  reduce 17%
12/10/19 21:08:28 INFO streaming.StreamJob:  map 67%  reduce 17%
12/10/19 21:08:31 INFO streaming.StreamJob:  map 71%  reduce 17%
12/10/19 21:08:34 INFO streaming.StreamJob:  map 74%  reduce 17%
12/10/19 21:08:37 INFO streaming.StreamJob:  map 77%  reduce 17%
12/10/19 21:08:40 INFO streaming.StreamJob:  map 81%  reduce 17%
12/10/19 21:08:43 INFO streaming.StreamJob:  map 84%  reduce 17%
12/10/19 21:08:46 INFO streaming.StreamJob:  map 88%  reduce 17%
12/10/19 21:08:49 INFO streaming.StreamJob:  map 91%  reduce 17%
12/10/19 21:08:52 INFO streaming.StreamJob:  map 95%  reduce 17%
12/10/19 21:08:55 INFO streaming.StreamJob:  map 97%  reduce 17%
12/10/19 21:08:58 INFO streaming.StreamJob:  map 99%  reduce 17%
12/10/19 21:09:02 INFO streaming.StreamJob:  map 100%  reduce 17%
12/10/19 21:09:25 INFO streaming.StreamJob:  map 100%  reduce 33%
12/10/19 21:09:28 INFO streaming.StreamJob:  map 100%  reduce 70%
12/10/19 21:09:31 INFO streaming.StreamJob:  map 100%  reduce 73%
12/10/19 21:09:34 INFO streaming.StreamJob:  map 100%  reduce 79%
12/10/19 21:09:37 INFO streaming.StreamJob:  map 100%  reduce 84%
12/10/19 21:09:40 INFO streaming.StreamJob:  map 100%  reduce 90%
12/10/19 21:09:43 INFO streaming.StreamJob:  map 100%  reduce 95%
12/10/19 21:09:49 INFO streaming.StreamJob:  map 100%  reduce 100%
12/10/19 21:09:55 INFO streaming.StreamJob: Job complete: job_201210192029_0004
12/10/19 21:09:55 INFO streaming.StreamJob: Output: output

第六步:查看结果集,运行结果如下:

[置顶] Hadoop 实战之Streaming(一)_第2张图片

你可能感兴趣的:([置顶] Hadoop 实战之Streaming(一))