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 指定map的slot,reduce的slot
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的输出分隔符
1
以上是关于hadoop Streaming详解的主要内容,如果未能解决你的问题,请参考以下文章 大数据Hadoop Streaming编程实战之C++PhpPython |