日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/4/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hadoop详解(九):Hadoop Streaming和Pipes原理和实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為了保證編程接口的通用性,Hadoop提供了Streaming和Pipes編程框架和接口,Streaming編程框架通過標準的輸入/輸出作為媒介來和Hadoop框架交換數據,因此任何可以操作的標準輸入/輸出的編程語言都可以基于Hadoop進行并行應用

1. Hadoop Streaming

1.1 Streaming 原理淺談

Streaming的原理:通過標準的輸入/輸出管道讓用戶的程序和Hadoop框架進行數據傳輸以及通信。

Mapper和Reducer都是可以執行的程序文件,可以用任何語言編寫而成,特別之處在于他們用標準輸入/輸出和用戶的Mapper和Reducer看執行程序進行交互。

根據上述的流程圖,其操作邏輯步驟如下所示:

  • 數據切分,和MapReduce作業一樣,根據用戶指定的InputFormat類對輸入的數據進行切分,每一個Split分塊對應一個Mapper任務。
  • 在Mapper初始化時,每一個mapper任務會把用戶的Mapper可執行文件作為一個單獨的進程啟動,這個Mapper任務通過MapReduce Java API獲取每一個split的<key,vlaue>鍵值對輸入,通過管道將<key,vlaue>鍵值對傳遞給用戶的Mapper可執行程序的標準輸入,同時收集用戶可執行程序Mapper的標準輸出并把收到的每一行轉換為<key,vlaue>鍵值對,作為Mapper的輸出
  • shuffle和sort階段,和一般的MapReduce作業流程一樣要經過Shuffle和Sort階段到達Reducer。
  • Reducer任務在運行的時候把輸入切分成行并把每一行提供給Reducer可執行文件進程的標準輸入。同時Reducer收集可執行文件進程的標準輸出的內容,并把每一行內容轉換為<key,vlaue>鍵值對,作為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的任務作業,然后提交到集群中運行進行監控。截圖步驟如下圖所示:

  • 數據切分。在默認情況下Pipes作業和基于Java接口以及基于Streaming接口的MapReduce作業一樣,都是根據用戶指定的InputFormat類對數據進行切分的,每一個分塊對應一個Mapper任務。
  • 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框架。
  • Hadoop Java框架會啟動一個接收數據的線程,接收來自用戶C++進程空間UpwardProtocol傳來的Mapper輸出數據,然后寫入本地磁盤,之后直接進入Hadoop框架本身的Shuffle和sort階段到達Reducer端。
  • Pipes框架會將用戶的使用的Pipes接口編寫的C++ Reducer程序封裝形成一個Reducer任務。這個任務也是由兩部分組成的:一部分是hadoop Java進程空間的ReduceTask;另一部分是用戶C++進程空間的Reducer可執行程序類。在Shuffle和sort完成之后,Hadoop的ReduceTask會將sort止嘔的數據通過DownwardProtocol協議以Socket的形式發送到用戶C++進程空間的Reducer。
  • 結果輸出到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原理和实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。