从BSP模型到Apache Hama(5)

1. 在科学计算领域的适用性:Hama提供的基础组件能够适应多种需要矩阵和图形计算的应用。MapReduce在单纯的大规模科学计算方面存在不足。比如求一个大型矩阵的逆矩阵,需要进行大量的迭代计算,而读写文件的次数并不多。此时Hama的迭代速度快的优势便体现出来。

2. 兼容性:Hama能利用Hadoop和它相关的所有功能,因为Hama很好的兼容了现有Hadoop接口;

3. 可扩展性:得益于Hama的兼容性,Hama能够充分利用大规模分布式接口的基础功能和服务,比如亚马逊EC2可以无需任何修正就可以使用Hama;

4. 编程方式的灵活性:为了保证灵活性来支持不同的计算模式,Hama提供了简单计算引擎接口;任何遵循此接口的计算引擎都能自由接入和退出;

Hama亟待解决的问题

完善容错能力。

NoSQL的输入输出格式

无视同步(消除栅栏)

使用异步消息:现在消息是在超级步的后期进行传递,在超级步里消息异步发送会带来更多的并发设计。

Hama容错机制

BSPMaster出错:

  【未解决】https://issues.apache.org/jira/browse/HAMA-509

GroomServer出错:

  恢复GroomServer上的task。【未解决】https://issues.apache.org/jira/browse/HAMA-618

task出错:

  当BSPMaster发现任务出错时,控制GroomServer恢复task。【已解决】https://issues.apache.org/jira/browse/HAMA-534

  task会周期pingGroomServer,如果不能ping通则杀死自己,如果GroomServer长时间收不到某task的ping信息,则检查task是否正常运行。【已解决】https://issues.apache.org/jira/browse/HAMA-498

summarizes:

https://issues.apache.org/jira/browse/HAMA-505

Hama API

BSP

1.编写自己的BSP类需要继承org.apache.hama.bsp.BSP ,并且需要重写bsp()方法,bsp()方法的声明如下:

public abstract void bsp(BSPPeer<K1, V1, K2, V2, M extends Writable> peer) throws IOException, SyncException, InterruptedException;

2.按照我们自己的业务编写bsp()方法,该方法内包含一个或多个超步,栅栏同步接口是peer.sync();

3.进程间通信接口如下:

从BSP模型到Apache Hama

    下面是一个发送接收消息的例子:

从BSP模型到Apache Hama

4.在我们自己的BSP类中还有setup()cleanup()两个方法,分别在bsp()方法之前和之后执行,可以对这两个方法重写,完成一些需求。BSP类概要如下图:

从BSP模型到Apache Hama

Graph

1. hama提供了Graph包,支持顶点为中心的图计算,使用较少的代码就可以实现google Pregel风格的应用。

实现一个Hama Graph应用包括对预定义的Vertex类进行子类化,模板参数涉及3种类型,顶点、边和消息( vertices, edges, and messages ):

从BSP模型到Apache Hama

用户重写compute()方法,该方法将在每个超步的活跃顶点中执行。Compute()方法可以查询当前顶点及其边的信息,并向其他顶点发送消息。

2.通过继承 org.apache.hama.graph. VertexInputReader 类,根据自己的文件格式创建自己的 VertexReader,示例如下:

从BSP模型到Apache Hama

通过继承org.apache.hama.graph.AbstractAggregator类,可以编写自己的聚合器。聚合器用来做全局的通信、监控等。超步内所有的顶点都可以给聚合器一个值,聚合器整合所有点提供的值,在下一个超步每个顶点都可以使用聚合器整合后的值。在一个job里可以使用多个聚合器,只需要在创建job时注册一下即可,注册如下:

从BSP模型到Apache Hama

顶点使用聚合器是按聚合器注册时的顺序(0,1,2,3...)向聚合器发送数据,以及使用聚合器内的数据的api如下:

顶点提供值给聚合器:

顶点使用聚合器:

八、安装Hama

  见文章:

九、编写Hama job

  在eclipse下新建Java Project,将hama安装时需要的jar包全部导入工程。

官网中计算PI的例子:

(代码见官网文档)

  将工程Export成Jar文件,发到集群上运行。运行命令:

  $HAMA_HOME/bin/hama jar jarName.jar

  输出:

从BSP模型到Apache Hama

Current supersteps number: 0()

Current supersteps number: 4()

The total number of supersteps: 4(总超级步数目)

Counters: 8(一共8个计数器)

SUPERSTEPS=4(BSPMaster超级步数目)

LAUNCHED_TASKS=3(共多少个task)

org.apache.hama.bsp.BSPPeerImpl$PeerCounter

SUPERSTEP_SUM=12(总共的超级步数目,task数目*BSPMaster超级步数目)

MESSAGE_BYTES_TRANSFERED=48(传输信息字节数)

TIME_IN_SYNC_MS=657(同步消耗时间)

TOTAL_MESSAGES_SENT=6(发送信息条数)

TOTAL_MESSAGES_RECEIVED=6(接收信息条数)

TASK_OUTPUT_RECORDS=2(任务输出记录数)

PageRank例子:

(代码见附件)

输出:

从BSP模型到Apache Hama

十、相关知识介绍

PRAM模型

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/03c4ef9b84c2f74409e2436d679f2132.html