hadoop Streaming详解

Posted 毫末之木

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hadoop Streaming详解相关的知识,希望对你有一定的参考价值。

一: Hadoop Streaming详解

1、Streaming的作用

Hadoop Streaming框架,最大的好处是,让任何语言编写的map, reduce程序能够在hadoop集群上运行;map/reduce程序只要遵循从标准输入stdin读,写出到标准输出stdout即可

其次,容易进行单机调试,通过管道前后相接的方式就可以模拟streaming, 在本地完成map/reduce程序的调试

# cat inputfile | mapper | sort | reducer > output

最后,streaming框架还提供了作业提交时的丰富参数控制,直接通过streaming参数,而不需要使用java语言修改;很多mapreduce的高阶功能,都可以通过steaming参数的调整来完成

 

 2、Streaming的局限

Streaming默认只能处理文本数据Textfile,对于二进制数据,比较好的方法是将二进制的key, value进行base64编码,转化为文本

Mapper和reducer的前后都要进行标准输入和标准输出的转化,涉及数据拷贝和解析,带来了一定的开销

 

3、Streaming命令的相关参数    (普通选项、streaming选项)

Streaming命令的形式如下:

#  /usr/local/src/hadoop-1.2.1/bin/hadoop jar  hadoop-streaming.jar \

   [普通选项]  [Streaming选项]         #  注意:普通选项一定要写在streaming选项前面

 

普通选项

参数

可选/必选

解释

-conf  配置文件

可选

指定一个应用程序配置文件

-fs  host:port or local

可选

指定一个namenode

-jt   host:port  or local

可选

指定一个jobtracker

-files 文件1,文件2,

 

-files  hdfs://192.168.179.100:9000/file1.txt,

hdfs://192.168.179.100:9000/file2.txt

 

将代替-cacheFile选项

可选

类似-file, 不同的

1)将HDFS中的多个文件进行分发

 

2)文件已经位于HDFS上

 

3)框架会在该作业attemps目录内创建一个符号链接,指向该作业的jar目录(放置所有分发文件)

-archives

 

框架会在作业的attempt目录创建符号链接,指向作业的jar目录,jar目录中才是分发到本地的压缩文件

 

-archives hdfs://host:fs_port/user/testfile.tgz#tgzdir

testfile.tgz是用户上传到HDFS的打包压缩文件

#后的tgzdir是别名,hadoop-1.2.1中必须要别名

可选

逗号分隔的多个压缩文件,已经位于HDFS上

 

框架自动分发压缩文件到计算节点,并且Inputformat会自动进行解压

-D   property=value

可选

重点,很多属性通过-D指定

 

插曲1: mapred-site.xml 指定mapslotreduceslot

Map和reduce在datanode上的运行,会受到slot的限制,并且有各自的slot限制; 每个Datanode读取相应的配置文件, 从而确定每个datanode上能运行的最大map,reduce个数,以及节点能力是否充分发挥

Hadoop1.0中,slot在mapred-site.xml中配置(mapreduce作业前配置好), 基本上每个slot在运行1个map, reduce作业后会占用1个CPU core,   最激进的做法是设置map和reduce的slot都是CPU core-1 (Map执行完后才会进行reduce),  预留1个CPU core给tasktracker(比如上报心跳等),  但通常reducer的slot要比reducer少,考虑大多数情况下mapper要比reducer多

默认map的slot为2,reduce的slot也为2

<configuration>

        <property>

                <name>mapred.job.tracker</name>

                <value>http://192.168.179.100:9001</value>

        </property>

        <property>

               <name>mapred.tasktracker.map.tasks.maximum</name>

               <value>15</value>

        </property>

        <property>

               <name>mapreduce.tasktracker.tasks.reduce.maximum</name>

               <value>10</value>

        </property>

</configuration>

 

插曲二: mapred-site.xml 指定map最终输出的merge文件的存放路径

<configuration>

        <property>

                <name>mapred.job.tracker</name>

                <value>http://192.168.179.100:9001</value>

        </property>

        <property>

               <name>mapred.local.dir</name>

               <value>/usr/loca/src/hadoop-1.2.1/tmp/mapoutput</value>

        </property>

</configuration>

 

当1个作业被提交并在tasktracer的管理下开始运行时,会对每个job创建1个目录,所有分发的文件,都放置在这里

${mapred.local.dir}/taskTracker/$user/jobcache/$jobid/jars/

 

普通选项中的-D  property=value
-D    普通选项,使用最多的高级参数,替代-jobconf(参数将被废弃),需要注意的是 -D选项要放在streaming参数的前面,一般我会放在参数的开头

类别




 

指定目录

-D  dfs.data.dir=/tmp

修改本地临时目录


-D  mapred.local.dir=/tmp/local

-D  mapred.system.dir=/tmp/system

-D  mapred.tmp.dir=/tmp/tmp

指定额外的本地临时目录


指定作业名

-D  mapred.job.name=”Test001”



指定只有map的作业

-D  mapred.reduce.tasks=0

该作业只有mapper, mapper的输出直接作为作业的输出


指定reducer个数

-D  mapred.reduce.tasks=2



指定mapper个数

-D  mapred.map.tasks=2

指定了不一定生效输入文件为压缩文件时,mapper和压缩文件个数一一对应,

输入数据为压缩文件时,mapper和文件个数一一对应,比较好的控制Mapper数量的方法

指定Mapper输出的key,value分隔符

-D stream.map.output.field.separator=.

-D stream.num.map.output.key.fields=4

Mapper的输出使用.做分割符,并且第4个.之前的部分作为key, 剩余的部分作为value (包含剩余的.)

如果mapper的输出没有4个., 则整体一行作为key, value为空

默认:

使用

\t做分隔符,第1个\t之前的部分作为key, 剩余为value, 如果mapper输出没有\t,则整体一行作为key,value为空

指定reducer输出的value, key分隔符

-D stream.reduce.output.field.seperator=.

-D stream.num.reduce.output.key.fields=4

指定reduce输出根据.分割,直到第4个.之前的内容为key,其他为value

Reducer程序要根据指定进行key,value的构造

不常用

-D stream.map.input.field.seperator

Inputformat如何分行,默认\n


不常用

-D stream.reduce.input.field.seperator



作业优先级

-D  mapred.job.priority=HIGH

VERY_LOW, LOW, NORMAL, HIGH, VERY_HIGH


最多同时运行的map任务数

-D mapred.job.map.capacity=5



最多同时运行的reduce任务数

-D mapred.job.reduce.capacity=3



Task没有响应(输入输出)的最大时间

-D mapred.task.timeout=6000

毫秒

超时后,该task被终止

Map的输出是否压缩

-D mapred.compress.map.output=True



Map的输出的压缩方式

-D mapred.map.output.comression.codec=



Reduce的输出是否压缩

-D mapred.output.compress=True



Reducer的输出的压缩方式

-D mapred.output.compression.codec=



 

-D 指定job名称
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \-D mapred.job.name=”Test001”
-D 指定reduce任务、map任务个数
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \

-D mapred.job.name=”Teset001”
-D mapred.reduce.tasks=2    # reduce task个数,一定生效
-D mapred.map.tasks=5       # map task个数,不一定生效
-D 指定mapper的输出分隔符

(c)2006-2024 SYSTEM All Rights Reserved IT常识