Hadoop系统架构中的RPC

一、 引言和背景:

       Hadoop是一种分布式系统基础架构,在现阶段的海量数据分布式存储和计算中应用的主流架构中,Hadoop是应用较为广泛的一种。Hadoop是由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储。Hadoop实现了一个HDFS分布式文件系统,它是一个可以更容易开发和运行处理大规模数据的软件平台。

        RPC(Remote Procedure Call Protocol),是远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC跨越了网络通信模型中的传输层和应用层,使得开发包括挽留过分布式多程序在内的应用程序更加容易。

二、Hadoop和RPC:

       Hadoop在概念上和结构上都是将程序或者说任务作业分成了两个部分,程序的逻辑计算部分和数据部分。因为针对于海量数据的处理,数据本身需要占用大量的空间,计算工作也自然需要耗费计算机资源。在Hadoop的框架中实现了data distribution和computation distribution即数据分布和计算分布两个部分。

       而无论是在数据部分还是计算部分,Hadoop都是采用master/slave node的架构,首先master将数据分散到各个slave node上,然后根据move-code-to-data的原则,将计算也分散到各个slave node上。       对于计算部分,jobtracter是master node,tasktracter是slave node;而对于数据部分,Namenode 是 master node,Datanode是 slave node;另外,secondary namenode是Namenode的backup 是对于其容错性的一个保证。

       在Hadoop分布式架构中,上述情况对应的master和salve之间的通信以及Namenode和secondary Namenode之间的通信都是通过RPC实现的。与Hadopp的master/salve结构对应,RPC实现用server/client的形式。

三、RPC中Server和client的工作模式:

       RPC Server作为服务提供者由两个部分组成:接收Call调用和处理Call调用。

接收Call调用负责接收来自RPC Client的调用请求,编码成Call对象后放入到Call队列中。这一过程由Listener线程完成。具体步骤:  Listener线程监视RPC Client发送过来的数据。 当有数据可以接收时,调用Connection的readAndProcess方法。 Connection边接收边对数据进行处理,如果接收到一个完整的Call包,则构建一个Call对象PUSH到Call队列中,由Handler线程来处理Call队列中的所有Call。

处理Call调用负责处理Call队列中的每个调用请求,由Handler线程完成: Handler线程监听Call队列,如果Call队列非空,按FIFO规则从Call队列取出Call。将Call交给RPC.Server处理。 借助JDK提供的Method,完成对目标方法的调用,目标方法由具体的业务逻辑实现。返回响应。Server.Handler按照异步非阻塞的方式向RPC Client发送响应,如果有未发送出的数据,则交由Server.Responder来完成。

每一个Call都是由RPC Client发起。

步骤说明:RPC Client发起RPC Call,通过JAVA反射机制转化为对Client.call调用。调用getConnection得到与RPC Server的连接。每一个RPC Client都维护一个HashMap结构的到RPC Server的连接池。通过Connection将序列化后的参数发送到RPC服务端。阻塞方式等待RPC服务端返回响应。

特别地,在分布式程序中,slave node通过此种心跳的call来和master node进行联系,来报告此salve node的状态,master通过处理call的程序作出响应,master不主动联系salve。

四、MapReduce:

       MapReduce是Hadoop中jobtracter和tasktracter中使用的处理机制,大体可分为mapper和reducer两个部分,初步理解可以为具体操作数据的工具。相对应于HDFS。

五、Hadoop中基于RPC的通信协议:

      这里介绍几个比较核心的。

      1、InterTrackerProtocol (TaskTracker & JobTracker通信协议) 

 TaskTracker每隔一段时间向JobTracker发送heartbeat提交当前TaskTracker所在机器的内存,CPU,磁盘等状态信息,是否可以接收新任务等信息;JobTracker接收到 heartbeat给TaskTracker返回需要所做的job或task操作,是否开启新的任务。TaskTracker可以从取得JobTracker取得当前文件系统路径,需要执行Job的Jar文件 路径等。 

2、JobSubmissionProtocol(JobClient & JobTracker 之间通信) 

主要用来提交,执行Job和取得当前Job状态;JobClient可以通过此协议提交Job(submitJob),取得当前job的参数,状态,Counter,Task状态,文件系统路径,jar文件路径,所有job的状态,还有Job队列的信息,此外JobClient还可以提交KillJob和设定Job优先级等任务到JobTracker。 

3. TaskUmbilicalProtocol (Child & TaskTracker)

Child通过此协议,查看TaskTracker是否存在,取得任务,报告任务的进度,状态,出错信息,Commit文件到HDFS,并取得map结果给reduce;TaskTracker接收任务并监控任务的进度。

五、参考文献:

       http://www.csdn.net/article/2012-08-30/2809380-understanding-hadoop-clusters-and-the-ne

       http://code.google.com/intl/zh-CN/edu/parallel/mapreduce-tutorial.html

       http://zhangyiqian.iteye.com/blog/1153254

       http://blog.csdn.net/onlyqi/article/details/6889684

       http://www.cnblogs.com/MGGOON/archive/2012/02/24/2367231.html

       http://www.tbdata.org/archives/1413

       Hadoop源码分析

posted on 2012-12-29 15:42  vince67  阅读(261)  评论(0编辑  收藏  举报

导航