Hadoop Streaming原理介绍


Hadoop是基于hdfs和MapReduce的分布式框架。由于hadoop是基于java语言的,对于其他语言实现map reduce操作不太方便,因此出现了hadoop streaming。

hadoop streaming可以将各种非java语言的脚本(script)或者可执行文件(executable)作为map和reduce函数(当然java的更可以)。其基本的方法就是将输入和输出都通过标准输入输出流来进行。这样,我们就可以从标准输入读取数据,进行map操作,传给reduce,再进行合并,输出到标准输出。我们发现,这个过程中,并没有提到具体的语言,因为都是在标准的I / O stream中操作的。

可执行文件可以是python的一个.py脚本,也可以是一个自定义的.sh的shell脚本。或者直接用linux自带的函数,如 cat, wc 等。

标准输入输出,在shell脚本中,可以用cat 等方式,而输出则可以用 > 或者管道符号 | 。在c中就是stdio,c++里是cin和cout。python中就是sys.stdin和print。等等。只要从标准输入拿数据,并且写到标准输出中,hadoop streaming都能正确地运行。

hadoop streaming的基本原理示意图如下:


可以看到,输入首先在hdfs上进行split,然后分别用mapper处理,然后经过shuffle&sort,进入reducer,汇合,得到最终结果。可以看到,这里深颜色的mapper和reducer就是我们的可执行文件或者脚本。而从streaming java mapper/reducer可以看出,实际上是hadoop streaming对自定义的mapper和reducer进行了一个java的封装,在封装的mapper和reducer内部,输出输出是用stdin和stdout传的,消除了不同语言脚本的差异。相当于开了一个java 的MapReduce,然后再运行自定义脚本,并将输入的k-v对转成用stdin,通过管道喂给自定义脚本,得到输出后,通过stdout传出来,再重新整理成k-v对。

下面我们看看实际中的hadoop streaming是如何使用的。

Hadoop Streaming的用法和参数简介

hadoop streaming的基本形式如下所示:

$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \-input myInputDirs \-output myOutputDir \-mapper /bin/cat \-reducer /bin/wc

首先是hadoop的二进制文件路径,然后jar,运行hadoop-streaming.jar这个jar包,后面跟着一些参数。输入输出的存放位置,以及mapper和reducer的可执行文件。在上面,我们的mapper就是linux 中的cat函数,而reducer则是wc函数。因此这个脚本的作用就是,将所有输入cat起来,然后统计一下字数。

下面我们来看下hadoop streaming的各种参数:

bin/hadoop command [genericOptions] [streamingOptions]

这里,通用option在前面,streaming的在后面。所谓通用的option指的是如下这些参数,即在hadoop中本身也存在的参数:

比如,-conf指定配置文件,在直接用hadoop操作是也可以这样使用。同理,-D表示和directory相关的一些参数,它的形式比如:

   -D mapred.local.dir=/tmp/local-D mapred.system.dir=/tmp/system-D mapred.temp.dir=/tmp/temp

-D的参数常用的有以下几个:

-D mapred.job.name 就是给提交到hdfs的job起个名字
-D mapred.job.priority job的优先级,有五种取值:LOW、VERY_LOW、NORMAL、HIGH、VERY_HIGH
-D mapred.job.map.capacity 最多同时运行map数量
-D mapred.job.reduce.capacity 最多同时运行reduce数量
-D mapred.map.tasks map任务数
-D mapred.reduce.tasks reduce任务数

而streaming options就是hadoop streaming特有的一些参数,主要包括以下几个:

-input : 输入文件路径,是hdfs集群上的路径
-output : 输出路径,也是集群的
-mapper : mapper脚本名,或者可执行文件名称,比如 "cat"/"mypyscript.py" 等
-reducer : reduer脚本或可执行文件名,如"cat"或者py文件名等
-file : 随job提交的文件路径,这里是本地路径

在执行hadoop streaming时,mapper和reducer脚本不一定都在集群上,当集群上没有对应的mapper和reducer时,需要通过-file,把所需要的所有文件都提交上来(和job一起)。比如,在执行mapper的时候,需要用到脚本my.py,以及一个字典 mydict.dict,那么,可以这么写:

$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \-input myInputDirs \-output myOutputDir \-mapper my.py \-reducer cat \-file my.py \-file mydict.dict

这里补充一点,在普通场景下,我们的程序较为复杂,体量较大,而数据则很方便可以下载到本地,这种情况下,我们的程序不动,而数据需要被下载过来。而在大数据场景下,数据体量非常之大,而我们的程序的操作则比较简单,因此,采用了相反的策略,即数据不动,将脚本传过去找数据,然后在hdfs上运算。

