Apache-Hama框架簡介–BSP模型的實現

Hama概況

Hama是基於BSP(BulkSynchronous Parallel)計算技術的並行計算框架,用於大量的科學計算(比如矩陣、圖論、網絡等)。BSP計算技術最大的優勢是加快迭代,在解決最小路徑等問題中可以快速得到可行解(http://wiki.apache.org/hama/Benchmarks)。同時,Hama提供簡單的編程,比如flexible模型、傳統的消息傳遞模型,而且兼容很多分佈式文件系統,比如HDFS、Hbase等。用戶可以使用現有的Hadoop集羣進行Hama BSP.

現在Hama最新的版本爲2012年6月31號發行的0.5.0.這是 Hama 做爲 Apache 頂級項目後首次發佈的版本,該版本包含兩個顯著的新特性,分別是消息壓縮器和完整的 Google Pregel 克隆,另外在計算系統性能和可持續性上都得以提升。

Hama結構

Hama主要有三部分構成:BSPMaster、GroomServers 和Zookeeper。與Hadoop結構很相似,但沒有通信和同步機制的部分。

Hama的集羣由一個BSPMaster和多個互不關聯的GroomServer作計算結點組成,HDFS和Zookeeper都可以是獨立的集羣。啓動從BSPMaster開始,如果是master會啓動BSPMaster、GroomServer兩個進程,如果只是計算結點則只會啓動GroomServer,啓動/關閉腳本都是Master機器遠程在GroomServer機器上執行。


BSPMaster

BSPMaster 即集羣的主,負責了集羣各GroomServer結點的管理與作業的調度,就我所知它還存在單點的問題。相當於Hadoop的JobTracker或HDFS的NameNode。其基本作用如下:

1.            維持Groom服務器狀態。

2.            維護supersteps和集羣中的計數器。

3.            維護Job的進度信息。

4.            調度作業和任務分配給Groom服務器

5.            分配執行的類和配置,整個Groom服務器。

6.            爲用戶提供集羣控制接口(Web和基於控制檯)。

GroomServer

         GroomServer是一個process,通過BSPMaster啓動BSP任務。每一個Groom都有BSPMaster通信,可以通過BSPMaster獲取任務,報告狀態。GroomServer在HDFS或者其他文件系統上運行,通常,GroomServer與與數據結點在一個物理結點上運行,以保證獲得最佳性能。

Zookeeper

Zookeeper用來管理BSPPeer的同步,用於實現BarrierSynchronisation機制。在ZK上,進入BSPPeer主要有進入Barrier和離開Barrier操作,所有進入Barrier的Peer會在zk上創建一個EPHEMERAL的node(/bsp/JobID/Superstep NO./TaskID),最後一個進入Barrier的Peer同時還會創建一個readynode(/bsp/JobID/Superstep NO./ready),Peer進入阻塞狀態等待zk上所有task的node都刪除後退出Barrier

 

BSPProgramming Model

BSP(BulkSynchronous Parallel,整體同步並行計算模型)是英國計算機科學家Viliant在上世紀80年代提出的一種並行計算模型。Google發佈的一往篇論文(《Pregel: A System for Large-Scale Graph Processing》)使得這一概念被更多人所認識,據說在Google 80%的程序運行在MapReduce上,20%的程序運行在Pregel上。和MapReduce一樣,Google並沒有開源Pregel,Apache按Pregel的思想提供了類似框架Hama。

Hama BSP 是基於大容量同步並行模型,利用分佈式節點計算大量步驟。通常,BSP程序包含一序列的superstep。每一個superstep包含三個步驟:

Local computation

Process communication

Barrier synchronization

Bulk Synchronous Parallel Model(http://en.wikipedia.org/wiki/Bulk_synchronous_parallel)

 

Hama提供用戶自定義的函數bsf(),通過bsf函數,用戶可以編寫自己的BSP程序,並且BSP程序可以控制整個程序的並行部分,意味着bsf函數不僅僅是程序普通的一部分。在0.2版本中,完成BSF函數,僅僅需要達成通信接口協議,這樣就可以獲得更多的參數。

BSP是一種跟MapReduce平行的一種並行計算方法, 如果說MapReduce是把底層的數據傳輸和分配完全對用戶屏蔽了的話, 那BSP就是一種要對底層的數據傳輸和分配進行手動編程規定的模式了. 這點上跟MPI(一種古老的並行模式)很像. 


每個計算節點進行並行計算, 在communication的階段進行收發, 將運行結果記錄在barrier上, 等到所有計算節點運行到barrier,所有的計算節點在繼續運行。通過這些原理可以理解爲三個步驟:send, sync, receive.

Communication

在bsp函數中,用戶可以使用communication函數通過使用BSPPeerProtocol完成多種操作,BSF通信標準庫中會提供多種communication函數:

 

Function

Description

send(String peerName, BSPMessage msg)

Sends a message to another peer

put(BSPMessage msg)

Puts a message to local queue

getCurrentMessage()

Returns a received message

getNumCurrentMessages()

Returns the number of received messages

sync()

Barrier synchronization

getPeerName()

Returns a peer’s hostname

getAllPeerNames()

Returns all peer’s hostname.

getSuperstepCount()

Returns the count of supersteps

 

圖計算涉及到大量消息傳遞,Hama不完全是實時傳送,消息的傳輸發生在Peer進入同步階段後,並且對同一個目標GroomServer的消息進行了合併,兩個物理結點之間每一次超步其實只會發生一次傳輸。

 

這些函數非常靈活,比如send函數可以給所有的peer發送消息,其代碼如下:

    @Override

    public void bsp(

        BSPPeer<NullWritable, NullWritable, Text, DoubleWritable, LongMessage> peer)

        throws IOException, SyncException, InterruptedException {

 

      for (String peerName : peer.getAllPeerNames()) {

        peer.send(peerName,

          new LongMessage("Hello from " + peer.getPeerName(), System.currentTimeMillis()));

      }

 

      peer.sync();

    }

 

   

Synchronization

通過sync()函數可以將所有的進程進入barrier,Hama運行到下一個superstep,在上面send函數中,BSP發送消息給所有的peer,這一過程的結束是通過sync函數完成的。

 

    @Override
    public void bsp(
        BSPPeer<NullWritable, NullWritable, Text, DoubleWritable, Writable> peer)
        throws IOException, SyncException, InterruptedException {
 
      for (int i = 0; i < 100; i++) {
        // send some messages
        peer.sync();
      }
    }

 

   

用戶將所有的進程關閉時,BSP工作將會結束。

Counters

跟Hadoop的MapReduce類似,用戶可以使用Counter。

Counter的基本原理是用戶可以增加枚舉數量。在用戶的程序中跟蹤這個有意義的指標,這樣的話就像一個循環,一直在執行。

下面的這段代碼是來展示在BSP中Counter是如何執行的

 

    // enum definition
    enum LoopCounter{
      LOOPS
    }
 
    @Override
    public void bsp(
        BSPPeer<NullWritable, NullWritable, Text, DoubleWritable, DoubleWritable> peer)
        throws IOException, SyncException, InterruptedException {
      for (int i = 0; i < iterations; i++) {
        // details ommitted
        peer.getCounter(LoopCounter.LOOPS).increment(1L);
      }
      // rest ommitted
    }

 

   

Setup and Cleanup

在0.4.0版本之後,用戶可以在BSP代碼中完成Setup 和 Cleanup 方法,這些方法可以從BSP類中繼承:

 

public class MyEstimator extends
      BSP<NullWritable, NullWritable, Text, DoubleWritable, DoubleWritable> {
 
    @Override
    public void setup(
        BSPPeer<NullWritable, NullWritable, Text, DoubleWritable, DoubleWritable> peer)
        throws IOException {
      //Setup: Choose one as a master
      this.masterTask = peer.getPeerName(peer.getNumPeers() / 2);
    }
 
    @Override
    public void cleanup(
        BSPPeer<NullWritable, NullWritable, Text, DoubleWritable, DoubleWritable> peer)
        throws IOException {
      // your cleanup here
    }
 
    @Override
    public void bsp(
        BSPPeer<NullWritable, NullWritable, Text, DoubleWritable, DoubleWritable> peer)
        throws IOException, SyncException, InterruptedException {
      // your computation here
    }
  } 

 

   

Hama的應用情況

有許多應用和組織使用Apache的Hama,例如:

Korea Telecom

Hama is used fornetflow traffic analysis

NHN, corp.

Analysis ofsocial network data as a evaluation tool.

Oracle corporation

Social networkanalysis on 100 TB tweets dataset

2 Racks +InfiniBand network

University of the State of Mato Grosso andFaculty Campo Limpo Paulista

12microcomputers totaling 30 cores

Graphs with upto 65,000 vertices

Study of anexact solution to the problem of centrality in large graphs.

同時,Google和Wikipedia也使用了HamaGraphFile作爲數據存儲和處理。

從2002年開始,Google Web Graph已經包含了875,713個node和5,105,039個edge。

 

具體的數據集如下表:(http://snap.stanford.edu/data/web-Google.html)

 

Dataset statistics

Nodes

875713

Edges

5105039

Nodes in largest WCC

855802 (0.977)

Edges in largest WCC

5066842 (0.993)

Nodes in largest SCC

434818 (0.497)

Edges in largest SCC

3419124 (0.670)

Average clustering coefficient

0.6047

Number of triangles

13391903

Fraction of closed triangles

0.05523

Diameter (longest shortest path)

22

90-percentile effective diameter

8.1

 

利用HamaGraphFile作爲數據存儲和處理的不僅僅是Google,Wikipedia同樣利用HamaGraphFile進行頁面之間(page-to-page link)數據存儲、分析和處理。這可能是最成功的中間數據集的計算。但是,在SQL文件中所提供的格式相當不方便,其中有很多沒有意義的鏈接,Wikipedia對其中的SQL文件做了優化處理。

 

下圖展示的是Wikipedia利用Hama的GraphFile儲存的數據量:

 

Total # pages

5,716,808

Total # links

130,160,392

Max. # outlinks from a single page

5,775

Max. # inlinks to a single page

374,934

# pages with no outlinks

10,438

# pages with no inlinks

1,942,943

 

引用:

Bulk Synchronous Parallel, http://en.wikipedia.org/wiki/Bulk_synchronous_parallel

Edward J. Yoon Apache Hama (v0.2) : UserGuide a BSP-based distributed computing framework

IEEE_CLOUDCOM2010_HAMA

Ben H H Juurlink;Harry A G WijshoffCommunication primitives for BSP computers 1996doi:10.1016/0020-0190(96)00073-7



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章