hdfs的基本原理和基本操作总结

本文详细介绍了Hadoop分布式文件系统(HDFS)的基本原理,包括其设计目标、高容错性和高吞吐量特性。文章还涵盖了HDFS的主从结构,如NameNode、SecondaryNameNode和DataNode的角色。此外,列举了HDFS的基本操作,如文件的读写、副本管理和集群的均衡。HDFS适合存储大型数据集,适用于一次写多次读的场景,但也存在低延迟访问、小文件存储效率和多用户写入等限制。
                                                                                                                     

                                                                                hdfs基本原理

Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。HDFS是Apache Hadoop Core项目的一部分。

HDFS有着高容错性(fault-tolerant)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以实现流的形式访问(streaming access)文件系统中的数据。

HDFS的主要组成:NameNode,SecondaryNameNode,DataNonde;

HDFS的基本操作:读、写、均衡;

图1,NameNode

图2,SecondaryNameNode

 

图3,客户端的读请求

 

图4,读取DataNode上的块

图5,写文件请求

 

图6,准备写

 

图7,单块的管线式写入数据节点

图8,多块的管线式写入数据节点

图9 重写损坏的数据块副本

图10 不均衡的集群

图11 均衡的集群



    

     运行在HDFS之上的程序有很大量的数据集。典型的HDFS文件大小是GB到TB的级别。所以,HDFS被调整成支持大文件。它应 该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件。                                                       

       大部分的HDFS程序对文件操作需要的是一次写多次读取的操作模式。一个文件一旦创建、写入、关闭之后就不需要修改了。这个假定简单化了数据一致的问题和并使高吞吐量的数据访问变得可能。一个Map-Reduce程序或者网络爬虫程序都可以完美地适合这个模型。                                                                                                                                                                                                                       

       HDFS是一个主从结构,一个HDFS集群是由一个名字节点,它是一个管理文件命名空间和调节客户端访问文件的主服务器,当然还有一些数据节点,通常是一个节点一个机器,它来管理对应节点的存储。HDFS对外开放文件命名空间并允许用户数据以文件形式存储。内部机制是将一个文件分割成一个或多个块,这些块被存储在一组数据节点中。名字节点用来操作文件命名空间的文件或目录操作,如打开,关闭,重命名等等。它同时确定块与数据节点的映射。数据节点负责来自文件系统客户的读写请求。数据节点同时还要执行块的创建,删除,和来自名字节点的块复制指令。                                                                                                                     

         名字节点和数据节点都是运行在普通的机器之上的软件,机器典型的都是GNU/Linux,HDFS是用java编写的,任何支持java的机器都可以运行名字节点或数据节点,利用java语言的超轻便型,很容易将HDFS部署到大范围的机器上。典型的部署是由一个专门的机器来运行名字节点软件,集群中的其他每台机器运行一个数据节点实例。体系结构不排斥在一个机器上运行多个数据节点的实例,但是实际的部署不会有这种情况。集群中只有一个名字节点极大地简单化了系统的体系结构。名字节点是仲裁者和所有HDFS元数据的仓库,用户的实际数据不经过名字节点。                                                                                                                                                  

         HDFS是一个不错的分布式文件系统,它有很多的优点,但也存在有一些缺点,包括:不适合低延迟数据访问、无法高效存储大量小文件、不支持多用户写入及任意修改文件。                                                                                                                                              

      

                                                                                  HDFS 常用的基本操作命令                                      

1,HDFS  Shell                                                                                                                                                                                               

    查看 hadoop fs                                                                                                                                                                           

2, 常见命令                                                                                                                                                                                                                                                                                                                                                                                                                        

