Hadoop详解(九):Hadoop Streaming和Pipes原理和实现
為了保證編程接口的通用性,Hadoop提供了Streaming和Pipes編程框架和接口,Streaming編程框架通過標準的輸入/輸出作為媒介來和Hadoop框架交換數據,因此任何可以操作的標準輸入/輸出的編程語言都可以基于Hadoop進行并行應用
1. Hadoop Streaming
1.1 Streaming 原理淺談
Streaming的原理:通過標準的輸入/輸出管道讓用戶的程序和Hadoop框架進行數據傳輸以及通信。
Mapper和Reducer都是可以執行的程序文件,可以用任何語言編寫而成,特別之處在于他們用標準輸入/輸出和用戶的Mapper和Reducer看執行程序進行交互。
根據上述的流程圖,其操作邏輯步驟如下所示:
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的任務作業,然后提交到集群中運行進行監控。截圖步驟如下圖所示:
-
- 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框架。
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原理和实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop详解(八):MapReduc
- 下一篇: Hadoop详解(十):Hadoop 作