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.进程间通信接口如下:
下面是一个发送接收消息的例子:
4.在我们自己的BSP类中还有setup()和cleanup()两个方法,分别在bsp()方法之前和之后执行,可以对这两个方法重写,完成一些需求。BSP类概要如下图:
Graph
1. hama提供了Graph包,支持顶点为中心的图计算,使用较少的代码就可以实现google Pregel风格的应用。
实现一个Hama Graph应用包括对预定义的Vertex类进行子类化,模板参数涉及3种类型,顶点、边和消息( vertices, edges, and messages ):
用户重写compute()方法,该方法将在每个超步的活跃顶点中执行。Compute()方法可以查询当前顶点及其边的信息,并向其他顶点发送消息。
2.通过继承 org.apache.hama.graph. VertexInputReader 类,根据自己的文件格式创建自己的 VertexReader,示例如下:
通过继承org.apache.hama.graph.AbstractAggregator类,可以编写自己的聚合器。聚合器用来做全局的通信、监控等。超步内所有的顶点都可以给聚合器一个值,聚合器整合所有点提供的值,在下一个超步每个顶点都可以使用聚合器整合后的值。在一个job里可以使用多个聚合器,只需要在创建job时注册一下即可,注册如下:
顶点使用聚合器是按聚合器注册时的顺序(0,1,2,3...)向聚合器发送数据,以及使用聚合器内的数据的api如下:
顶点提供值给聚合器:
顶点使用聚合器:
八、安装Hama
九、编写Hama job
在eclipse下新建Java Project,将hama安装时需要的jar包全部导入工程。
官网中计算PI的例子:
(代码见官网文档)
将工程Export成Jar文件,发到集群上运行。运行命令:
$HAMA_HOME/bin/hama jar jarName.jar
输出:
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例子:
(代码见附件)
输出:
十、相关知识介绍
PRAM模型