Hadoop分布系统入门(一):HDFS篇
程序员文章站
2022-04-15 20:54:14
新开的Hadoop学习系列,利用Hadoop技术集群一步一步开始独立完成一个项目的实现。今日第一篇章:HDFS篇。...
Hadoop是什么?
答:Hadoop 是一个由 Apache 基金会所开发的开源分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储。解决了大数据(大到一台计算机无法进行存储,一台计算机无法在要求的时间内进行处理)的可靠存储和处理。
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 统一调度下进行数据块的创建、删除和复制。
HDFS读取和写入流程?
读文件的过程:
- 首先从Client通过File System的Open函数打开文件。
- Distributed File System(DFS)用RPC调用NameNode节点,NameNode 节点返回保存数据块的数据节点的地址。
- DFS返回FSDataInputStream给客户端,用来读取数据。
- 客户端调用stream的 **read()**函数开始读取数据。DFSInputStream连接保存此文件第一个数据块的最近的数据节点。
- DataNode 从数据节点读到客户端(client),当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。
- 当客户端读取完毕数据的时候,调用FSDataInputStream的close 函数。
- 在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。失败的数据节点将被记录,以后不再连接。
写文件的过程:
- 客户端调用 create()来创建文件,Distributed File System 用 RPC 调用 NameNode节点,在文件系统的命名空间中创建一个新的文件。NameNode 节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。
- Distributed File System 返回 DFSOutputStream,客户端用于写数据。
- 客户端写入数据,DFSOutputStream 将数据分成块,写入 Data Queue。
- Data Queue 由 DataStreamer 读取,并通知 NameNode 节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个Pipeline 里。
- Data Streamer 将数据块写入Pipeline 中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。
- 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操作相同,因此学习成本会很低。
参考文献
- 《Hadoop大数据实战手册》.林中天
- 《Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理》.蔡斌、陆湘萍
- 《Hadoop权威指南(第2版)》
本文地址:https://blog.csdn.net/Kingsleyandher/article/details/107380412