一种Hadoop分布式文件系统及其管理方法_2

文档序号:8299032阅读:来源:国知局
SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0048]实施例一
[0049]HDFS集群将一个跨机房文件的块副本存放到不同机房的数据节点,有利于提高数据的可靠性,避免因某一机房发生意外故障而造成数据无法读取。在需要把该文件的块副本存储在多个机房内的情况下,由于机房间的带宽有限而且十分昂贵,存放时要尽量减少跨机房的数据读取以减少跨机房的带宽占用。但是,使用现有的HDFS网络拓扑结构树无法获得任何机房的信息,导致所有的块副本有可能被放置在同一个机房的数据节点内,无法实现跨机房的合理存放。
[0050]本实施例HDFS跨机房的管理方法如图2所示,包括:
[0051]步骤110,Hadoop分布式文件系统创建树形网络拓扑结构时,在代表集群的根节点和代表机架的第二层节点之间增加代表机房的第一层节点;
[0052]步骤120,创建跨机房文件时,指定多个机房来存放该文件的块副本,为其中的每一机房配置存放的副本数;
[0053]步骤130,存放所述块副本时,对所述多个机房中的每一机房,按照为该机房配置的所述副本数,选择相同数目的数据节点存放所述块副本。
[0054]其中,
[0055]在步骤110中,创建的HDFS网络拓扑结构如图3所示,根节点I代表整个集群,第一层节点Dl?D2代表机房,第二层节点Rl?R4代表机架,叶子节点Hl?H12代表DataNode。可见,新的网络拓扑结构仍是一种树形网络拓扑结构,但在代表集群的根节点和代表机架的第二层节点之间增加了代表机房的第一层节点。根据新的网络拓扑结构,可以识别出有哪些机房,并且识别出每个机房包含哪些机架和DataNode。
[0056]在步骤120中,
[0057]当用户创建一个跨机房文件时,文件包含的块副本要放置在多个机房内。选择块副本存放位置时,较佳地,如果用户在某个机房内,在指定多个机房来存放该文件的块副本时,优先指定用户所在的机房,也就是说,除非用户所在机房无法存放,否则指定的多个机房中要包含用户所在的机房。这样可以把块副本的数据尽量写在用户所在的机房,减少跨机房的网络带宽占用,并且提升写的速度。
[0058]指定多个机房来存放该文件的块副本,具体地,可以是配置该文件的文件路径与多个机房的对应关系,使用所述文件路径对应的多个机房存放该文件的块副本。基于文件路径(文件路径可以是目录也可以是文件)来指定机房非常灵活,便于修改。用户可以根据业务要求和硬件资源的使用情况,决定选择哪些文件跨机机房存放,哪些文件不跨机房存放。
[0059]对其中的每一机房配置存放的副本数时,对主机房(NameNode所在的机房)存放的副本数,可以在创建该文件或调用DFS客户端设置副本的方法如DFSClient.setReplicat1n来指定,其他机房存放的副本数可以通过配置文件指定。
[0060]例如:NameNode属于的主机房记为dl,用户创建“/user/people, txt”文件时指定在主机房dl存放的副本数为3。针对其他机房的配置文件的内容为“/user/people,txt, d2:d3, 2:4”,表示/user/people, txt文件的副本存放在d2和d3机房,d2机房存放2个副本,d3机房包含4个副本。
[0061]对上述配置信息可以随时更新,即随时修改文件路径的跨机房信息,如:
[0062]4月10号的配置文件为:
[0063]/groupl/tablel/2013-04-10 d2:d3, 2:4
[0064]/groupl/table2/2013-04-10 d2:d3, 2:4
[0065]其中,/groupl/tablel/2013-04-10及 /groupl/table2/2013-04_10 表不文件路径。
[0066]4月11号对配置内容更新如下:
[0067]/groupl/table2/2013-04-10 d2:d3, 3:3
[0068]/group3/table0/2013-04-10 d2:d3, 3:3
[0069]则最新的内容为:
[0070]/groupl/tablel/2013-04-10 d2:d3, 2:4 del
[0071]/groupl/table2/2013-04-10 d2:d3, 3:3 up
[0072]/group3/table0/2013-04-10 d2:d3, 3:3 add
[0073]配置的文件路径对应的跨机房信息的变化,会改变相应文件的块副本在多个机房内的分布。
[0074]在步骤130中,
[0075]在每个机房内根据机架信息存放副本时,采用以下的存放策略:
[0076].选择存放第一个副本的数据节点
[0077]如果用户不在一个DataNode上,则在本机房内随机选择一个机上的DataNode存放第一个副本。
[0078]如果client在一个DataNode上,则选择这个DataNode存放第一个副本。
[0079].选择存放第二副本的DataNode
[0080]存放第二个副本的DataNode,与存放第一个副本的DataNode在同一个机房内但不在同一个机架上。
[0081].选择存放第三个副本的DataNode
[0082]存放第三个副本的DataNode,与存放第二个副本的DataNode在同一个机房的同一个机架上。
[0083]?选存放第四个及更多的副本
[0084]在本机房内随机选择机架存放副本。
[0085].约束条件
[0086]确保一个DataNode不会存放一个以上的副本。
[0087]如果副本的个数小于1/2机架总数,确保一个机房内的一个机架不会保存两个以上的副本。
[0088]基于上述新的网络拓扑结构树,可以在HDFS中新增如下的应用程序编程接口(Applicat1n Programming Interface, API)以感知机房信息:
[0089].public int getNumOfRacks(String datacenter)
[0090]该API用于获得机房包含的机架个数
[0091].public boolean contains(String datacenter, Node node)
[0092]该API用于判断一个机房是否包含一个节点(node,node可以是机房、机架或者datanode)
[0093].public int getNumOfLeaves(String datacenter)
[0094]该API用于获得一个机房包含了多少个DataNode
[0095].public String getDataCenter(Node node)
[0096]该API用于获得DataNode所在的机房的名称
[0097].public boolean isOnSameDatacenter(Node nodel, Node node2)
[0098]该API用于检测两个DataNode是否在同一个机房
[0099]另外,可以在一些已有的API中将机房作为新增参数,例如:
[0100].p
当前第2页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1