Hadoop详解(九):Hadoop Streaming和Pipes原理和实现
為了保證編程接口的通用性,Hadoop提供了Streaming和Pipes編程框架和接口,Streaming編程框架通過標(biāo)準(zhǔn)的輸入/輸出作為媒介來和Hadoop框架交換數(shù)據(jù),因此任何可以操作的標(biāo)準(zhǔn)輸入/輸出的編程語言都可以基于Hadoop進行并行應(yīng)用
1. Hadoop Streaming
1.1 Streaming 原理淺談
Streaming的原理:通過標(biāo)準(zhǔn)的輸入/輸出管道讓用戶的程序和Hadoop框架進行數(shù)據(jù)傳輸以及通信。
Mapper和Reducer都是可以執(zhí)行的程序文件,可以用任何語言編寫而成,特別之處在于他們用標(biāo)準(zhǔn)輸入/輸出和用戶的Mapper和Reducer看執(zhí)行程序進行交互。
根據(jù)上述的流程圖,其操作邏輯步驟如下所示:
1.2 Streaming 實現(xiàn)架構(gòu)
在Streaming中通過封裝用戶的可執(zhí)行程序作為一個Java類充當(dāng)相應(yīng)的Mapper和Reducer類,其特殊之處在于用戶的可執(zhí)行程序可以作為獨立的進程啟動,Hadoop Streaming框架會將讀取文件的<key,vlaue>鍵值對通過標(biāo)準(zhǔn)輸入/輸出傳遞給用戶的可執(zhí)行程序進行處理。
從上述中可以清晰看到Streaming框架的核心實現(xiàn)架構(gòu),圖中的虛線將Streaming分為兩個部分:上面為Hadoop Java空間,下面為用戶的編程空間。如果用戶使用C++編寫Map和Reduce可執(zhí)行程序,那么虛線以下的部分就是用戶的C++進程空間,也是就是在Streaming框架中,Hadoop系統(tǒng)和用戶編寫的可執(zhí)行程序并不在一個進程空間,而是相互獨立的。
2. Hadoop Pipes
2.1 Pipes原理淺析
Hadoop Pipes接口則針對C/C++語言通過Socket讓用戶的C/C++程序進程空間和Hadoop的Java 框架進行交互,也就是Pipes框架使用Socket作為媒介實現(xiàn)用戶的C++進程空間和Hadoop Java進程空間進行數(shù)據(jù)交互。
和Streaming不同之處就在于Pipes框架通過Socket讓用戶編寫的C++ Mapper/Reducer程序和Hadoop框架進行數(shù)據(jù)通信,在Pipes框架中通過java將用戶的C++程序封裝成MapReduce的任務(wù)作業(yè),然后提交到集群中運行進行監(jiān)控。截圖步驟如下圖所示:
-
- Java空間的MapTask:通過調(diào)用MapReduce Java API獲取每一個split的 <key,vlaue>鍵值對,然后通過DownwardProtocol協(xié)議將 <key,vlaue>以Socket形式發(fā)送到用戶C++進程的Mapper類。
-
- 用戶空間的C++ Mapper:以Pipes提供的Protocol類來接收數(shù)據(jù)的,然后接收的數(shù)據(jù)傳輸給用戶的C++ Mapper,最終用戶C++ 進程空間 Mapper通過Pipes框架提供的UpwardProtocol協(xié)議,以Scoket的形式傳輸給Hadoop框架。
2.2 Pipes實現(xiàn)架構(gòu)
在實現(xiàn)上,服務(wù)器端的MapTask其實就算對用戶使用C++ Pipes接口編寫的Mapper類的Java端封裝;ReduceTask其實是對用戶使用C++ Pipes接口編寫的Reducer的一個Java端封裝。
Hadoop Java端的PipesMapperRunner就是對用戶C++ Mapper程序的封裝,整體上充當(dāng)Hadoop的Mapper類。用戶的Mapper在C++進程空間以獨立進程運行。Java端的PipesMapRunner從用戶指定的InputFormat類獲取輸入數(shù)據(jù)積累并解析為<key,vlaue>鍵值對,然后通過DownwardProtocol協(xié)議將<key,vlaue>鍵值對以Socket的形式發(fā)送到用戶進程C++進程空間的Protocol,Protocol負(fù)責(zé)接收來自Hadoop Java端的DownwardProtocol發(fā)送的數(shù)據(jù),最后Protocol將接收到的數(shù)據(jù)傳輸給用戶的C++ Mapper類處理。在Mapper類處理完成之后Pipes框架在C++端通過UpwardProtocol將處理結(jié)果發(fā)送到Hadoop Java端的OutputHandler寫入本地磁盤。
總結(jié)
以上是生活随笔為你收集整理的Hadoop详解(九):Hadoop Streaming和Pipes原理和实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop详解(八):MapReduc
- 下一篇: Hadoop详解(十):Hadoop 作