-ls 显示当前目录结构

    该命令选项表示查看指定路径的当前目录结构,后面跟hdfs 路径,如图所示。    上图中的路径是hdfs 根目录,显示的内容格式与linux 的命令ls –l 显示的内容格式非常相似,解析每一行的内容格式:                                                                                         

                                    1. 首字母表示文件夹(如果是“d”)还是文件(如果是“-”);                                                                                                                       2. 后面的9 位字符表示权限;                                                                                                                                       

         3. 后面的数字或者“-”表示副本数。如果是文件,使用数字表示副本数;文件夹没有副本;

4. 后面的“root”表示属主;                                                                                                             

5. 后面的“supergroup”表示属组 ;                                                                                             

6. 后面的“0”、“6176”、“37645”表示文件大小,单位是字节 ;                                          

7. 后面的时间表示修改时间,格式是年月日时分;                                                                 

8. 最后一项表示文件路径。                                                                                                            

-du 统计目录下各文件大小

-mv 移动

该命令选项表示移动hdfs 的文件到指定的hdfs 目录中。后面跟两个路径,第一个表示源文件,第二个表示目的目录。

-cp 复制

该命令选项表示复制hdfs 指定的文件到指定的hdfs 目录中。后面跟两个路径,第一个是被复制的文件,第二个是目的地

-rm 删除文件/空白文件夹

该命令选项表示删除指定的文件或者空目录

-rmr 递归删除

该命令选项表示递归删除指定目录下的所有子目录和文件

-put 上传文件

该命令选项表示把linux 上的文件复制到hdfs 中

-copyFromLocal 从本地复制

操作与-put 一致

-moveFromLocal 从本地移动

该命令表示把文件从linux 上移动到hdfs 中

getmerge 合并到本地

该命令选项的含义是把hdfs 指定目录下的所有文件内容合并到本地linux 的文件中

-cat 查看文件内容

该命令选项是查看文件内容

-text 查看文件内容

该命令选项可以认为作用和用法与-cat 相同,此处略。

       -mkdir 创建空白文件夹

该命令选项表示创建文件夹,后面跟的路径是在hdfs 将要创建的文件夹

-setrep 设置副本数量

该命令选项是修改已保存文件的副本数量,后面跟副本数量,再跟文件路径

-touchz 创建空白文件

该命令选项是在hdfs 中创建空白文件

-stat 显示文件的统计信息

该命令选项显示文件的一些统计信息

-tail 查看文件尾部内容

该命令选项显示文件最后1K 字节的内容。一般用于查看日志。如果带有选项-f,那么当文件内容变化时,也会自动显示

-chmod 修改文件权限

该命令选项的使用类似于linux 的shell 中的chmod 用法,作用是修改文件的权限

-chown 修改属主

该命令选项表示修改文件的属主

-help 帮助

该命令选项会显示帮助信息,后面跟上需要查询的命令选项即可


3,数据的读写过程

管线式(PipeLine)写入:当客户端写数据到HDFS文件中时,数据首先被写入本地文件中,假设HDFS文件的复制因子是3,当本地文件堆积到一块大小的数据,客户端从名字节点获得一个数据节点的列表。这个列表也包含存放数据块副本的数据节点。当客户端刷新数据块到第一个数据节点。第一个数据节点开始以4kb为单元接收数据,将每一小块都写到本地库中,同时将每一小块都传送到列表中的第二个数据节点。同理,第二个数据节点将小块数据写入本地库中同时传给第三个数据节点,第三个数据节点直接写到本地库中。一个数据节点在接前一个节点数据的同时,还可以将数据流水式传递给下一个节点,所以,数据是流水式地从一个数据节点传递到下一个。 因此,三个节点的写数据完成的时间相差不多。                        

    

                                                                                              

                                                                                                                                     

