从HAMA开始

最近一直在学习mapreduce和yarn架构,工作中利用到了mapreduce。但是众所周知,mapreduce不适合交互式运算(本人实际工作是对稀疏矩阵的挖掘处理)。现在为了改进,着手看了HAMA几天,S4、HAMA貌似都有消息处理机制.
HAMA架构,主要包括三部分:
• BSPMaster :
1、 维护groom server的状态;
2、 维护超步和其他计数器;
3、 提供任务进度信息;
4、 任务调度和分配作业到groom servers;
5、 分配可执行类和配置信息到groom servers;
6、 为用户提供集群的控制信息;
初始脚本会启动BSPMaster和多个grooms。Master会为groom servers启动一个RPC server。Groom servers包含BSPPeer实例和与master通信的RPC代理。启动后groom会定期发送心跳信息(最大任务数、可用内存等信息)。
每当master接收到心跳信息,他就得到最新的groom server信息,从而合理分配任务到空闲的groom server上去,相应返回一个心跳信息(分配的任务和其他操作等)到groom server上去。现在已经实现了FIFO调度和简单的作业分配算法。
• GroomServers
每个groomserver负责运行master分配的作业,并且汇报状态。
• Zookeeper.
主要用来有效管理BSPPeer的同步阶段。稍后会用到部分容错系统中。
和hadoop架构很类似,仅仅是多了通信和同步机制;

BSP模型
Overview
自定义的BSP方法继承之org.apache.hama.bsp.BSP,这个类为用户提供了bsp()方法去编写自己的BSP程序,bsp()方法掌控着程序的并行部分。在计算前后还有setup() and cleanup()方法。
最基本的,BSP包含一系列超步。每个超步包括三个部分:
BSP Function
bsp()函数是程序的并行计算部分,唯一的参数是BSPPeer。
Input and Output
这部分类同hadoop,其实HAMA就是在hadoop的hdfs和RPC基础上做的,它提供这些输入输出结构也是为了更好的和hadoop的mapreduce以及hbase交互。比如也有SequenceFileInputFormat和TextFileInputFormat等。
举几个例子:
@Override
  public final void bsp(
      BSPPeer<LongWritable, Text, KEYOUT, VALUEOUT> peer)
      throws IOException, InterruptedException, SyncException {
            // 从文件中读取 <key,value>记录
      KeyValuePair<LongWritable, Text> pair = peer.readNext();
      // 下面几行实现同样的功能
      LongWritable key = new LongWritable();
      Text value = new Text();
      peer.readNext(key, value);
  }
Hama提供的输入重读的函数,下面的片段实现了将输入读5次:
  for(int i = 0; i < 5; i++){
    LongWritable key = new LongWritable();
    Text value = new Text();
    while (peer.readNext(key, value)) {
       // read everything
    }
    // reopens the input
    peer.reopenInput()
  }
Communication Model
在bsp()方法中,可以将BSPPeer通过通信函数实现很多操作。下面列出了几个通用的基本操作:
BSPPeer可以理解为“信使”封装类~~~~~~~~
send(String peerName, BSPMessage msg)发送信息给 peerName;
getCurrentMessage()从队列中接收一个当前信息;
getNumCurrentMessages()当前信息条数;
sync()同步界;
getPeerName()获得peer名;.
getPeerName(int index)第n个peername.
getNumPeers()
getAllPeerNames()
这些函数非常灵活,例如要实现给hama群中每个peers都发送信息,可以如下
      for (String peerName : peer.getAllPeerNames()) {
        peer.send(peerName,
          new LongMessage("Hello from " + peer.getPeerName(), System.currentTimeMillis()));
      }
Synchronization
sync()使任务进入同步界限,从而进入下一个超步。可以用这个函数实现迭代任务的顺次进行,如下:
      for (int i = 0; i < 100; i++) {
        // send some messages
        peer.sync();
      }
BSP job只在所有的处理没有队列后或者被杀掉才停止。
Counters
如同hadoop,hama也实现了计数机制,
    // 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这个不用多说,就是每个超步的准备和清理;

猜你喜欢

转载自hahaxyg.iteye.com/blog/1545257
今日推荐