Giraphソースコード解析(A) - のZooKeeperサービスを開始

著者|ホワイトパイン

[注:この記事はオリジナルで、ブロガーとの接触を転載引用。]

Giraphの説明:

ApacheのGiraphは、高いスケーラビリティのために構築された反復グラフ処理システムです。例えば、現在のユーザーとその接続により形成されたソーシャルグラフを分析するためのFacebookで使用されています。Giraphは、プレゲルにオープンソースの対応、グラフ処理アーキテクチャGoogleの開発と2010年の論文に記載されているように始まりました。両方のシステムは、レスリー・ヴァリアントによって導入された分散計算のバルク同期Parallelmodelに触発されています。Giraphは、マスタ計算、かけらアグリゲータ、エッジ指向の入力、アウトオブコア計算、などを含む基本的なプレゲルモデルを超えていくつかの機能を追加します。着実な開発サイクルと世界中のユーザーの成長のコミュニティでは、Giraphは、大規模なスケールで構造化されたデータセットの潜在能力を解き放つための自然な選択です。

原理:

Giraph HadoopのMapReduceのマッパーに建てられたベースは、未使用の減速をカプセル化。マッパー複数の反復、各反復は、BSPモデルSuperStepと等価です。仕事へのHadoopジョブBSP相当。図に示すように、インフラストラクチャ。

Giraphソースコード解析(A) - のZooKeeperサービスを開始

次のように各部の機能は以下のとおりです。

1.のZooKeeper:計算状態の責任

-partition /ワーカーマッピング

-global状態:#superstep

-checkpoint経路、アグリゲータ値、統計

2.マスター:コーディネートを担当します

労働者にパーティションを-assigns

-coordinates同期

-requestsチェックポイント

アグリゲータ値-aggregates

健康状態を-collects

3.労働者:頂点の責任

アクティブ頂点()関数を計算-invokes

-sends、メッセージを受信し、割り当て

地元の集計値を-computes

Giraphソースコード解析(A) - のZooKeeperサービスを開始

説明

(1)実験環境

3つのサーバ:test165、test62、test63。test165もJobTrackerとTaskTrackerです。

テストケース:公式サイトはSSSPプログラム、自分自身のシミュレーションを生成されたデータを付属しています。

运行命令:Hadoopのジャーgiraph-例-1.0.0-FOR-Hadoopの-0.20.203.0-ジャー-WITH-dependencies.jar org.apache.giraph.GiraphRunner org.apache.giraph.examples.SimpleShortestPathsVertex -vif org.apache。 giraph.io.formats.JsonLongDoubleFloatDoubleVertexInputFormat -VIP /ユーザ/ giraph / SSSP -of org.apache.giraph.io.formats.IdWithValueTextOutputFormat -OP /ユーザ/ giraph /出力SSSPデバッグ-7 -w 5

(2)スペースを節約するために、以下のすべてのコードスニペットのコアです。

(3)コアのsite.xml hadoop.tmp.dir設定パス:/ホーム/ Hadoopの/ hadooptmp

(4)この記事は、いくつかのデバッグが完了すると、それはジョブIDのテキストと同じではない書かれた、読者は、同じジョブIDと理解することができます。

(5)フォローアップ記事は、上記の規則に従います。

org.apache.giraph.graph.GraphMapper类

Giraph org.apache.giraph.graph.GraphMapperのカスタムクラスは、)(、)(マップを設定を上書きし、Hadoopのorg.apache.hadoop.mapreduce.Mapper <オブジェクト、オブジェクト、オブジェクト、オブジェクト>クラスで継承しますクリーンアップ()とrun()メソッド。記述GraphMapperクラスは次のとおりです。

この作業者にalloted BSPグラフのタスクを実行します「これはマッパ。すべてのタスクは、このGraphMapperラッパーclasssによって管理GraphTaskManagerオブジェクトを呼び出すことによって実行されます。このマッパは、MRフレームワークを介して、キーと値のペアによってデータを渡すことがないので、マッパーパラメータタイプは無関係、およびタイプをオブジェクトに設定されています「。

BSP算術論理は、ジョブ・タスクを処理するためGraphTaskManagerオブジェクトを有するGraphMapperクラスにカプセル化されます。各オブジェクトは、でGraphMapperの計算ノード(計算ノード)BSPに相当します。

セットアップ方法(GraphMapperクラスで)、GraphTaskManagerオブジェクトを作成し、その設定()メソッドいくつかの初期化作業を呼び出します。次のように:

Giraphソースコード解析(A) - のZooKeeperサービスを開始

全ての操作はGraphTaskManagerクラスにカプセル化されているので、マップ()メソッドは、空です。run()メソッドでGraphTaskManager呼び出しオブジェクトは、()メソッドのBSP反復計算を実行します。

Giraphソースコード解析(A) - のZooKeeperサービスを開始

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()方法,代码如下:

Giraphソースコード解析(A) - のZooKeeperサービスを開始

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

1、locateZookeeperClasspath(zkPathList)

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

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

定义如下:

Giraphソースコード解析(A) - のZooKeeperサービスを開始

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

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

ZooKeeperManager类的setup()定义如下:

Giraphソースコード解析(A) - のZooKeeperサービスを開始

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

Giraphソースコード解析(A) - のZooKeeperサービスを開始
运行时指定了5个workers(-w 5),再加上一个master,所有上面有6个task。

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

Giraphソースコード解析(A) - のZooKeeperサービスを開始

首先获取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

Giraphソースコード解析(A) - のZooKeeperサービスを開始

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服务的命令如下:

Giraphソースコード解析(A) - のZooKeeperサービスを開始

4、determineGraphFunctions()。

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

マスターを分割しない場合a)に、誰もがすべてのものおよび/または実行中のZooKeeperを行います。
b)は、マスター/労働者を分割した場合、マスターはまたのZooKeeperの実行
分割マスター/労働者が==真とgiraph.zkListが設定されている場合c)を、マスターは、ZKのインスタンスをインスタンス化しませんが、クォーラムがために、クラスタ上ですでにアクティブであると仮定します使用するGiraph。

静的メソッド()は、次のコードで定義されdetermineGraphFunctions GraphTaskManagerクラスで決定されます。

Giraphソースコード解析(A) - のZooKeeperサービスを開始

デフォルトでは、Giraphはマスターと労働者の間で区別します。飼育係のサービスは、労働者に起動しないのZooKeeperサービス上のマスターで起動します。まあタスク0は、その労働者のマスター+のZooKeeper、他のタスクがあります

おすすめ

転載: blog.51cto.com/14463231/2422571