启动zookeeper_Giraph源码分析(一)—启动ZooKeeper服务

作者 | 白松

Giraph介绍:

Apache Giraph is an iterative graph processing system built for high scalability. For example, it is currently used at Facebook to analyze the social graph formed by users and their connections. Giraph originated as the open-source counterpart to Pregel, the graph processing architecture developed at Google and described in a 2010 paper. Both systems are inspired by the Bulk Synchronous Parallelmodel of distributed computation introduced by Leslie Valiant. Giraph adds several features beyond the basic Pregel model, including master computation, sharded aggregators, edge-oriented input, out-of-core computation, and more. With a steady development cycle and a growing community of users worldwide, Giraph is a natural choice for unleashing the potential of structured datasets at a massive scale.

原理:

Giraph基于Hadoop而建,将MapReduce中Mapper进行封装,未使用reducer。在Mapper中进行多次迭代,每次迭代等价于BSP模型中的SuperStep。一个Hadoop Job等价于一次BSP作业。基础结构如下图所示。

1612d0f504335720d64317786f548feb.png

每部分的功能如下:

1. ZooKeeper: responsible for computation state

–partition/worker mapping

–global state: #superstep

–checkpoint paths, aggregator values, statistics

2. Master: responsible for coordination

–assigns partitions to workers

–coordinates synchronization

–requests checkpoints

–aggregates aggregator values

–collects health statuses

3. Worker: responsible for vertices

–invokes active vertices compute() function

–sends, receives and assigns messages

–computes local aggregation values

cb131530136fd164db0828a52e89ce66.png

说明

(1)实验环境

三台服务器:test165、test62、test63。test165同时是JobTracker和TaskTracker.

测试例子:官网自带的SSSP程序,数据是自己模拟生成。

运行命令:Hadoop jar giraph-examples-1.0.0-for-hadoop-0.20.203.0-jar-with-dependencies.jar org.apache.giraph.GiraphRunner org.apache.giraph.examples.SimpleShortestPathsVertex -vif org.apache.giraph.io.formats.JsonLongDoubleFloatDoubleVertexInputFormat -vip /user/giraph/SSSP -of org.apache.giraph.io.formats.IdWithValueTextOutputFormat -op /user/giraph/output-sssp-debug-7 -w 5

(2)为节约空间,下文中所有代码均为核心代码片段。

(3)core-site.xml中hadoop.tmp.dir的路径设为:/home/hadoop/hadooptmp

(4)写本文是多次调试完成的,故文中的JobID不一样,读者可理解为同一JobID.

(5)后续文章也遵循上述规则。

org.apache.giraph.graph.GraphMapper类

Giraph中自定义org.apache.giraph.graph.GraphMapper类来继承Hadoop中的 org.apache.hadoop.mapreduce.Mapper类,覆写了setup()、map()、cleanup()和run()方法。GraphMapper类的说明如下:

“This mapper that will execute the BSP graph tasks alloted to this worker. All tasks will be performed by calling the GraphTaskManager object managed by this GraphMapper wrapper classs. Since this mapper will not be passing data by key-value pairs through the MR framework, the Mapper parameter types are irrelevant, and set to Object type.”

BSP的运算逻辑被封装在GraphMapper类中,其拥有一GraphTaskManager对象,用来管理Job的tasks。每个GraphMapper对象都相当于BSP中的一个计算节点(compute node)。

在GraphMapper类中的setup()方法中,创建GraphTaskManager对象并调用其setup()方法进行一些初始化工作。如下:

bc1a27d7649dd01225c5c703bb32fdfd.png

map()方法为空,因为所有操作都被封装在了GraphTaskManager类中。在run()方法中调用GraphTaskManager对象的execute()方法进行BSP迭代计算。

10d8d766aa680e9f1eaad361535e03e9.png

org.apache.giraph.graph.GraphMapper类

功能:The Giraph-specific business logic for a single BSP compute node in whatever underlying type of cluster our Giraph job will run on. Owning object will provide the glue into the underlying cluster framework and will call this object to perform Giraph work.

下面讲述setup()方法,代码如下:

1b3eb422931572ee67013b5bbe9c4751.png

依次介绍每个方法的功能:

1、locateZookeeperClasspath(zkPathList)

找到ZK jar的本地副本,其路径为:/home/hadoop/hadooptmp/mapred/local/taskTracker/root/jobcache/job_201403270456_0001/jars/job.jar ,用于启动ZooKeeper服务。

2、startZooKeeperManager(),初始化和配置ZooKeeperManager。

定义如下:

3b9d815f89079fafaa1c016d3bc0a5c8.png

3、org.apache.giraph.zk.ZooKeeperManager 类

功能:Manages the election of ZooKeeper servers, starting/stopping the services, etc.

ZooKeeperManager类的setup()定义如下:

9f7adbcd0e02079e0bea9c5bc4f8a8b4.png

createCandidateStamp()方法在 HDFS上 的_bsp/_defaultZkManagerDir/job_201403301409_0006/_task 目录下为每个task创建一个文件,文件内容为空。文件名为本机的Hostname+taskPartition,如下截图:

