整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

7.1.2. 默认的Streaming作业

hadoop 花牛 8℃ 0评论

Streaming方式下,默认的作业与Java方式是相似的,但也有差别。最简单的形式如下:

% hadoop jar $HADOOP__INSTALL/contrib/streaming/hadoop-*-streaming.jar \
-input input/ncdc/sample.txt \
-output output \
-mapper /bin/cat

注意,必须提供一个mapper:默认的mapper不能工作。因为默认输入格式TextlnputFormat产生的是LongWritable类型的键和Text类型的值, 而Streaming的输出键和值(包括map的键和值)都是Text类型。indentity mapper无法将LongWritable类型的键转换为Text类型的键,因而导致无法使用。

如果我们开发一个非Java的mapper,输入的格式是TextlnputFormat, 那么Streaming会做一些特殊的处理。它并不会把键传递给mapper,而是 只传递值。对于其他输入类型,将stream.map.input.ignoreKey设亶为 true也可以达到相同的效果。这样做事实上是非常有用的,因为键只是文 件中的行偏移量,而值是行中的数据,这才是几乎所有应用都关心的内 容。这个作业的效果就是对输入的值进行排序。

将更多的默认设置写出来,那么命令行看起来如下所示(注意,Streaming使 用的是老版本MapReduce API类):

% hadoop jar $HADOOP_INSTALL/contrib/streaming/hadoop-*-streaming.jar \
-input input/ncdc/sample.txt \
-output output \
-inputformat org.apache.hadoop.mapred.TextInputFormat \
-mapper /bin/cat \
-partitioner org.apache.hadoop.mapred.lib.HashPartitioner \
-numBeduceTasks 1 \
-reducer org.apache.hadoop.mapred.lib.IdentityReducer \
-outputformat org.apache.hadoop.mapped.TextOutputFormat

mapper的参数和reducer的参数可以是一条命令或一个Java类。可以使 用-combiner参数按需设置combiner

Streaming中的键和值

Streaming应用可以决定分隔符的使用,该分隔符用于通过标准输入把键/值对转换为一串比特值发送到mapreduce函数。默认情况下是Tab(制表符),但是如果键或值中本身含有Tab分隔符,能将分隔符修改成其他符号 是很有用的。

类似地,当map和reduce输出结果键/值对时,也需要一个可配置的分隔符来进行分隔。更进一步,来自输出的键可以由多个字段进行组合:它可以由一条记录的前n个字段组成(由stream.num.map.output.key.fields 或 stream.nutn.reduce.output.key.Fields 进行定义),剩下的字段就是值。例如,一个Streaming处理的输出是“abc”(分隔符是逗号)n设为2,则键解释为“ab”,而值是“c”。

mapper和reducer的分隔符是单独配置的。这些属性可参见表7-3,数据流 图如图7-1所示。

表7-3. Streaming的分隔符属性

属性名称

类型

默认值

描述

stream.map.input.field.separator

String

\t

此分隔符用于将输入键/值字符串作为字节流传递到流map

stream.map.output.field.separator

String

\t

此分隔符用于把流map处理的输出分割成map输出需要的键/值字符串

stream.num.map.output.key.fields

int

1

由stream.map.output.field.separator分隔的字段数,这些字段作为map输出键

stream.reduce.input.field.separator

String

\t

此分隔符用于将输入键/值字符串作为字节流传递到流reduce

stream.reduce.output.field.separator

String

\t

此分隔符用于将来自流reduce处理的输出分割成reduce最终输出需要的键/值字符串

stream.num.reduce.output.key.fields

int

1

 stream.reduce.output.field.separator 分隔的字段数量,这些字段作为 reduce输出键

 

blob.png 

图7-1 在Streaming MapReduce作业中使用分隔符的位置

这些属性与输入和输出的格式无关。例如,如果stream.reduce. output.field.separator被设置成冒号,reduce Streaming过程就把a : b行写入标准输出,那么Streamingreducer就会知道a作为键,b作为值。如果使用标准的TextOutputFormat那么这条记录就用Tab将键和值分隔开并写到输出文件。可以设置mapred.textoutputformat.Separator来修改TextOutputFormat的分隔符。

Streaming的配置参数列表可以参阅 Hadoop 网站:http://hadoop.apache.org/docs/current/hadoop-streaming/HadoopStreaming.html#Specifying_Configuration_Variables_with_the_-D_Option


转载请注明:全栈大数据 » 7.1.2. 默认的Streaming作业

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址