### HDFS 工作原理 Hadoop 分布式文件系统(HDFS)是一种高容错性的分布式存储解决方案,设计目标是在低成本硬件上运行。它提供了高吞吐量的数据访问机制,非常适合大规模数据分析应用。HDFS 的核心组件包括 NameNode DataNode: - **NameNode**: 负责管理文件系统的命名空间元数据信息。所有的文件目录结构文件块映射都保存在内存中,因此它的性能非常高。 - **DataNode**: 存储实际的数据块,并定期向 NameNode 报告其状态。 当客户端请求读取或写入文件时,流程如下: 1. 客户端联系 NameNode 获取文件的位置信息或者分配新的块位置。 2. 对于写操作,NameNode 返回一组适合的 DataNodes 列表;对于读操作,则返回最近的副本所在的 DataNode 地址。 3. 数据传输直接发生在 Client 选定的 DataNodes 之间[^1]。 --- ### 使用 Java 实现 HDFS 操作 #### 配置环境 要通过 Java API 访问 HDFS,首先需要引入必要的依赖项。如果使用 Maven 构建工具,可以在 `pom.xml` 中添加以下内容来导入 Apache Hadoop 库: ```xml <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.x.x</version> <!-- 替换为具体版本号 --> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>3.x.x</version> <!-- 替换为具体版本号 --> </dependency> ``` #### 连接到 HDFS 连接到 HDFS 是任何操作的前提条件之一。下面展示了一个简单的例子说明如何建立与远程 HDFS 群集之间的通信链路: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; public class HdfsConnectionExample { public static void main(String[] args) throws Exception{ // 创建配置对象并设置默认FS URL Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://namenode_host:port"); // 可选:启用 hostname 解析而非 IP 地址 conf.set("dfs.client.use.datanode.hostname", "true"); // 获取 FileSystem 实例 FileSystem fs = FileSystem.get(conf); System.out.println("Connected to HDFS successfully!"); } } ``` 注意替换 `"hdfs://namenode_host:port"` 成真实的 Namenode 主机名及其监听端口号[^4]。 #### 常见的操作示例 ##### 上传文件至 HDFS 以下是将本地文件复制到 HDFS 上的一个完整案例: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import java.io.FileInputStream; import java.net.URI; public class UploadFileToHdfs { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://bigdata01:9000"); FileSystem fs = FileSystem.get(URI.create("hdfs://bigdata01:9000"), conf); Path dstFilePath = new Path("/uploaded_file.txt"); FSDataOutputStream outputStream = fs.create(dstFilePath); FileInputStream inputStream = new FileInputStream("C:/local/path/to/file.txt"); IOUtils.copyBytes(inputStream, outputStream, 4096, true); System.out.println("File uploaded."); } } ``` ##### 下载文件从 HDFS 同样可以轻松地编写一段代码用来下载位于 HDFS 上面的内容回到本地方便查看编辑等等用途: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import java.io.FileOutputStream; import java.io.OutputStream; import java.net.URI; public class DownloadFileFromHdfs { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://bigdata01:9000"); FileSystem fs = FileSystem.get(URI.create("hdfs://bigdata01:9000"), conf); OutputStream os = new FileOutputStream("C:/downloaded_file.txt"); fs.copyToLocalFile(false,new Path("/remote/hdfs/file.txt"),"file:///C:/downloaded_file.txt",true); System.out.println("Download complete."); } } ``` ##### 删除 HDFS 文件夹/文件 最后提供一个简单的方法演示怎样移除整个目录树或者是单个特定名称下的条目: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.net.URI; public class DeleteDirectoryInHdfs { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://bigdata01:9000"); FileSystem fs = FileSystem.get(URI.create("hdfs://bigdata01:9000"), conf); boolean deletedSuccessfully = fs.delete(new Path("/path/to/delete"), true /* recursive */ ); if(deletedSuccessfully){ System.out.println("Deletion successful."); }else{ System.err.println("Failed to delete directory or it does not exist."); } } } ``` --- ### 总结 以上介绍了关于 HDFS 的基本工作方式以及借助 Java SDK 执行典型任务的具体实践方法。每种功能都有对应的类库支持,开发者只需按照官方文档指引即可快速集成进自己的应用程序当中去[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值