8.1.2hadoop Streaming 作业原理和参数设置

1.1.1         Stream 作业

1hadoop streaming

Hadoop streaming是hadoop的一个工具,用于运行费java的maper或reducer作业,例如maper和reducer是C++编写的可执行程序或者脚本文件。同时也可以是java类。

HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar

    -input myInputDirs

    -output myOutputDir

    -mapper /bin/cat

    -reducer /bin/wc

2Stream工作原理

如果可执行程序被用于maper和reducer,可执行程序作为单独的进程启动,mapper任务运行时,将输入按照分隔符切分成行(默认情况下每一行tab之前的为键key,之后为值value,如果没有tab,整行为键,值为null,key和value的分隔符可以设置),提供给可执行程序的标准输入,可执行程序处理之后输出到标准输出,mapper任务收集标准输出的内容,转换为key/value对,作为maper/reducer的输出。用户可以设定stream.non.zero.exit.is.failure true 或false 来表明streaming task的返回值非零时是 Failure 还是Success。默认情况,streaming task返回非零时表示失败。

3)集群运行可执行程序一起打包提交

如果是集群运行stream作业,需要用-file参数指定可执行程序,framework将可执行程序一起打包提交到集群运行。例如下面的-file myPythonScript.py除了可执行文件外,其他mapper或reducer需要用到的辅助文件(比如字典,配置文件等)也可以用这种方式打包上传。

HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar

    -input myInputDirs

    -output myOutputDir

    -mapper myPythonScript.py

    -reducer /bin/wc

    -file myPythonScript.py

-file myDictionary.txt

4Stream只使用mapper的设置

有时只需要map函数处理输入数据。这时只需把mapred.reduce.tasks设置为零,Map/reduce框架就不会创建reducer任务,mapper任务的输出就是整个作业的最终输出。

为了做到向下兼容,Hadoop Streaming也支持“-reduce None”选项,它与“-jobconf mapred.reduce.tasks=0”等价。

5Stream参数设置

-inputformat JavaClassName

设置输入值类型

-outputformat JavaClassName

设置输出值类型

-partitioner JavaClassName

设置分区类

-combiner JavaClassName

设置combine函数类

-input myinputdir

设置输入路径

-output myoutputdir

设置输出路径

-cluster name

切换集群

-dfs host:port or local

设置新的hdfs或者用local表示本地

-jt host:port or local

设置新的jobtracker或者用local表示本地

-file ./map_sort.py

将当前目录的map_sort.py文件(10M以内)上传到计算节点

-cacheFile "hdfs://hadoop-master:8020/fruit.txt#fruit

HDFS中已经存在的文件发送到需要使用该文件的节点。“#”是给要分发的文件起别名(符号链接),在Mapreduce程序中直接使用该别名就可访问该文件。

-cacheArchive “hdfs://hadoop-master:8020/fruit.tar.gz#fruitlink

-cacheArchive:将HDFS中已经存在的压缩文件fruit.tar.gz分发到相应的计算节点并解压,fruitlink指向解压后的文件夹。

-jobconf mapred.reduce.tasks=2

Hadoop的参数设置,这里表示用两个reduce任务,还有很多其他任务。

6Streaming输入输出键值分隔符设置

默认是tab作为分隔符,如果键值中包含tab键,则需要将分隔符设置为其他符号。除了分隔符,还要对键所占分隔符的数量stream.num.map.output.key.fields和stream.num.reduce.output.key.fields进行设置,例如一行数据是a,b,c,数量设置为1,则a是键,b,c是值,如果设置为2,则a,b是键,c是值。

属性名称

描述

stream.map.input.field.separator

String,默认 ,map输入键值分隔符

stream.reduce.input.field.separator

String,默认 ,reduce输入键值分隔符

stream.map.output.field.separator

String,默认 ,map输出键值分隔符

stream.reduce.output.field.separator

String,默认 ,reduce输出键值分隔符

stream.num.map.output.key.fields

Map输出键值字符串中,键占的字段数

stream.num.reduce.output.key.fields

reduce输出键值字符串中,键占的字段数

这参数的作用如图所示,参数作为内部分隔设置,与总的输入input和输出output无关。如果用标准的TextOutputFormat作为output的输出格式,则默认会用tab分隔,写入输出文件。可以通过属性mapreduce.output.textoutput.format.separator来修改output输出的分隔符。

 

自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:

https://www.cnblogs.com/bclshuai/p/11380657.html

 

原文地址:https://www.cnblogs.com/bclshuai/p/12242172.html