zoukankan      html  css  js  c++  java
  • Hadoop-2.4.1学习之Streaming编程

           在之前的文章曾提到Hadoop不仅支持用Java编写的job,也支持其他语言编写的作业,比方Hadoop Streaming(shell、python)和Hadoop Pipes(c++),本篇文章将学习Hadoop Streaming编程。

    Streaming是hadoop自带的工具,封装在hadoop-streaming-版本.jar中,能够使用hadoop jar hadoop-streaming-版本.jar命令启动,在该命令中还须要指定mapper或/和reducer。当中mapper和reducer任务既能够是java类,也能够是可运行文件(如cat)或脚本文件(如python)。

    该工具将创建MapReduce作业。将作业提交给集群处理并监控作业的运行进度等,以下分析一下Streaming的运行过程。

          当可运行文件做为mapper或者reducer时,每一个mapper任务或者reducer任务在mapper或者reducer初始化后将可运行文件做为独立的进程载入运行。

    当mapper任务运行时。它将输入转换为行然后把这些行传递给该进程的标准输入stdin,同一时候mapper收集从该进程的标准输出stdout产生的行并将每行转换为键值对。这些键值对将做为该mapper的输出。默认的情况下,一行的開始部分到第一个tab符为键,剩余的部分(不包括tab符)为值。假设某行不存在tab符,则整个行将做为键,而值为null。

    但可通过使用-inputformat命令行选项自己定义键值分隔符。当reducer任务运行时,它将输入的键值对转换为行,然后传递给该进程的标准输入stdin,同一时候reducer任务收集该进程标准输出stdout的输出。并转换为键值对,这些键值对将做为reducer任务的输出。同mapper任务一样,默认使用tab符分隔键值对,用户能够使用-outputformat自己定义分隔符。

          通过上面的描写叙述可知,mapper和reducer的的输出都为键值对。输入都为从对应进程的stdin输入的行,不同的是mapper是将输入数据转换为行,reducer是将mapper输出的键值对转换为行。

          能够通过指定stream.non.zero.exit.is.failure的值为true或false表示streaming任务退出时状态码的含义,假设为true则非0值表示失败。若为false则非0表示成功,默认情况下。streaming任务退出时的状态码非0表示任务失败。接下来看看streaming工具的语法格式。用户能够通过在命令行输入hadoop jar hadoop-streaming-2.4.1.jar –help获取该工具的具体使用方法,例如以下表所看到的:

    參数

    可选/必选

    说明

    -input

    必选

    Map阶段输入文件的路径

    -output

    必选

    Reduce阶段的输出文件夹

    -mapper

    可选

    可运行文件或者Java类,做为mapper。默觉得PipeMapper

    -reducer

    可选

    可运行文件或者Java类,做为reducer。

    默觉得PipeReducer

    -combiner

    可选

    可运行文件或者Java类,做为combiner。默觉得PipeCombiner

    -partitioner

    可选

    做为partitioner的Java类

    -inputformat

    可选

    指定输入格式的Java类,默觉得TextInputFormat,还能够为SequenceFileAsTextInputFormat或者自己定义输入格式的Java类

    -outputformat

    可选

    指定输出格式的Java类,默觉得TextOutputFormat,也能够为自己定义输出格式的Java类

    -file

    可选

    指定了作业使用的文件,将被复制到集群中。推荐使用通用选项-files选线替代该选项

    -numnumReduceTasks

    可选

    指定reducer的数量

    -inputreader

    可选

    指定读取记录的reader类

    -cmdenv

    可选

    <n>=<v>,像streaming传递环境变量

    -mapdebug

    可选

    指定了map任务失败时运行的脚本

    -reducedebug

    可选

    指定了reduce任务失败时运行的脚本

    -lazyOutput

    可选

    延迟创建输出,比如假设输出为TextOutputFormat。输出文件仅在第一次调用Context.write时创建

    -background

    可选

    提交作业后马上返回,不等待作业完毕

    -verbose

    可选

    打印作业的运行情况

    -info

    可选

    打印具体的使用方式

          除了上表所述的专门用于streaming的选项外,在使用streaming工具时还能够指定通用选项。但须要确保通用选项位于streaming选项之前。否则将导致失败。

    通用选项例如以下表所看到的:

    參数

    可选/必选

    说明

    -conf configuration_file

    可选

    指定应用程序的配置文件

    -D property=value

    可选

    为指定属性设置特定值

    -fs host:port or local

    可选

    指定NameNode

    -files

    可选

    指定用逗号分隔的传递到MapReduce集群的文件

    -libjars

    可选

    指定要被包括在类路径中的用逗号分隔的jar文件

    -archives

    可选

    指定了用逗号分隔的归档文件,这些归档文件将在计算节点上解压缩

          前面以前提到,默认使用tab符分隔键值对,而且依照第一个tab符来分隔,而在非常多情况下。数据不是使用tab符分隔字段,而且希望某几个字段做为键,默认情况将不满足这种需求。此时用户能够通过使用对应的參数来改动默认设置,这几个參数为:

    參数

    说明

    stream.map.input.field.separator

    Map输入的字段分隔符,默觉得

    stream.map.output.field.separator

    Map输出的字段分隔符,默觉得

    stream.num.map.output.key.fields

    第几个分隔符用于分隔键值对。默觉得1

    stream.reduce.input.field.separator

    Reduce输入的字段分隔符,默觉得

    stream.reduce.output.field.separator

    Reduce输出的字段分隔符,默觉得

    stream.num.reduce.output.key.fields

    第几个分隔符用于分隔键值对,默觉得1

          通过一个具体的演示样例代码来具体描写叙述上述參数的含义,在该段代码中使用点号(.)做为分隔符,而且第四个点号之前的字段为键,第四个点号(不包括该点号)后面的字段做为值。假设某行中的点号少于四个,则正行将做为键,值为空的Text对象。代码例如以下:

    hadoop jar hadoop-streaming-2.4.1.jar 
        -D stream.map.output.field.separator=. 
        -D stream.num.map.output.key.fields=4 
        -input input 
        -output output 
        -mapper /bin/cat 
        -reducer /bin/cat
    

          最后通过以下的演示样例代码结束Streaming编程的学习。在该代码中通过-files通用选项将两个python脚本上传到集群中,并分别做为mapper和reducer:

    hadoop jar hadoop-streaming-2.4.1.jar 
    -files mapperPythonScript.py, reducerPythonScript.py
    -input myInputDirs 
        -output myOutputDir 
        -mapper mapperPythonScript.py 
        -reducer reducerPythonScript.py 
    

          本篇文章学习Hadoop Streaming编程,具体介绍了作业流程和參数的使用方式,至于怎样编写Streaming中的mapper和reducer,则须要依据用户使用的脚本语言(如python、shell)而定。

  • 相关阅读:
    Ubuntu中文乱码问题解决方案
    微软开业网站----精华 http://www.microsoft.com/opensource/directory.aspx
    微软开源项目
    cnblogs开源合集
    微软开源软件---管理员用的软件
    微软开源项目-codeflex项目介绍
    SQLServer 微软团队开源项目 (web 版?)
    流程引擎2-CCFLOW
    流程引擎1-高人
    sql web Admin 源码.net 升级
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7286853.html
Copyright © 2011-2022 走看看