为了保证编程接口的通用性,Hadoop提供了Streaming和Pipes编程框架和接口,Streaming编程框架通过标准的输入/输出作为媒介来和Hadoop框架交换数据,因此任何可以操作的标准输入/输出的编程语言都可以基于Hadoop进行并行应用

1. Hadoop Streaming

1.1 Streaming 原理浅谈

Streaming的原理:通过标准的输入/输出管道让用户的程序和Hadoop框架进行数据传输以及通信。

Mapper和Reducer都是可以执行的程序文件,可以用任何语言编写而成,特别之处在于他们用标准输入/输出和用户的Mapper和Reducer看执行程序进行交互。

根据上述的流程图,其操作逻辑步骤如下所示:

  1. 数据切分,和MapReduce作业一样,根据用户指定的InputFormat类对输入的数据进行切分,每一个Split分块对应一个Mapper任务。
  2. 在Mapper初始化时,每一个mapper任务会把用户的Mapper可执行文件作为一个单独的进程启动,这个Mapper任务通过MapReduce Java API获取每一个split的<key,vlaue>键值对输入,通过管道将<key,vlaue>键值对传递给用户的Mapper可执行程序的标准输入,同时收集用户可执行程序Mapper的标准输出并把收到的每一行转换为<key,vlaue>键值对,作为Mapper的输出
  3. shuffle和sort阶段,和一般的MapReduce作业流程一样要经过Shuffle和Sort阶段到达Reducer。
  4. Reducer任务在运行的时候把输入切分成行并把每一行提供给Reducer可执行文件进程的标准输入。同时Reducer收集可执行文件进程的标准输出的内容,并把每一行内容转换为<key,vlaue>键值对,作为Reducer任务的标准输出。
  5. 结果数据输出。

1.2 Streaming 实现架构

在Streaming中通过封装用户的可执行程序作为一个Java类充当相应的Mapper和Reducer类,其特殊之处在于用户的可执行程序可以作为独立的进程启动,Hadoop Streaming框架会将读取文件的<key,vlaue>键值对通过标准输入/输出传递给用户的可执行程序进行处理。

从上述中可以清晰看到Streaming框架的核心实现架构,图中的虚线将Streaming分为两个部分:上面为Hadoop Java空间,下面为用户的编程空间。如果用户使用C++编写Map和Reduce可执行程序,那么虚线以下的部分就是用户的C++进程空间,也是就是在Streaming框架中,Hadoop系统和用户编写的可执行程序并不在一个进程空间,而是相互独立的。

2. Hadoop Pipes

2.1 Pipes原理浅析

Hadoop Pipes接口则针对C/C++语言通过Socket让用户的C/C++程序进程空间和Hadoop的Java 框架进行交互,也就是Pipes框架使用Socket作为媒介实现用户的C++进程空间和Hadoop Java进程空间进行数据交互。

和Streaming不同之处就在于Pipes框架通过Socket让用户编写的C++ Mapper/Reducer程序和Hadoop框架进行数据通信,在Pipes框架中通过java将用户的C++程序封装成MapReduce的任务作业,然后提交到集群中运行进行监控。截图步骤如下图所示:

  1. 数据切分。在默认情况下Pipes作业和基于Java接口以及基于Streaming接口的MapReduce作业一样,都是根据用户指定的InputFormat类对数据进行切分的,每一个分块对应一个Mapper任务。
  2. Pipes框架会将用户的使用的Pipes接口编写的C++ Mapper程序封装形成一个Mapper任务。这个任务其实是由两个部分组成:一部分是Hadoop Java进程空间的MapTask;另一部分你是在用户C++进程空间的Mapper可执行程序类。
    • Java空间的MapTask:通过调用MapReduce Java API获取每一个split的 <key,vlaue>键值对,然后通过DownwardProtocol协议将 <key,vlaue>以Socket形式发送到用户C++进程的Mapper类。
    • 用户空间的C++ Mapper:以Pipes提供的Protocol类来接收数据的,然后接收的数据传输给用户的C++ Mapper,最终用户C++ 进程空间 Mapper通过Pipes框架提供的UpwardProtocol协议,以Scoket的形式传输给Hadoop框架。
  1. Hadoop Java框架会启动一个接收数据的线程,接收来自用户C++进程空间UpwardProtocol传来的Mapper输出数据,然后写入本地磁盘,之后直接进入Hadoop框架本身的Shuffle和sort阶段到达Reducer端。
  1. Pipes框架会将用户的使用的Pipes接口编写的C++ Reducer程序封装形成一个Reducer任务。这个任务也是由两部分组成的:一部分是hadoop Java进程空间的ReduceTask;另一部分是用户C++进程空间的Reducer可执行程序类。在Shuffle和sort完成之后,Hadoop的ReduceTask会将sort止呕的数据通过DownwardProtocol协议以Socket的形式发送到用户C++进程空间的Reducer。
  2. 结果输出到HDFS。

2.2 Pipes实现架构

在实现上,服务器端的MapTask其实就算对用户使用C++ Pipes接口编写的Mapper类的Java端封装;ReduceTask其实是对用户使用C++ Pipes接口编写的Reducer的一个Java端封装。

