跨机房的hadoop集群


http://www.cppblog.com/whspecial/archive/2013/10/27/203940.html



首先需要说明一点,跨机房hadoop可能应用场景并不是很多,国内像BAT这种巨头也许需要,但是大部分的中小公司也许并不需要这个,也许这是个屠龙之技,呵呵。

把这个问题分三段来讲,第一段是问题出现的背景,第二段是解决该问题的难点,第三段是最终的解决方案。

(一) 背景:

先要看下为什么需要做一个跨机房的大集群?

大集群的优点在于数据管理和授权容易(这个问题在一个多部门的大公司还是很重要的);跨部门的使用数据容易,无需重复拉取数据。

在集群达到一定规模时,单机房(机房内的容量是有限的)已经无法满足集群的需求了,要想一劳永逸的解决问题,需要建设一个跨机房的hadoop集群。

(二)技术挑战:

2.1 NameNode的性能问题:

         在管理一个巨大的hadoop集群时,由于原始的Namenode是单节点,因此会成为一个性能瓶颈,遇到的性能问题主要包括两方面:存储容量问题(存储元数据)和计算压力(处理rpc请求,修改内存树时候需要全局锁)问题。

         其中存储容量问题可以依赖内存的垂直扩展来解决,但是计算压力却很难通过提升硬件来解决(因为目前厂商的主要发展方向是多核,而非提高主频)

2.2机房之间的网络限制:

         机房之间的网络永远是个硬件条件的限制,跨机房的网络传输带来了数据延时和带宽限制:

1, 延时一般是在10ms之内,而hadoop上大部分运行的是离线作业,基本可接受

2, 带宽限制的问题比较大,因为单机房内的点对点带宽一般是在1Gbps,而机房之间的带宽确在20Mbps左右,非常有限。

2.3资源组之间的管理

         每个部门可以看做一个资源组,它们可能会互相使用对方的数据,因此如何规划计算和存储的位置就很重要,否则会在多个机房之间出现大量的数据拷贝。

(三)解决方案:

先看下整个跨集群hadoop的架构图:


 

重点介绍里面三点,也就是和上面三个问题相对应的:

1, 可以看到这里画出了两个NNnamenode),它们实际上还是属于一个hadoop集群,这是业界里的一个解决方案:HDFS Fedaration,它为了解决元数据节点性能问题;

2, 可以看到这里有一个cross node节点,它是用来在两个机房之间同步数据的,它的设计考虑到了机房间的网络限制;

3, 最后是groupAgroupB,这是为了解决数据产出方和使用方关系来用的。

3.1 Federation

Federation相关资料见:

http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/Federation.html#HDFS_Federation


为了水平扩展Namenodefederation使用了多个互相独立的namenode。它们之间互相不需要通信,每个datenode需要向全部namenode注册并发送信息。

BlockPool是属于一个namenodeblock集合,每个blockpool之间也是互相独立的。

         federation里,有一个需要关注的问题,就是多个namenode的地址如何对用户进行透明?它采用的解决方案是目录树挂载的方案(社区有个viewFS,应该就是为了解决这个问题):熟悉linux或者nfs的朋友应该都知道mount这个概念,目录树挂载就是这个意思。

不过使用目录树挂载也存在着一个问题,就是各个子目录下的存储资源需要人为的介入管理,不能出现严重的不均。

3.2 crossNode

         机房间的网络限制要求不能出现大规模、长时间的数据拷贝,需要一个专门管理机房间数据拷贝的进程,叫做crossNode。它是独立部署的一个节点,和元数据节点是分离的。

         它能提供的功能概括来说主要包括以下三点:

a) 根据预置的跨机房文件,进行数据拷贝

b) 处理实时的数据拷贝请求

c) 进行跨机房的数据流量控制

如何得知跨机房文件列表?

         由于离线任务基本都是定时触发的,可以根据对历史作业的分析来形成一个跨机房文件列表

3.3   资源组之间的管理

各个资源组之间存在数据的依赖,我们希望通过资源组管理,能实现大部分任务在本机房内产出数据,只有少量跨机房产出数据;大部分任务读取本机房的数据副本,只有少量跨机房读取数据。

为了标识资源组之间的数据依赖性,定义一个资源组之间的距离概念:一个资源组访问另一个资源组的数据量越多,则两者的距离越近,应该将距离接近的资源组放在同一个机房内。

为了让计算和产出尽可能地靠近,使用一个MRProxy,对于不同类型的任务做不同处理:

a)            离线计算:跨机房列表中的数据正在传输中(DC1->DC2),DC2上的 Job 被暂停调度,等待传输完毕

b)            Ad-hoc查询:DC2上的 Job 需要读DC1上的数据,Job暂停调度,通知 CrossNode,数据传输完毕后继续调度

c)             特殊情况:跨机房数据 JoinDC1大表,DC2小表,Job 调度到DC1上,跨机房直接读取DC2数据,无需等待

 

由于是根据视频和ppt整理,并没有代码或者文档,所以可能有些地方的理解有偏差,欢迎来提意见~


你可能感兴趣的:(hadoop,跨机房)