技术干货!HDFS 读写原理和代码简单实现
摘要:本文主要研究了 HDFS 文件系统的读写流程以及基于 MRS 在 windows 客户端下读写 HDFS 文件的实现。
HDFS(Hadoop 分布式文件系统)是 Apache Hadoop 项目的一个子项目。
HDFS 支持海量数据的存储,允许用户把成百上千的计算机组成存储集群,其中的每一台计算机称为一个节点。
用户通过 HDFS 的终端命令可以操作其中的文件和目录,如同操作本地文件系统(如 Linux)中的文件一样。用户也可以通过 HDFS API 或 MapReduce 来编程访问其中的文件数据。
本文主要研究了 HDFS 文件系统的读写流程以及基于 MRS 在 windows 客户端下读写 HDFS 文件的实现。
1. HDFS 的架构和元数据
1.1 HDFS 采用 master/slaves 主从结构模型管理数据,结构模型图如下
1.2 元数据的相关概念
Fsimage:文件系统映射文件,也是元数据的镜像文件(磁盘中),存储某段时间 namenode 内存元数据信息
Edits log:操作日志文件
1.3 元数据的工作特点
(1) namenode 始终在内存中存储元数据,使得“读操作”更加快
(2)写请求时,向 edits 文件写入日志,成功返回后才修改内存,并向客户端返回
(3) NameNode 内存中存储的是=fsimage+edits
2. 文件的读写流程
2.1 文件的读取流程
1) 客户端 Client 调用 FileSystem 的 open(),返回 FSDataInputStream 对象给客户端.DistributeFileSystem 对象通过 RPC 和 NameNode 通信,查询元数据信息,确定文件路径是否存在以及检查权限,返回这个文件的数据块位置列表(数据块位置是有先后顺序)
2) 客户通过 FSDataInputStream read()方法读取数据.FSDataInputStream 对象按照数据块位置优先顺序建立一条连接,读取数据.当此数据块读取完毕后,FSDataInputStream 对象关闭和此数据节点的连接,然后继续按照优先顺序建立下一个数据块连接,读取数据…….在据读取过程中,如果客户端在与数据节点通信时出现错误,则会尝试读取包含有此数据块的下一个数据节点,并且失败的数据节点会被记录,以后不会再连接
3) 当数据读取完毕后,调用 FSDataInputStream 对象的 close()函数。
2.2 文件的写入流程
1)客户端 Client 调用 FileSystem 的 create()函数,返回 FSDataOutputStream 对象给客户端 DistributedFileSystem 对象通过 RPC 与 namenode 通信,确定文件存在不存在以及是否有创建文件的权限,先将操作写入 log,再载入内存,将 DataNode 列表返回
2) 客户端通过 FSDataOutputStream 对象,写数据.FSDataOutputStream 对象将数据按照 128M 分成块,写入 Data Queue.然后将 DataNode 列表和 Data Queue 通过 DataNode 列表一同发送给最近的 DataNode.这样之后 client 端和 NameNode 分配的多个 DataNode 构成 pipeline 管道.client 每次向第一个 DataNode 写入一个 packet,这个 packet 便会直接在 pipeline 里传给第二个、第三个 DataNode.每个 DataNode 写完一个块后,会返回确认信息. FSDataoutputStream 将确认信息保存在 ACK Queue.所有的数据块写入 pipeline 中的数据节点,并且 ACK Queue 成功返回.
3) FSDataOutputStream 对象 close()方法关闭流.通知元数据节点写入完毕
3. 基于华为云 MRS windows 下读写 HDFS 的实现
3.1 创建 2.1.0 非安全集群
3.2 安全组规则入方向放开 windows 客户端 ip 和所有端口
3.3 为集群的各个节点绑定弹性 ip
3.4 将弹性 ip 和集群节点主机名写入 windows 的 hosts 文件
3.5 打开https://github.com/huaweicloud/huaweicloud-mrs-example/tree/mrs-2.1,将样例代码下载下来,然后是 idea 打开 hdfs-examples 项目
3.6 在 huawei 下面创建 test 文件夹,并且 Test.java 文件放到这个文件夹内
3.7 从集群下载配置文件,置于项目 conf 文件夹下
3.8 将下面配置配置于 hdfs-site.xml 中
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
</property>
3.9 idea 执行程序,执行结果如下
本文分享自华为云社区《HDFS 读写原理和代码简单实现》,原文作者:剑指南天 。
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/404e1cbff9542e53fccea8638】。文章转载请联系作者。
评论