Hadoop Java端的PipesMapperRunner就是对用户C++ Mapper程序的封装,整体上充当Hadoop的Mapper类。用户的Mapper在C++进程空间以独立进程运行。Java端的PipesMapRunner从用户指定的InputFormat类获取输入数据积累并解析为<key,vlaue>键值对,然后通过DownwardProtocol协议将<key,vlaue>键值对以Socket的形式发送到用户进程C++进程空间的Protocol,Protocol负责接收来自Hadoop Java端的DownwardProtocol发送的数据,最后Protocol将接收到的数据传输给用户的C++ Mapper类处理。在Mapper类处理完成之后Pipes框架在C++端通过UpwardProtocol将处理结果发送到Hadoop Java端的OutputHandler写入本地磁盘。

Hadoop详解(九):Hadoop Streaming和Pipes原理和实现相关推荐

  1. Hadoop详解(十二):Yarn资源调度策略

    在Yarn中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,Fair Scheduler. FIFO Scheduler FIFO Scheduler把应用 ...

  2. [转]大数据环境搭建步骤详解(Hadoop,Hive,Zookeeper,Kafka,Flume,Hbase,Spark等安装与配置)

    大数据环境安装和配置(Hadoop2.7.7,Hive2.3.4,Zookeeper3.4.10,Kafka2.1.0,Flume1.8.0,Hbase2.1.1,Spark2.4.0等) 系统说明 ...

  3. Hadoop详解以及历史版本介绍

    Hadoop详解 Hadoop的介绍以及发展历史 Hadoop之父Doug Cutting Hadoop最早起源于lucene下的Nutch.Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页 ...

  4. cpu多核 node 单线程_详解node单线程实现高并发原理与node异步I/O

    一.node单线程实现高并发原理 众所周知nodejs是单线程且支持高并发的脚本语言.可为什么单线程的nodejs可以支持高并发呢?很多人都不明白其原理,下面我来谈谈我的理解: 1. node的优点: ...

  5. 【视频】详解HDFS的HA高可用原理

    详解HDFS的HA高可用原理

  6. Python中常见的__init__.py是什么意思?详解Python import的方式和原理

    Python中常见的__init__.py是什么意思?详解Python import的方式和原理 1 什么是模块化编程? 2 __init__.py文件的作用 3 Python如何import第三方库 ...

  7. 详解数据库的锁机制及原理

    详解数据库的锁机制及原理 1.数据库锁的分类 2.行锁 共享锁(读锁S锁) 排他锁(写锁X锁) 更新锁 3.意向锁(IX/IS锁) 4.锁机制解释数据库隔离级别 5.元数据锁(MDL锁) 6.间隙锁 ...

  8. 专家详解甲型H1N1流感疫苗生产原理过程

    为什么80%的码农都做不了架构师?>>>    http://www.hinews.cn/news/system/2009/12/03/010624808.shtml 专家详解甲型H ...

  9. Hadoop生态圈(一)- Hadoop详解

    目录 前言 1. Hadoop概述 1.1 Hadoop是什么 1.2 Hadoop发展简史 1.2 Hadoop三大发行版本 1.3 Hadoop优势 1.4 Hadoop的组成 1.4.1 Had ...

最新文章

  1. 网易北航搞了个奇怪研究:多数人类看不懂的立体图,AI现在看懂了
  2. Keepalived+nginx造成流量异常
  3. java 怎么中断一个线程
  4. 大话设计模式—外观模式
  5. EasyUI--messager
  6. php接收vue请求数据axios,详解vue axios用post提交的数据格式
  7. Cannot modify header information问题的解决方法【新浪云经常遇到的错误】
  8. 如何主动触发时间选择器弹窗_请合理使用Alert弹窗
  9. was修改堆内存_WAS问题解决思路
  10. 【Oracle】修改参数的同时添加注释
  11. 连表查询 mysql实例_mysql中各种常见join连表查询实例总结
  12. 信号与系统公式大全(傅里叶变换、拉普拉斯变换、Z变换、卷积...)
  13. 路畅安卓最新固件升级_路畅车载导航系统刷机-路畅导航系统刷机固件大全下载最新完整版-《百度网盘下载》西西软件下载...
  14. 个人所得综合税年度汇算,个税计算公式,个税计算案例
  15. 一行 Python 能实现什么丧心病狂的功能?
  16. Flutter学习日记之使用路由进行页面切换
  17. 基于Vue开发的电商APP项目——蘑菇街app
  18. Matplotlib做图第一节
  19. 三极管与mos管通俗讲解
  20. ESP8266-Arduino编程实例-MMA7455L加速计驱动

热门文章

  1. 在Java中使用Socket模拟客户端和服务端(多线程)
  2. .NET面试经典问答
  3. 安卓学习-界面-ui-RadioButton CheckBox
  4. Android Studio设置字体
  5. java中的与运算符
  6. matlab计算运行时间方法
  7. 网站停办了 服务器有备份吗,网站在服务器上四种备份方法
  8. kafka偏移量保存到mysql里_SparkStreaming+kafka保存offset的偏移量到mysql案例
  9. easypoi导出数值型_SpringBoot使用EasyPoi进行数据导入导出Excel(一)
  10. 数据库的数据在硬盘上吗