e8262fbe04c7fb6a723b1570bf1f366a.png

运行时指定了5个workers(-w 5),再加上一个master,所有上面有6个task。

getZooKeeperServerList()方法中,taskPartition为0的task会调用createZooKeeperServerList()方法创建ZooKeeper server List,也是创建一个空文件,通过文件名来描述Zookeeper servers。

2861400d6de28eea91c0f7b2f016cb12.png

首先获取taskDirectory(_bsp/_defaultZkManagerDir/job_201403301409_0006/_task)目录下文件,如果当前目录下有文件,则把文件名(Hostname+taskPartition)中的Hostname和taskPartition存入到hostNameTaskMap中。扫描taskDirectory目录后,若hostNameTaskMap的size大于serverCount(等于GiraphConstants.java中的ZOOKEEPER_SERVER_COUNT变量,定义为1),就停止外层的循环。外层循环的目的是:因为taskDirectory下的文件每个task文件时多个task在分布式条件下创建的,有可能task 0在此创建server List时,别的task还没有生成后task文件。Giraph默认为每个Job启动一个ZooKeeper服务,也就是说只有一个task会启动ZooKeeper服务。

经过多次测试,task 0总是被选为ZooKeeper Server ,因为在同一进程中,扫描taskDirectory时,只有它对应的task 文件(其他task的文件还没有生成好),然后退出for循环,发现hostNameTaskMap的size等于1,直接退出while循环。那么此处就选了test162 0。

最后,创建了文件:_bsp/_defaultZkManagerDir/job_201403301409_0006/zkServerList_test162 0

809e09b6b61836fe18cb8c2308cb230a.png

onlineZooKeeperServers(),根据zkServerList_test162 0文件,Task 0 先生成zoo.cfg配置文件,使用ProcessBuilder来创建ZooKeeper服务进程,然后Task 0 再通过socket连接到ZooKeeper服务进程上,最后创建文件 _bsp/_defaultZkManagerDir/job_201403301409_0006/_zkServer/test162 0 来标记master任务已完成。worker一直在进行循环检测master是否生成好 _bsp/_defaultZkManagerDir/job_201403301409_0006/_zkServer/test162 0即worker等待直到master上的ZooKeeper服务已经启动完成。

启动ZooKeeper服务的命令如下:

ad59bd5708acf3ebd79f4bef38182052.png

4、determineGraphFunctions()。

GraphTaskManager类中有CentralizedServiceMaster对象和CentralizedServiceWorker 对象,分别对应于master和worker。每个BSP compute node扮演的角色判定逻辑如下:

a) If not split master, everyone does the everything and/or running ZooKeeper.

b) If split master/worker, masters also run ZooKeeper

c) If split master/worker == true and giraph.zkList is set, the master will not instantiate a ZK instance, but will assume a quorum is already active on the cluster for Giraph to use.

该判定在GraphTaskManager 类中的静态方法determineGraphFunctions()中定义,片段代码如下:

b5c64d013c053bb6bd0be776c7aa09cf.png

默认的,Giraph会区分master和worker。会在master上面启动zookeeper服务,不会在worker上启动ZooKeeper服务。那么Task 0 就是master+ZooKeeper,其他Tasks就是workers。

更多技术文章可以查看“了解更多”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MFC】MFC中调用系统软键盘的几种方法