我只能期待着,
那一天——
地下的烈火冲腾,
把这活棺材和我一齐烧掉,
我应该在烈火和热血中
得到永生。
—— 叶挺 《囚歌》

2019年11月5日00:17:13

Hadoop Streaming的基本原理与参数解析相关推荐

  1. hadoop streaming部分问题总结

    来源: https://hadoop.apache.org/docs/r1.2.1/streaming.html#Generic+Command+Options 文档还是要好好看,中间遇到的好多问题文 ...

  2. 利用Hadoop Streaming处理二进制格式文件

    Hadoop Streaming是Hadoop提供的多语言编程工具,用户可以使用自己擅长的编程语言(比如python.php或C#等)编写Mapper和Reducer处理文本数据.Hadoop Str ...

  3. Hadoop Streaming高级编程

    1. 概要 本文主要介绍了Hadoop Streaming的一些高级编程技巧,包括,怎样在mapredue作业中定制输出输出格式?怎样向mapreduce作业中传递参数?怎么在mapreduce作业中 ...

  4. Hadoop Streaming

    Hadoop Streaming Hadoop Streaming Hadoop Streaming     Streaming工作原理     将文件打包到提交的作业中     Streaming选 ...

  5. hadoop streaming编程小demo(python版)

    大数据团队搞数据质量评测.自动化质检和监控平台是用django,MR也是通过python实现的.(后来发现有orc压缩问题,python不知道怎么解决,正在改成java版本) 这里展示一个python ...

  6. Hadoop Streaming详解

    一: Hadoop Streaming详解 1.Streaming的作用 Hadoop Streaming框架,最大的好处是,让任何语言编写的map, reduce程序能够在hadoop集群上运行:m ...

  7. Hadoop Streaming框架使用(三)

    前两篇文章介绍了Hadoop Streaming框架的使用方法.由于篇幅所限,并没有介绍其中的高级使用方法,但是有一些用法还是相当常见的.今天对一些高级用法进行一个简单的说明,希望能给大家一些启发. ...

  8. Hadoop Streaming框架使用(一)

      Streaming简介 link:http://www.cnblogs.com/luchen927/archive/2012/01/16/2323448.html Streaming框架允许任何程 ...

  9. Hadoop Streaming 编程

    1.概述 Hadoop Streaming是Hadoop提供的一个编程工具,它允许用户使用任何可执行文件或者脚本文件作为Mapper和Reducer,例如: 采用shell脚本语言中的一些命令作为ma ...

最新文章

  1. 剑指Offer 替换空格
  2. MySQL:数据操作
  3. ios保存gif到相册_iOS相册中的GIF图片的读取与保存
  4. simpledateformat格式_为什么日期格式化时必须有使用y表示年,而不能用Y?
  5. Web API 2 入门——使用Web API与ASP.NET Web窗体(谷歌翻译)
  6. c语言#include后的尖括号和双引号有什么区别
  7. java 使用websocket_Java使用WebSocket
  8. 了解最新升级手持式频谱仪版本和各项性能
  9. NanoMsg框架C++的相关函数介绍
  10. android rs232串口协议,RS232串口协议详解
  11. Intel CPU参数查询网站
  12. react引入antd报错找不到antd/dist/antd.css Module not found: Error: Can‘t resolve ‘antd/dist/antd.css‘ in
  13. iPad——添加学校邮箱到邮件解决方案
  14. 深度互学习-Deep Mutual Learning:三人行必有我师
  15. java获取中文首字母
  16. 如何从头搭建一个搜索引擎_pylucene,分词,语言编码问题
  17. codeforces 407C Curious Array 数学
  18. NodeJS 初学之安装配置环境
  19. java左手画圆右手画方_左手画圆右手画方900字作文
  20. Java Web入门之JSTL标签的解析及使用(超详细必看)

热门文章

  1. 华为、苹果、三星扎堆发财报,谁的日子最不好过?
  2. 用深层神经网络识别猫咪图片:吴恩达Course1-神经网络与深度学习-week3week4作业
  3. 人民币大小写转换工具类
  4. 大学英语听说教程4听力原文及答案
  5. 基于Electron的Windows桌面闹钟小程序
  6. 一款超高性价比的57步进电机驱动芯片TB6600HG实测稳定4.2A输出42V输入
  7. 停应用要用oracle吗,adpatch 时是否需要停应用,opatch是否需要停数据库
  8. 淘宝运营是什么意思?运营要学习的内容有哪些?
  9. 打印机驱动下载ts3180 ts3480
  10. HarmonyOS系统架构