Hadoop Streaming基本使用方法.docx
- 文档编号:8849555
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:12
- 大小:21.14KB
Hadoop Streaming基本使用方法.docx
《Hadoop Streaming基本使用方法.docx》由会员分享,可在线阅读,更多相关《Hadoop Streaming基本使用方法.docx(12页珍藏版)》请在冰豆网上搜索。
HadoopStreaming基本使用方法
HadoopStreaming
Hadoopstreaming是Hadoop的一个工具,它帮助用户创建和运行一类特殊的map/reduce作业,这些特殊的map/reduce作业是由一些可执行文件或脚本文件充当mapper或者reducer。
例如:
$HADOOP_HOME/bin/hadoopjar$HADOOP_HOME/hadoop-streaming.jar\
-inputmyInputDirs\
-outputmyOutputDir\
-mapper/bin/cat\
-reducer/bin/wc
Streaming工作原理
在上面的例子里,mapper和reducer都是可执行文件,它们从标准输入读入数据(一行一行读),并把计算结果发给标准输出。
Streaming工具会创建一个Map/Reduce作业,并把它发送给合适的集群,同时监视这个作业的整个执行过程。
如果一个可执行文件被用于mapper,则在mapper初始化时,每一个mapper任务会把这个可执行文件作为一个单独的进程启动。
mapper任务运行时,它把输入切分成行并把每一行提供给可执行文件进程的标准输入。
同时,mapper收集可执行文件进程标准输出的内容,并把收到的每一行内容转化成key/value对,作为mapper的输出。
默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。
如果没有tab,整行作为key值,value值为null。
不过,这可以定制,在下文中将会讨论如何自定义key和value的切分方式。
如果一个可执行文件被用于reducer,每个reducer任务会把这个可执行文件作为一个单独的进程启动。
Reducer任务运行时,它把输入切分成行并把每一行提供给可执行文件进程的标准输入。
同时,reducer收集可执行文件进程标准输出的内容,并把每一行内容转化成key/value对,作为reducer的输出。
默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。
在下文中将会讨论如何自定义key和value的切分方式。
这是Map/Reduce框架和streamingmapper/reducer之间的基本通信协议。
用户也可以使用java类作为mapper或者reducer。
上面的例子与这里的代码等价:
$HADOOP_HOME/bin/hadoopjar$HADOOP_HOME/hadoop-streaming.jar\
-inputmyInputDirs\
-outputmyOutputDir\
-mapperorg.apache.hadoop.mapred.lib.IdentityMapper\
-reducer/bin/wc
用户可以设定stream.non.zero.exit.is.failuretrue或false来表明streamingtask的返回值非零时是Failure还是Success。
默认情况,streamingtask返回非零时表示失败。
将文件打包到提交的作业中
任何可执行文件都可以被指定为mapper/reducer。
这些可执行文件不需要事先存放在集群上;如果在集群上还没有,则需要用-file选项让framework把可执行文件作为作业的一部分,一起打包提交。
例如:
$HADOOP_HOME/bin/hadoopjar$HADOOP_HOME/hadoop-streaming.jar\
-inputmyInputDirs\
-outputmyOutputDir\
-mappermyPythonScript.py\
-reducer/bin/wc\
-filemyPythonScript.py
上面的例子描述了一个用户把可执行python文件作为mapper。
其中的选项“-filemyPythonScirpt.py”使可执行python文件作为作业提交的一部分被上传到集群的机器上。
除了可执行文件外,其他mapper或reducer需要用到的辅助文件(比如字典,配置文件等)也可以用这种方式打包上传。
例如:
$HADOOP_HOME/bin/hadoopjar$HADOOP_HOME/hadoop-streaming.jar\
-inputmyInputDirs\
-outputmyOutputDir\
-mappermyPythonScript.py\
-reducer/bin/wc\
-filemyPythonScript.py\
-filemyDictionary.txt
Streaming选项与用法
只使用Mapper的作业
有时只需要map函数处理输入数据。
这时只需把mapred.reduce.tasks设置为零,Map/reduce框架就不会创建reducer任务,mapper任务的输出就是整个作业的最终输出。
为了做到向下兼容,HadoopStreaming也支持“-reduceNone”选项,它与“-jobconfmapred.reduce.tasks=0”等价。
为作业指定其他插件
和其他普通的Map/Reduce作业一样,用户可以为streaming作业指定其他插件:
-inputformatJavaClassName
-outputformatJavaClassName
-partitionerJavaClassName
-combinerJavaClassName
用于处理输入格式的类要能返回Text类型的key/value对。
如果不指定输入格式,则默认会使用TextInputFormat。
因为TextInputFormat得到的key值是LongWritable类型的(其实key值并不是输入文件中的内容,而是value偏移量),所以key会被丢弃,只把value用管道方式发给mapper。
用户提供的定义输出格式的类需要能够处理Text类型的key/value对。
如果不指定输出格式,则默认会使用TextOutputFormat类。
HadoopStreaming中的大文件和档案
任务使用-cacheFile和-cacheArchive选项在集群中分发文件和档案,选项的参数是用户已上传至HDFS的文件或档案的URI。
这些文件和档案在不同的作业间缓存。
用户可以通过fs.default.name.config配置参数的值得到文件所在的host和fs_port。
这个是使用-cacheFile选项的例子:
-cacheFilehdfs:
//host:
fs_port/user/testfile.txt#testlink
在上面的例子里,url中#后面的部分是建立在任务当前工作目录下的符号链接的名字。
这里的任务的当前工作目录下有一个“testlink”符号链接,它指向testfile.txt文件在本地的拷贝。
如果有多个文件,选项可以写成:
-cacheFilehdfs:
//host:
fs_port/user/testfile1.txt#testlink1-cacheFilehdfs:
//host:
fs_port/user/testfile2.txt#testlink2
-cacheArchive选项用于把jar文件拷贝到任务当前工作目录并自动把jar文件解压缩。
例如:
-cacheArchivehdfs:
//host:
fs_port/user/testfile.jar#testlink3
在上面的例子中,testlink3是当前工作目录下的符号链接,它指向testfile.jar解压后的目录。
下面是使用-cacheArchive选项的另一个例子。
其中,input.txt文件有两行内容,分别是两个文件的名字:
testlink/cache.txt和testlink/cache2.txt。
“testlink”是指向档案目录(jar文件解压后的目录)的符号链接,这个目录下有“cache.txt”和“cache2.txt”两个文件。
$HADOOP_HOME/bin/hadoopjar$HADOOP_HOME/hadoop-streaming.jar\
-input"/user/me/samples/cachefile/input.txt"\
-mapper"xargscat"\
-reducer"cat"\
-output"/user/me/samples/cachefile/out"\
-cacheArchive'hdfs:
//hadoop-\
-jobconfmapred.map.tasks=1\
-jobconfmapred.reduce.tasks=1\
-jobconfmapred.job.name="Experiment"
$lstest_jar/
cache.txtcache2.txt
$jarcvfcachedir.jar-Ctest_jar/.
addedmanifest
adding:
cache.txt(in=30)(out=29)(deflated3%)
adding:
cache2.txt(in=37)(out=35)(deflated5%)
$hadoopdfs-putcachedir.jarsamples/cachefile
$hadoopdfs-cat/user/me/samples/cachefile/input.txt
testlink/cache.txt
testlink/cache2.txt
$cattest_jar/cache.txt
Thisisjustthecachestring
$cattest_jar/cache2.txt
Thisisjustthesecondcachestring
$hadoopdfs-ls/user/me/samples/cachefile/out
Found1items
/user/me/samples/cachefile/out/part-00000
$hadoopdfs-cat/user/me/samples/cachefile/out/part-00000
Thisisjustthecachestring
Thisisjustthesecondcachestring
为作业指定附加配置参数
用户可以使用“-jobconf
例如:
$HADOOP_HOME/bin/hadoopjar$HADOOP_HOME/hadoop-streaming.jar\
-inputmyInputDirs\
-outputmyOutputDir\
-mapperorg.apache.hadoop.mapred.lib.IdentityMapper\
-reducer/bin/wc\
-jobconfmapred.reduce.tasks=2
上面的例子中,-jobconfmapred.reduce.tasks=2表明用两个reducer完成作业。
关于jobconf参数的更多细节可以参考:
hadoop-default.html
其他选项
Streaming作业的其他选项如下表:
选项可选/必须描述
-clustername可选在本地Hadoop集群与一个或多个远程集群间切换
-dfshost:
portorlocal可选覆盖作业的HDFS配置
-jthost:
portorlocal可选覆盖作业的JobTracker配置
-additionalconfspecspecfile可选用一个类似于hadoop-site.xml的XML文件保存所有配置,从而不需要用多个"-jobconfname=value"类型的选项单独为每个配置变量赋值
-cmdenvname=value可选传递环境变量给streaming命令
-cacheFilefileNameURI可选指定一个上传到HDFS的文件
-cacheArchivefileNameURI可选指定一个上传到HDFS的jar文件,这个jar文件会被自动解压缩到当前工作目录下
-inputreaderJavaClassName可选为了向下兼容:
指定一个recordreader类(而不是inputformat类)
-verbose可选详细输出
使用-cluster
默认情况下,使用hadoop-default.xml和hadoop-site.xml;当使用-cluster
下面的选项改变temp目录:
-jobconfdfs.data.dir=/tmp
下面的选项指定其他本地temp目录:
-jobconfmapred.local.dir=/tmp/local
-jobconfmapred.system.dir=/tmp/system
-jobconfmapred.temp.dir=/tmp/temp
更多有关jobconf的细节请参考:
http:
//wiki.apache.org/hadoop/JobConfFile
在streaming命令中设置环境变量:
-cmdenvEXAMPLE_DIR=/home/example/dictionaries/
其他例子
使用自定义的方法切分行来形成Key/Value对
之前已经提到,当Map/Reduce框架从mapper的标准输入读取一行时,它把这一行切分为key/value对。
在默认情况下,每行第一个tab符之前的部分作为key,之后的部分作为value(不包括tab符)。
但是,用户可以自定义,可以指定分隔符是其他字符而不是默认的tab符,或者指定在第n(n>=1)个分割符处分割而不是默认的第一个。
例如:
$HADOOP_HOME/bin/hadoopjar$HADOOP_HOME/hadoop-streaming.jar\
-inputmyInputDirs\
-outputmyOutputDir\
-mapperorg.apache.hadoop.mapred.lib.IdentityMapper\
-reducerorg.apache.hadoop.mapred.lib.IdentityReducer\
-jobconfstream.map.output.field.separator=.\
-jobconfstream.num.map.output.key.fields=4
在上面的例子,“-jobconfstream.map.output.field.separator=.”指定“.”作为map输出内容的分隔符,并且从在第四个“.”之前的部分作为key,之后的部分作为value(不包括这第四个“.”)。
如果一行中的“.”少于四个,则整行的内容作为key,value设为空的Text对象(就像这样创建了一个Text:
newText(""))。
同样,用户可以使用“-jobconfstream.reduce.output.field.separator=SEP”和“-jobconfstream.num.reduce.output.fields=NUM”来指定reduce输出的行中,第几个分隔符处分割key和value。
一个实用的Partitioner类(二次排序,-partitionerorg.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner选项)
Hadoop有一个工具类org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner,它在应用程序中很有用。
Map/reduce框架用这个类切分map的输出,切分是基于key值的前缀,而不是整个key。
例如:
$HADOOP_HOME/bin/hadoopjar$HADOOP_HOME/hadoop-streaming.jar\
-inputmyInputDirs\
-outputmyOutputDir\
-mapperorg.apache.hadoop.mapred.lib.IdentityMapper\
-reducerorg.apache.hadoop.mapred.lib.IdentityReducer\
-partitionerorg.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner\
-jobconfstream.map.output.field.separator=.\
-jobconfstream.num.map.output.key.fields=4\
-jobconfmap.output.key.field.separator=.\
-jobconfnum.key.fields.for.partition=2\
-jobconfmapred.reduce.tasks=12
其中,-jobconfstream.map.output.field.separator=.和-jobconfstream.num.map.output.key.fields=4是前文中的例子。
Streaming用这两个变量来得到mapper的key/value对。
上面的Map/Reduce作业中map输出的key一般是由“.”分割成的四块。
但是因为使用了-jobconfnum.key.fields.for.partition=2选项,所以Map/Reduce框架使用key的前两块来切分map的输出。
其中,-jobconfmap.output.key.field.separator=.指定了这次切分使用的key的分隔符。
这样可以保证在所有key/value对中,key值前两个块值相同的所有key被分到一组,分配给一个reducer。
这种高效的方法等价于指定前两块作为主键,后两块作为副键。
主键用于切分块,主键和副键的组合用于排序。
一个简单的示例如下:
Map的输出(key)
11.12.1.2
11.14.2.3
11.11.4.1
11.12.1.1
11.14.2.2
切分给3个reducer(前两块的值用于切分)
11.11.4.1
-----------
11.12.1.2
11.12.1.1
-----------
11.14.2.3
11.14.2.2
在每个切分后的组内排序(四个块的值都用于排序)
11.11.4.1
-----------
11.12.1.1
11.12.1.2
-----------
11.14.2.2
11.14.2.3
Hadoop聚合功能包的使用(-reduceaggregate选项)
Hadoop有一个工具包“Aggregate”(https:
//svn.apache.org/repos/asf/hadoop/core/trunk/src/java/org/apache/hadoop/mapred/lib/aggregate)。
“Aggregate”提供一个特殊的reducer类和一个特殊的combiner类,并且有一系列的“聚合器”(“aggregator”)(例如“sum”,“max”,“min”等)用于聚合一组value的序列。
用户可以使用Aggregate定义一个mapper插件类,这个类用于为mapper输入的每个key/value对产生“可聚合项”。
combiner/reducer利用适当的聚合器聚合这些可聚合项。
要使用Aggregate,只需指定“-reduceraggregate”:
$HADOOP_HOME/bin/hadoopjar$HADOOP_HOME/hadoop-streaming.jar\
-inputmyInputDirs\
-outputmyOutputDir\
-mappermyAggregatorForKeyCount.py\
-reduceraggregate\
-filemyAggregatorForKeyCount.py\
-jobconfmapred.reduce.tasks=12
python程序myAggregatorForKeyCount.py例子:
#!
/usr/bin/python
importsys;
defgenerateLongCountToken(id):
return"LongValueSum:
"+id+"\t"+"1"
defmain(argv):
line=sys.stdin.readline();
try:
whileline:
line=line[:
-1];
fields=line.split("\t");
printgenerateLongCountToken(fields[0]);
line=sys.stdin.readline();
except"endoffile":
returnNone
if__name__=="__main__":
main(sys.argv)
字段的选取(类似于unix中的'cut'命令)
Hadoop的工具类org.apache.hadoop.mapred.lib.FieldSelectionMapReduce帮助用户高效处理文本数据,就像unix中的“cut”工具。
工具类中的map函数把输入的key/value对看作字段的列表。
用户可以指定字段的分隔符(默认是tab),可以选择字段列表中任意一段(由列表中一个或多个字段组成)作为map输出的key或者value。
同样,工具类中的reduce函数也把输入的key/value对看作字段的列表,用户可以选取任意一段作为reduce输出的key或value。
例如:
$HADOOP_HOME/bin/hadoopjar$HADOOP_HOME/hadoop-streaming.jar\
-inputmyInputDirs\
-outputmyOutputDir\
-mapperorg.apache.hadoop.mapred.lib.FieldSelectionMapReduce\
-reducerorg.apache.hadoop.mapred.lib.FieldSelectionMapReduce\
-partitionerorg.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner\
-jobconfmap.output.key.field.separa=.\
-jobconfnum.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hadoop Streaming基本使用方法 Streaming 基本 使用方法