1.直接运行微软系统自带的虚拟键盘程序“osk.exe” 在普通MFC项目中可以调用ShellExecute或者WinExec方法来直接运行微软系统自带的虚拟键盘程序“osk.exe”,十分方便一句话就可以搞定。ShellExecute: ShellExecute(GetSafeHwnd(), NULL, _T("osk.e…

委派用户管理Hyper-v

在安装完成Hyper-v以后,默认情况下,只有管理员组的成员才有权限去管理Hyper-v,做一些诸如管理网络,管理虚拟机,管理磁盘等等的操作,普通用户没这个权限,从应用角度来说,如果公司所有…

pb 动态改变DW的WHERE子句

PB心得4-动态改变DW的WHERE子句 在DW的FILTER的使用一文中提到如果检索条件因素不固定的话,可以使用动态改变DW的WHERE子句的方法。 这个方法的实现是这样的,做一个没有参数的DW,在程序中,先通过DW.OBJECT.DATAWINDOW.TABLE.SEL…

这才是真正的蛙泳,还挺能蹦跶......

1 这才是真正的蛙泳▼2 给你们看看我平时藏起来的可爱▼3 沈腾这rap唱的跟闹着玩儿的似的▼4 能不能好好说话?▼5 建议再配套一张肛肠医院代金券▼6 这是我军培养出来的【特工鹅】吗?盯梢技能太强了▼7 钓鱼翻车现场▼你点的每个赞,我…

缓存机制 java_缓存机制:java中缓存的原理

外存:也就是我们经常说的(CDEF盘的大小)外储存器是指除计算机内存及CPU缓存以外的储存器,此类储存器一般断电后仍然能保存数据。常见的外存储器有硬盘、软盘、光盘、U盘等,一般的软件都是安装在外存中内存:内存是计算机中重要的部…

docker-compose 一键部署分布式配置中心Apollo

简介说起分布式肯定要想到分布式配置中心、分布式日志、分布式链路追踪等在分布式部署中业务往往有很多配置比如: 应用程序在启动和运行时需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数据库连接参数、启动参数等,都需…

python调用gpu进行运算_用python做GPU计算(1)——安装以及配置

实验小白鼠:联想Y470 显卡 GT550M 操作系统 ubuntu12.04 64位 python2.7ubuntu12.04 需要重新安装显卡驱动,不过可以直接安装cuda_5.0.35_linux_64_ubuntu11.10-1.run 程序包,会一并更新显卡驱动这是官方的下载地址https://developer.nvidia.…

Sharepoint Designer 2007 Workflow

参考 http://office.microsoft.com/en-us/sharepoint-designer-help/collect-data-from-a-user-in-a-workflow-HA010209808.aspx 注意 这里的Review Document是一个Task List, 应该在site里面创建一个task list,可以用默认的Tasks.转载于:https://www.cnblogs.com/F…

各种排序算法及其实现总结

排序算法总结 1.插入排序 一般来说,插入排序 都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序&…

uva705--slash maze

/*这道题我原本是将斜线迷宫扩大为原来的两倍,但是在这种情况下对于在斜的方向上的搜索会变的较容易出错,所以参考了别人的思路后将迷宫扩展为原来的3倍,这样就变成一般的迷宫问题了*/ 1 #include"iostream"2 #include"stdio.…

重磅公开!集14位名师教案的《最全高中数学解题思想方法汇编》

全世界只有3.14 % 的人关注了爆炸吧知识解数学题,除了掌握有关的数学知识之外,最好掌握一定的解题技巧甚至知道点解题思想。要知道高考试题的解答过程中蕴含着重要的数学思想方法,如果能有意识地在解题过程中加以运用,势必会取得很…

极域课堂管理系统软件如何取消控制_智慧物流自动化智能仓储管理架构分析

现阶段,智慧物流(ztmapinfo.com.)成为了时事热点,获得物流界广泛关注。许多 物流自动化系统、物流自动化设备都打出了智慧物流的幌子,在刚结束了的CeMAT亚洲物流展上,宣传展现智慧物流技术与商品的公司增加…

控制 Redis stream 的消息数量

控制 Redis stream 的消息数量IntroRedis Stream 是 Redis 5.0 引入的一个新的类型,之前我们介绍过使用 Redis Stream 来实现消息队列,可以参考之前的文章 使用 Redis Stream 实现消息队列,而 Stream 的消息会持久化地内存中,如果…

java oom-killer_与Linux OOM-killer的第一次亲密接触

From1、最近一段时间(更换了预发机器后)我负责的一个应用的预发环境(线上稳定得像个婴儿~)特别不稳定,最先是应用频频的过几天就发现提供的接口不工作了,但容器Jetty还在跑得欢,于是jstack/jmap看,发现没有一个线程在跑我的war包中…

CentOS+lighttpd+php+mysql (fastcgi)环境的搭建(转)

呵呵!觉得有必要把今晚的装lighttpd的经验和过程给记录下来! 第一次写这样的文章,有什么不足的地方请高手们指出并给与修正!下面开始! 第一步:系统的安装! 菜鸟的朋友们,可以先去lin…

vpx8运行待解决问题

一开始运行的时候是因为找不到HAVE_CONFIG_H他的定义,所以编译无法通过,找了好久还是没有找到,所以就先把它给注释掉了,结果运行的时候还是无法通过,运行的结果如下: 希望赶紧找到解决的办法 1>------ B…

led灯具供货合同

美高森美与索尼合作推出首款具3D功能的定时控制器与局部调光LED背光组合解决方案在刚刚结束的第十一届国际集成电路研讨会暨展览会(IIC-China 2011)上,美高森美公司(Microsemi)展示了与索尼合作推出的目前市场上首款具有3D功能的定时控制器与…

startindex 不能大于字符串长度_玩转云端丨redis的5种对象与8种数据结构之字符串对象(下)...

引言本文是对《redis设计与实现(第二版)》中数据结构与对象相关内容的整理与说明。本篇文章只对对象结构,1种对象——字符串对象。以及字符串对象所对应的两种编码——raw和embstr,进行了详细介绍。表达一些本人的想法与看法,也希望更多朋友一…

网友半夜差点被沐浴露吓死,众人:原来不止我胆小....

全世界只有3.14 % 的人关注了爆炸吧知识微博上有网友爆料说,他半夜上厕所差点被沐浴露吓死!这么看可能不明显但是关灯的时候.....啊啊啊啊啊~结果引来众多网友的共鸣,原来大家都有类似遭遇....比如,你有被饮水机吓到过…

.NET 6 RC1 正式发布

昨天晚上微软发布了.NET 6的两个RC版本中的第一个版本,该版本将于11月正式发布,作为在开源MIT协议下整合所有不同的.NET开发模组件的开源跨平台实现。这是一个从2014年开始,持续多年的,以改变应用开发游戏规则的努力,由…