| | 4 | 其中最为方便的是使用python或者ruby等脚本语言编写mapper和reducer的文件 |
| | 5 | |
| | 6 | == Hadoop Streaming原理 == |
| | 7 | |
| | 8 | 在上面的例子里,mapper和reducer都是可执行文件,它们从标准输入读入数据(一行一行读),并把计算结果发给标准输出。Streaming工具会创建一个Map/Reduce作业,并把它发送给合适的集群,同时监视这个作业的整个执行过程。[[BR]] |
| | 9 | |
| | 10 | 如果一个可执行文件被用于mapper,则在mapper初始化时,每一个mapper任务会把这个可执行文件作为一个单独的进程启动。 mapper任务运行时,它把输入切分成行并把每一行提供给可执行文件进程的标准输入。同时,mapper收集可执行文件进程标准输出的内容,并把收到的每一行内容转化成key/value对,作为mapper的输出。默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。如果没有tab,整行作为key值,value值为null。不过,这可以定制,在下文中将会讨论如何自定义key和value的切分方式。[[BR]] |
| | 11 | |
| | 12 | 如果一个可执行文件被用于reducer,每个reducer任务会把这个可执行文件作为一个单独的进程启动。 Reducer任务运行时,它把输入切分成行并把每一行提供给可执行文件进程的标准输入。同时,reducer收集可执行文件进程标准输出的内容,并把每一行内容转化成key/value对,作为reducer的输出。默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。在下文中将会讨论如何自定义key和value的切分方式。 |
| | 13 | |
| | 14 | |
| | 15 | == 命令形式与参数 == |
| | 16 | |
| | 17 | {{{ |
| | 18 | $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-streaming-1.0.3.jar |
| | 19 | |
| | 20 | -input myInputDirs 【hdfs系统中输入文件/夹位置】 |
| | 21 | |
| | 22 | -output myOutputDir 【这个目录需要不存在】 |
| | 23 | |
| | 24 | -mapper mapper.rb 【可执行的文件或者命令】 |
| | 25 | |
| | 26 | -reducer reducer.rb 【可执行的文件或者命令】 |
| | 27 | |
| | 28 | -file 【需要分发的文件】 |
| | 29 | }}} |
| | 30 | |
| | 31 | 其他的参数 |
| | 32 | |
| | 33 | {{{ |
| | 34 | -inputformat JavaClassName |
| | 35 | -outputformat JavaClassName |
| | 36 | -partitioner JavaClassName 【用户自定义的partitioner程序】 |
| | 37 | -combiner JavaClassName 【用户自定义的combiner程序(必须用java实现)】 |
| | 38 | }}} |
| | 39 | |
| | 40 | 配置 |
| | 41 | |
| | 42 | |
| | 43 | {{{ |
| | 44 | -conf <configuration file> specify an application configuration file |
| | 45 | -D <property=value> use value for given property |
| | 46 | }}} |
| | 47 | |
| | 48 | |
| | 49 | == 例子 == |