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

来源:互联网 发布:日语等级考试分数算法 编辑:程序博客网 时间:2024/05/29 15:24

          虽然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 pythonimport sys, randomfor line in sys.stdin:    if (random.randint(1,100) <= int(sys.argv[1])):        print line.strip()

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

#!/usr/bin/env pythonimport sys, randomfor 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的和。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 汇款英文写错了怎么办 体重秤不显示了怎么办 在ur试完衣服怎么办 汽车主机没有倒车检测线怎么办 合格考补考没过怎么办 合同一式两份双方都丢失怎么办 自控力差的人怎么办 孩子缺乏自控能力该怎么办 名片上换了号码怎么办 格力空调显示u8怎么办 格力空调出现u8怎么办 双肺多发斑点影怎么办 外文翻译没5000字怎么办 睡出永久睡痕怎么办 英语不好学学英文软件怎么办 遥控汽车只能原地打转怎么办 铝合金门上的胶带纸撕不掉怎么办 纸胶带撕不下来怎么办 拼多多卖不出去怎么办 联想键盘被锁了怎么办 台式电脑打不开机怎么办 文件名中不能用特殊符号怎么办 高铁喷雾扣留后怎么办 高铁没收的东西怎么办 安检被收的东西怎么办 我的律师骗我怎么办 没婆婆生了小孩怎么办 没人帮你带孩子怎么办 亲戚在家里不走怎么办 穷人家的孩子该怎么办 空腹吃李子胃疼怎么办 情侣空间农场谷仓空间不够怎么办 王者荣耀情侣解除对方不同意怎么办 oppo手机进了水怎么办 淘宝卖号被骗了怎么办 淘宝买号被骗了怎么办 后脑偏头疼怎么办最快最有效 脸两边的骨头大怎么办 做b超胎儿老盘腿怎么办 裤子白边染色了怎么办 异地恋要分手了怎么办