首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Hadoop Distributed File System 简介(2)

Hadoop Distributed File System 简介(2)

文件系统名称空间HDFS 支持一种传统的层级式文件结构,用户或应用程序可以在其中创建目录和保存文件。文件系统名称空间层级类似于大多数其他现有文件系统;您可以创建、重命名、重新定位和移除文件。
HDFS 还支持第三方文件系统,比如 CloudStore 和 Amazon                Simple Storage Service (S3)(参见 )。
数据复制HDFS 复制文件块以便容错。应用程序可以在一个文件创建时指定该文件的副本数,这个数量可以在以后随时更改。 Name node 负责所有块复制决定。
机柜意识(Rack awareness)通常,大型 HDFS 集群跨多个安装点(机柜)排列。一个安装中的不同节点之间的网络流量通常比跨安装点的网络流量更高效。一个 Name node 尽量将一个块的多个副本放置到多个安装上以提高容错能力。但是,HDFS 允许管理员决定一个节点属于哪个安装点。因此,每个节点都知道它的机柜 ID,也就是说,它具有机柜意识

HDFS 使用一个智能副本放置模型来提高可靠性和性能。优化副本放置使得 HDFS 不同于其他大多数分布式文件系统,而一个高效使用网络带宽的、具有机柜意识的副本放置策略将进一步促进这种优化。
大型 HDFS 环境通常跨多个计算机安装点运行。不同安装点中的两个 Data node 之间的通信通常比同一个安装中的 Data node 之间的通信缓慢。因此, Name node 试图优化 Data node 之间的通信。 Name node 通过 Data node 的机柜 ID 识别它们的位置。
数据组织HDFS 的一个主要目标是支持大文件。一个典型的 HDFS 块的大小为 64MB。因此,每个 HDFS 文件包含一个或多个 64MB 块。HDFS 尝试将每个块都放置到独立的 Data node 上。
文件创建过程在 HDFS 上操作文件与其他文件系统类似。但是,由于 HDFS 是一个显示为单个磁盘的多机器系统,所有操作 HDFS 上的文件的代码都使用 org.apache.hadoop.fs.FileSystem 对象(参见 )的一个子集。
中的代码演示了 HDFS 上的一个典型的文件创建过程。
清单 1. HDFS 上的典型文件创建过程
1
2
3
4
5
6
7
8
byte[] fileData = retrieveFileDataFromSomewhere();
String filePath = retrieveFilePathStringFromSomewhere();
Configuration config = new Configuration();  // assumes to automatically load
                                             // hadoop-default.xml and hadoop-site.xml
org.apache.hadoop.fs.FileSystem hdfs = org.apache.hadoop.fs.FileSystem.get(config);
org.apache.hadoop.fs.Path path = new org.apache.hadoop.fs.Path(filePath);
org.apache.hadoop.fs.FSDataOutputStream outputStream = hdfs.create(path);
outputStream.write(fileData, 0, fileData.length);




提交当一个客户端在 HDFS 中创建一个文件时,它首先将数据缓存到一个临时本地文件中。然后,它将后续写入重定向到这个临时文件。当临时文件积累的数据足以填充一个 HDFS 块时,客户端将向 Name node 报告, Name node 将把文件转换为一个永久 Data node。然后,客户端关闭临时文件,并将剩余的数据注入新创建的 Data node。 Name node 然后将 Data node 提交到磁盘。
复制管道化当一个客户端积累了一个完整的用户数据块时,它将从 Name node 检索包含那个块的副本的 Data node 的列表。然后,客户端将整个数据块注入这个副本列表中指定的第一个 Data node 。当 Data node 接收数据块时,它将数据块写入磁盘,然后将副本转移到列表中的下一个 Data node 。这种管道化(pipelining)过程不断重复,直到复制因子被满足。
返回列表