欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Hadoop分布系统入门(一):HDFS篇

程序员文章站 2022-07-06 16:16:13
新开的Hadoop学习系列,利用Hadoop技术集群一步一步开始独立完成一个项目的实现。今日第一篇章:HDFS篇。...

Hadoop是什么?

答:Hadoop 是一个由 Apache 基金会所开发的开源分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储。解决了大数据(大到一台计算机无法进行存储,一台计算机无法在要求的时间内进行处理)的可靠存储和处理。
Hadoop分布系统入门(一):HDFS篇

HDFS是什么?

答:Hadoop 生态圈的基本组成部分是 Hadoop 分布式文件系统(HDFS)。HDFS 是一种数据分布式保存机制,数据被保存在计算机集群上。数据写入一次,读取多次。

HDFS的特点

  • HDFS文件系统可以储存超大文件,每个磁盘都有默认的数据块大小,块一般为 512个字节。HDFS是一种文件系统,自身也有块(block)的概念,其文件块要比普通单一磁盘上文件系统大的多,默认是64MB。HDFS上的块之所以设计的如此之大,其目的是为了最小化寻址开销。
  • HDFS文件的大小可以大于网络中任意一个磁盘的容量,文件的所有块并不需要存储在一个磁盘上,因此可以利用集群上任意一个磁盘进行存储,由于具备这种分布式存储的逻辑,所以可以存储超大的文件。
  • 一次写入,多次读取。一个文件经过创建、写入和关闭之后就不需要改变,这个假设简化了数据一致性的问题,同时提高数据访问的吞吐量。
  • Hadoop 的设计对硬件要求低,无需昂贵的高可用性机器上,因为在 HDFS 设计中充分考虑到了数据的可靠性、安全性和高可用性。
  • HDFS不适用于实时查询这种对延迟要求高的场景。
  • HDFS不适用于保存大量小文件(小于64MB)
  • 为了保证并发性,HDFS需要一次写入多次读取,目前不支持多用户写入,若要修改,也是通过追加的方式添加到文件的末尾处
  • HDFS适合存储半结构化和非结构化数据

如果数据刚好满足HDFS不适合的情况可以考虑使用HBase进行保存处理,比如低延迟、小文件、易更改、结构化、少量级数据更适合使用HBase。

HDFS的体系架构?

答:HDFS是一个主从体系架构,由于分布式储存的性质,所以集群拥有两类节点。

  • NamenNode:通常只有一个作为中心服务器的角色,负责管理存储和检索多个DataNode的实际数据所需要的所有元数据。
  • DataNode:文件系统中真正储存数据的地方,在NameNode 统一调度下进行数据块的创建、删除和复制。

Hadoop分布系统入门(一):HDFS篇

HDFS读取和写入流程?

读文件的过程:

Hadoop分布系统入门(一):HDFS篇

  1. 首先从Client通过File System的Open函数打开文件。
  2. Distributed File System(DFS)用RPC调用NameNode节点,NameNode 节点返回保存数据块的数据节点的地址。
  3. DFS返回FSDataInputStream给客户端,用来读取数据。
  4. 客户端调用stream的 **read()**函数开始读取数据。DFSInputStream连接保存此文件第一个数据块的最近的数据节点。
  5. DataNode 从数据节点读到客户端(client),当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。
  6. 当客户端读取完毕数据的时候,调用FSDataInputStreamclose 函数。
  7. 在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。失败的数据节点将被记录,以后不再连接。

写文件的过程:

  1. 客户端调用 create()来创建文件,Distributed File System 用 RPC 调用 NameNode节点,在文件系统的命名空间中创建一个新的文件。NameNode 节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。
  2. Distributed File System 返回 DFSOutputStream,客户端用于写数据。
  3. 客户端写入数据,DFSOutputStream 将数据分成块,写入 Data Queue。
  4. Data Queue 由 DataStreamer 读取,并通知 NameNode 节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个Pipeline 里。
  5. Data Streamer 将数据块写入Pipeline 中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。
  6. DFSOutputStream 为发出去的数据块保存了Ack Queue,等待Pipeline 中的数据节点告知数据已经写入成功。

HDFS的基础操作命令

打印文件列表:ls命令

hadoop fs -ls hdfs:/ # 标准写法
hadoop fs -ls / # 默认HDFS系统下的根目录
hadoop  fs -ls /package/test/ #打印HDFS系统下指定的子目录

上传文件、目录:put、copyFromLoal命令

# 上传新文件:
hdfs fs -put file:/root/test.txt hdfs: / #上传本地test.txt文件到HDFS根目录, HDFS 根目录须无同名文件,否则“File exists” 
hdfs fs -put test.txt /test2.txt #上传并重命名文件。 
hdfs fs -put test1.txt test2.txt hdfs:/ #一次上传多个文件到HDFS路径。

# 上传文件夹:
hdfs fs -put mypkg /newpkg #上传并重命名了文件夹。

#覆盖上传: 
hdfs fs -put -f /root/test.txt / #如果HDFS目录中有同名文件会被覆盖
#上传文件并重命名: 
hadoop fs -copyFromLocal file:/test.txt hdfs:/test2.txt
#覆盖上传: 
hadoop fs -copyFromLocal -f test.txt /test.txt

下载文件、目录:get、copyToLocal命令

#拷贝文件到本地目录: 
hadoop fs -get hdfs:/test.txt file:/root/
#拷贝文件并重命名,可以简写: 
hadoop fs -get /test.txt /root/test.txt
#拷贝文件到本地目录: 
hadoop fs -copyToLocal hdfs:/test.txt file:/root/
#拷贝文件并重命名,可以简写: 
hadoop fs -copyToLocal /test.txt /root/test.txt

拷贝文件、目录:cp

#从本地到HDFS,同put 
hadoop fs -cp file:/test.txt hdfs:/test2.txt
#从HDFS到HDFS 
hadoop fs -cp hdfs:/test.txt hdfs:/test2.txt hadoop fs -cp /test.txt /test2.txt

移动文件:mv

hadoop fs -mv hdfs:/test.txt hdfs:/dir/test.txt 
hadoop fs -mv /test.txt /dir/test.txt

删除文件、目录

#删除指定文件 
hadoop fs -rm /a.txt
#删除全部txt文件 
hadoop fs -rm /*.txt
#递归删除全部文件和目录 
hadoop fs -rm -R /dir/

读取文件:cat、tail

hadoop fs -cat /test.txt #以字节码的形式读取 
hadoop fs -tail /test.txt

创建空文件、文件夹:touchz、mkdir

hadoop fs - touchz /newfile.txt
hadoop fs -mkdir /newdir /newdir2 #可以同时创建多个 
hadoop fs -mkdir -p /newpkg/newpkg2/newpkg3 #同时创建父级目录

获取逻辑空间文件、目录大小:du

hadoop fs - du / #显示HDFS根目录中各文件和文件夹大小 
hadoop fs -du -h / #以最大单位显示HDFS根目录中各文件和文件夹大小
hadoop fs -du -s / #仅显示HDFS根目录大小。即各文件和文件夹大小之和

总结

HDFS是一个分布式文件的储存系统,写入和读取方法也符合分布式数据储存的逻辑。在Haddoop内对HDFS数据的上传、移动、删除、复制、新建基本与Linux操作相同,因此学习成本会很低。

参考文献

  1. 《Hadoop大数据实战手册》.林中天
  2. 《Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理》.蔡斌、陆湘萍
  3. 《Hadoop权威指南(第2版)》

本文地址:https://blog.csdn.net/Kingsleyandher/article/details/107380412