Hadoop详解(九):Hadoop Streaming和Pipes原理和实现

为了保证编程接口的通用性,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写入本地磁盘。

猜你喜欢

转载自blog.csdn.net/qq_21125183/article/details/86689429