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的和。
- Hadoop学习笔记四--Hadoop中的流
- 【hadoop】Hadoop学习笔记(四):Hadoop中的streaming
- Hadoop学习笔记(四):Hadoop中的streaming
- hadoop 学习笔记 四 -----hadoop I/O
- Hadoop学习笔记(四)Hadoop伪分布式配置
- hadoop学习笔记四 -- hadoop集群HA架构设计
- Hadoop HDFS源码学习笔记(四)
- Hadoop学习笔记(四):Shuffle阶段
- Hadoop学习笔记(四):HBase
- Hadoop学习笔记(四)---HDFS概述
- Hadoop 学习笔记四 Hive基本知识
- Hadoop学习笔记(四)YARN
- Hadoop学习笔记-Hadoop初识
- hadoop学习笔记-hadoop起源
- hadoop学习笔记 Hadoop进程
- 【hadoop】hadoop学习笔记-回收站
- hadoop学习(四)
- Hadoop学习四
- sql获取本周内的数据
- 用于数值计算的开源库 GNU Scientific Library
- Web.xml配置详解之listener
- 翻译openGL的FAQ--可视和转换
- RMI,EJB,JAVA Socket 网络编程的杂七杂八
- Hadoop学习笔记四--Hadoop中的流
- uboot start.S分析
- Java ssh 访问windows/Linux
- android中获取res的字符串
- IE7自动完成口令获取
- 多标签IESession覆盖的解决方案
- [Linux]modify vim's color in ubuntu
- 使用JAVA引用类型传递后台信息给前台的进度条
- openAmf学习