厦门大学林子雨编著Word文档格式.docx
《厦门大学林子雨编著Word文档格式.docx》由会员分享,可在线阅读,更多相关《厦门大学林子雨编著Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
上机练习说明
E-mail:
ziyulin@个人主页:
1作业题目
图计算框架Hama基础操作实践。
2作业目的
旨在让学生了解Pregel图计算模型,并学会用Pregel的开源实现Hama实现一些基本操作。
3作业性质
课后作业,必做,作为课堂平时成绩。
4作业考核方法
提交上机实验报告,任课老师根据上机实验报告评定成绩。
5作业提交日期与方式
图计算章节内容结束后的下一周周六晚上9点之前提交。
6作业准备
请阅读厦门大学林子雨编著的大数据专业教材《大数据技术原理与应用》(官网:
6.1、Hama计算框架的安装配置
ApacheHama是GooglePregel的开源实现,与Hadoop适合于分布式大数据处理不同,Hama主要用于分布式的矩阵、graph、网络算法的计算。
简单说,Hama是在HDFS上实现的BSP(BulkSynchronousParallel)计算框架,弥补Hadoop在计算能力上的不足。
(1).安装好合适版本的jdk和hadoop,并且进行测试,保证他们能用。
(2).下载hama安装文件,从http:
//hama.apache.org/downloads.html处下载合适的版本,我当时下的是0.6.4版本的。
(3).在用户主目录下创建合适的安装目录文件,我这里是在~下创建了hama文件夹作为安装目录,即~/hama为安装目录。
(4).将下载好的hama-0.6.4.tar.gz拷贝到~/hama中去,并用tarzvxfhama-0.6.4.tar.gz进行解压。
(5).进入hama-0.6.4中的conf文件夹,修改hama-env.sh文件,在其中加入java的home路径,即加入:
ExportJAVA_HOME=/home/wanglianping/java/jdk.1.7.0_91
(
6).修改
hama-site.xml文件,这时hama配置的核心文件,具体内容如下:
<
configuration>
<
property>
name>
bsp.master.address<
/name>
value>
192.168.91.128:
40000<
/value>
description>
Theaddressofthebspmasterserver.Eitherthe
literalstring"
local"
orahost:
portfordistributedmode
/description>
/property>
fs.default.name<
hdfs:
//192.168.91.128:
9000/<
Thenameofthedefaultfilesystem.Eithertheliteralstring
"
portforHDFS.
hama.zookeeper.quorum<
192.168.91.128<
CommaseparatedlistofserversintheZooKeeperQuorum.
Forexample,"
,"
.
Bydefaultthisissettolocalhostforlocalandpseudo-distributedmodes
ofoperation.Forafully-distributedsetup,thisshouldbesettoafull
listofZooKeeperquorumservers.IfHAMA_MANAGES_ZKissetinhama-env.sh
thisisthelistofserverswhichwewillstart/stopzookeeperon.
hama.zookeeper.property.clientPort<
2181<
/configuration>
其中,bsp.master.address即bsp中的BSPMaster的地址和端口。
fs.default.name这个值要特别注意,是hadoop中nameNode的地址和端口,因为hama要用到hadoop的hdfs分布式文件系统。
剩下的俩个是zookeeper的相关配置。
(7).另外,在conf文件夹下还有一个groomservers文件,这个在分布式环境下配置groomserver的地址,在单机模式下就不用配置了,里面默认值为localhost。
同时,你也可以在~/.bashrc中添加hama的环境变量,这样每次启动就不同转到相应的目录下去了。
(8).启动hadoop,并验证是否启动成功。
命令:
HADOOP_HOME/bin/start-all.sh,如果启动成功,如下:
启动hama,命令:
HAMA_HOME/bin/start-bspd.sh,结果如下:
出现上述结果,则表明hama已经成功启动。
6.2、用Hama计算模型实现寻找最大独立集问题算法
(1).本算法参考Luby'
sclassicparallelalgorithm《asimpleparallelalgorithmformaximalindependentsetproblem》,把顶点分为三类:
1)S:
TheMISbeingconstructed.Startsemptyandgrowsiniterations.
2)NotInS:
VerticesthathaveatleastoneedgetoavertexinSandasaresultcannotbeinS.
3)Unknown:
VerticesthatdonothaveanedgetoanyvertexinSbutarenotyetinS.
(2).Hama模型下MIS(MaximalIndependentSet)算法描述。
1)初始时,把所有顶点的value值赋值为自己的vertexID,表明初始所有顶点均在UnKnown集合中,然后把自己的VertexID发送给邻接顶点。
2)若顶点u的VertexID比自己所有邻接顶点都小,则该顶点进入S集合中,并发送neighbor-in-set消息给所有邻接顶点,通知它们退出Unknown集合进入到NotInS集合中,并最后把u置为InActive状态;
否则,顶点u继续保持UnKnown状态。
3)S集合中顶点的邻接顶点收到neighbor-in-set消息,则该顶点进入NotInS,并且设置为Inactive状态。
返回继续迭代,直到UnKnown集合为空。
(3).程序中按照顶点value取值不同来区分顶点的类别,具体如下:
1)value等于vertexID,表示顶点在Unknown集合中;
2)value等于-1,表示顶点在S集合中
3)value等于-2,表示顶点在NotInS集合中。
当所有顶点进入S或者NotInS集合中,就停止计算,表明已找到一个MIS。
源码如下:
packagegraph.mis;
importjava.io.IOException;
importjava.util.Iterator;
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.Path;
importorg.apache.hadoop.io.LongWritable;
importorg.apache.hadoop.io.NullWritable;
importorg.apache.hadoop.io.Text;
importorg.apache.hama.HamaConfiguration;
importorg.apache.hama.bsp.HashPartitioner;
importorg.apache.hama.bsp.TextInputFormat;
importorg.apache.hama.bsp.TextOutputFormat;
importorg.apache.hama.graph.Edge;
importorg.apache.hama.graph.GraphJob;
importorg.apache.hama.graph.Vertex;
importorg.apache.hama.graph.VertexInputReader;
publicclassFindMIS{
publicstaticclassMISVertexextends
Vertex<
LongWritable,NullWritable,LongWritable>
{
@Override
publicvoidcompute(Iterator<
LongWritable>
messages)throwsIOException{
if(getSuperstepCount()==0){
setValue(getVertexID());
sendMessageToNeighbors(getValue());
}else{
if(getValue().get()==-2){
voteToHalt();
}else{
booleanrevMsg=false;
while(messages.hasNext()){
revMsg=true;
longmsg=messages.next().get();
if(msg==-2){
setValue(newLongWritable(-2));
voteToHalt();
return;
}elseif(msg<
getValue().get()){
}
}
if(revMsg){
setValue(newLongWritable(-1));
sendMessageToNeighbors(newLongWritable(-2));
voteToHalt();
}else{
sendMessageToNeighbors(getValue());
}
}
}
}
publicstaticclassMISTextReaderextends
VertexInputReader<
LongWritable,Text,LongWritable,NullWritable,LongWritable>
publicbooleanparseVertex(LongWritablekey,Textvalue,
Vertex<
vertex)
throwsException{
String[]split=value.toString().split("
\t"
);
for(inti=0;
i<
split.length;
i++){
if(i==0){
vertex.setVertexID(newLongWritable(Long.parseLong(split[i])));
vertex.addEdge(newEdge<
LongWritable,NullWritable>
(
newLongWritable(Long.parseLong(split[i])),null));
returntrue;
publicstaticvoidmain(String[]args)throwsIOException,
InterruptedException,ClassNotFoundException{
if(args.length<
2){
System.err.println("
Usage:
input>
output>
"
System.exit(-1);
HamaConfigurationconf=newHamaConfiguration(newConfiguration());
GraphJobpageJob=newGraphJob(conf,FindMIS.class);
pageJob.setJobName("
FindaMIS"
pageJob.setMaxIteration(30);
pageJob.setVertexClass(MISVertex.class);
pageJob.setInputPath(newPath(args[0]));
pageJob.setOutputPath(newPath(args[1]));
pageJob.setVertexIDClass(LongWritable.class);
pageJob.setVertexValueClass(LongWritable.class);
pageJob.setEdgeValueClass(NullWritable.class);
pageJob.setInputKeyClass(LongWritable.class);
pageJob.setInputValueClass(Text.class);
pageJob.setInputFormat(TextInputFormat.class);
pageJob.setVertexInputReaderClass(MISTextReader.class);
pageJob.setPartitioner(HashPartitioner.class);
pageJob.setOutputFormat(TextOutputFormat.class);
pageJob.setOutputKeyClass(Text.class);
pageJob.setOutputValueClass(LongWritable.class);
pageJob.waitForCompletion(true);
}
(4).运行过程分析。
输入为无向图,测试图如下:
下面分析S集合中的顶点用深蓝色标注,NotInS集合用网状图案标注,UnKnown集合用白色标注。
S集合和NotInS集合中的顶点均是InActive状态,UnKnown集合中的顶点是Active状态。
1)步骤1:
在SuperStep0,每个顶点把自己的VertexID发送给邻接顶点,,如顶点0发送消息0到顶点1、4、6;
顶点1发送消息1到顶点0、3;
顶点6发送消息6到顶点0、4、5。
其他顶点类似。
2)步骤2:
在SuperStep1,每个顶点收到邻接顶点发送的消息,如顶点0收到消息1、4、6,;
顶点1收到消息0、3;
只有顶点0比邻接顶点都小,故该顶点进入S集合,用深蓝色标注。
其他顶点继续在UnKnown集合中。
3).步骤3和步骤1(步骤1属于第二轮),在SuperStep2中,顶点0的邻接顶点收到neighbor-in-set消息(源码中用-2表示)进入NotInS集合中,即顶点1、4、6共3个顶点进入NotInS集合中,变为InActive状态。
同时顶点2、3、5依然是UnKnown状态,2、3、5分别向邻接顶点发送消息,顶点2向4、5发送消息;
顶点3向1、5发送消息;
顶点5向2、3、6发送消息。
4).步骤2(第二轮):
在SuperStep3中,NotInS集合中的顶点1、6和4收到消息后被系统自动激活变为Active状态,所以程序中对此情况有所处理,把顶点1、6、4直接置为Inactive状态,不做后续处理。
顶点2、3收到消息5比自身大,则2、3进入S集合中,而顶点5则相反继续在UnKnown集合中。
顶点2、3向邻接顶点1、4、5发送neighbor-in-set消息。
5)步骤3(第二轮):
在SuperStep4中,顶点1和顶点4同(4)步处理相同。
顶点5收到neighbor-in-set消息后进入NotInS集合中。
由于UnKnown集合中已没有顶点,不会再向外发送消息。
6)SuperStep5中,发现已没有活跃顶点且没有消息在传递,故结束计算。
(5).实验结果
HDFS的输出结果如下(-2表示NotInS,-1表示在S集合中):
0-1
4-2
2-1
3-1
6-2
5-2
1-2
7作业内容
作业内容:
用Hama编程实现教材中的单源最短路径问题。
请同学们参照前面的Hama的操作示例,完成这个习题,教材有相应的算法思想,完成后需要提交实验报告。
8实验报告
《大数据技术基础》实验报告
题目:
姓名
日期
实验环境:
实验内容与完成情况:
出现的问题:
解决方案(列出遇到的问题和解决办法,列出没有解决的问题):
任课教师介绍
林子雨(1978-),男,博士,厦门大学计算机科学系助理教授,主要研究领域为数据库,实时主动数据仓库,数据挖掘.
主讲课程:
《大数据技术基础》
办公地点:
厦门大学海韵园科研2号楼
ziyulin@
个人主页:
数据库实验室网站:
课程教材介绍
《大数据技术原理与应用——概念、存储、处理、分析与应用》,由厦门大学计算机科学系教师林子雨博士编著,是中国高校第一本系统介绍大数据知识的专业教材。
本书定位为大数据技术入门教材,为读者搭建起通向“大数据知识空间”的桥梁和纽带,以“构建知识体系、阐明基本原理、引导初级实践、了解相关应用”为原则,为读者在大数据领域“深耕细作”奠定基础、指明方向。
全书共有13章,系统地论述了大数据的基本概念、大数据处理架构Hadoop、分布式文件系统HDFS、分布式数据库HBase、NoSQL数据库、云数据库、分布式并行编程模型MapReduce、流计算、图计算、数据可视化以及大数据在互联网、生物医学和物流等各个领域的应用。
在Hadoop、HDFS、HBase和MapReduce等重要章节,安排了入门级的实践操作,让读者更好地学习和掌握大数据关键技术。
本书可以作为高等院校计算机专业、信息管理等相关专业的大数据课程教材,也可供相关技术人员参考、学习、培训之用。
欢迎访问《大数据技术原理与应用——概念、存储、处理、分析与应用》教材官方网站:
扫一扫访问教材官网
中国高校大数据课程公共服务平台介绍
中国高校大数据课程公共服务平台,由中国高校首个“数字教师”的提出者和建设者——林子雨老师发起,由厦门大学数据库实验室全力打造,由厦门大学云计算与大数据研究中心、海峡云计算与大数据应用研究中心携手共建。
这是国内第一个服务于高校大数据课程建设的公共服务平台,旨在促进国内高校大数据课程体系建设,提高大数据课程教学水平,降低大数据课程学习门槛,提升学生课程学习效果。
平台服务对象涵盖高校、教师和学生。
平台为高校开设大数据课程提供全流程辅助,为教师开展教学工作提供一站式服务,为学生学习大数据课程提供全方位辅导。
平台重点打造“9个1工程”,即1本教材(含官网)、1个教师服务站、1个学生服务站、1个公益项目、1堂巡讲公开课、1个示范班级、1门在线课程、1个交流群(QQ群、微信群)和1个保障团队。
平台主页:
扫一扫访问平台主页