Hadoop学习笔记四--Hadoop中的流

          虽然Hadoop是用JAVA编写的,但是hadoop同样支持其他的语言,通过一个叫Streaming的API,HADOOP可以接受其他语言编写的mapreduce程序。这个功能主要应用在一些小的需要快速编写并且更适用于脚本语言的时候,如python。

           hadoop的Streaming采用unix流来与其他语言的程序交互,输出和输入必须通过标准输入输出流。STDIN和STDOUT. 但是在这种情况下,数据必须是文本的,必须每一行被当做一条记录。 因为有多少行,就会相应的执行多少次UNIX命令,hadoo的Streaming API将使hadoop将UNIX命令作为mapper和reducer来适用,以下是一个模板:

  

cat [input_file] | [mapper] | sort | [reducer] >[output_file]

        1. 我们首先采用UNIX命令作为mapper和reduce的形式。 (需实践)

       

bin/hadoop jar contrib/streaming/hadoop-0.19.1-streaming.jar 
        ➥ -input input/cite75_99.txt 
        ➥ -output output 
        ➥ -mapper 'cut -f 2 -d ,' 
        ➥ -reducer 'uniq'

     一行命令就代表了一个mapreduce程序,其中 mapper由一个cut命令代替,即从输入中跳出第二列数据。 reducer的uniq命令表示挑出重复的数据。

       2. 采用脚本语言使用Streaming API (需实践)

      hadoop可以支持能够向STDIN和STDOUT写入输入和输出的任何脚本语言。

#!/usr/bin/env python
import sys, random
for line in sys.stdin:
    if (random.randint(1,100) <= int(sys.argv[1])):
        print line.strip()

      在这种情况下,我们将用脚本语言所写的mapper来代替之前的unix命令,在这里实现一个简单的paythonmapper,代码如下。

#!/usr/bin/env python
import sys, random
for line in sys.stdin:
    if (random.randint(1,100) <= int(sys.argv[1])):
        print line.strip()


那么再简单将之前的命令换一下参数,就可以得到我们想要的结果,

bin/hadoop jar contrib/streaming/hadoop-0.19.1-streaming.jar 
        ➥ -input input/cite75_99.txt 
        ➥ -output output 
        ➥ -mapper 'RandomSample.py 10' 
        ➥ -file RandomSample.py  
        ➥ -D mapred.reduce.tasks=1
我们的python程序的唯一区别是unix命令在每个节点上都是直接可用的,但是我的python文件并不是,在此,hadoop Streaming支持-file选项来将我们的可执行文件打包然后放到作业的提交中。

另外,需要注意的是,在JAVA程序中,map接受的输入室友inputformat类分好了的一个record,而在streaming的模式下,我们得到的是一个数据分片,这样的形式能够为我们提供一定的便利。

       3. Streaming 和Key/Value

     在之前的例子中,有一种错觉,就是我们不在跟key/value打交道,这是因为在Streaming中,hadoop用tab将key和value分开,如果没有tab,那么hadoop就将这一行整个当做key,value为一个空的text,所以看起来有点像没有key value值。

     下面来了解一下Key/Value在流里面的工作流程。

     首先, mapper从流stdin中读取数据,mapper将数据按照行得形式extract。

    然后,按照上述,streaming api将会将每一行读成key/value的形式,按照tab分开,如果没有tab的话,value默认为空。

    三,到达reduceer后,streaming api会将数据按照key的方式排列,在传统的方式中,我们传给reduce的值是按照key和相应的value数组,但是在api中,将value 排列到一起的工作由reducer来完成。

   四。 最后将数据输出到文件中。 【python代码需要熟悉,需要练习,p111】

4. Streaming API中的集合运算包

    在Streaming API中有一个用于集合运算的包,可以用来做统计。名字叫aggreagte package. 使用这个包的方式极为简单

    只需一个mapper整理数据然后按照以下的方式输出。

    function: key\value

   function指的是集合运算包中的方法名,包提供了用于统计的一些方法

 LongSumValue指的是对应的key的所有的value的和。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值