hadoop —— hdfs读写原理

了解:

fsimage

namenode的元数据镜像文件,一般称为检查点

editlog

namenode操作日志

fsimage、editlog位置:查看hdfs-site.xml,查看 dfs.namenode.name.dir的配置值,目录下有这俩文件(不带md5尾缀的文件)

block

块。hdfs已块为单位进行存储,使用hdfs数据的程序也以块为单位分配初始线程。根据版本不同块大小不同,文件按块大小进行切分。例:块128M,文件300M,就会切分为128M,128M,44M三个块。

packet

packet是dn之间块同步或者client与dn建立数据传输时的基本单位,默认64kb。

chunk

数据校验的基本单位,默认512b,

 

读写流程:

写:

  • client端向nn发出写文件请求。
  • nn检查是否已存在文件、检查权限。若通过检查,先将操作写入EditLog(如果中途失败,可以按日志内操作顺序重新操作),然后扫dn,返回一个可写数据得dn地址列表。
  • client端按对应版本块大小(1.x版本 64M,2.X版本 128M)的块切分文件。
  • client将nn返回的分配的可写的DataNode列表和Data数据一同发送给最近的第一个DataNode节点,此后client端和NameNode分配的多个DataNode构成pipeline管道,client端向输出流对象中写数据。client每向第一个dn写入一个packet,这个packet便会直接在pipeline里传给第二个、第三个…DataNode。(注意写的是块的基本单位parket,所以不是写好一个块之后才向下一个dn写,如果按块来说是异步。)
  • 每个dn写完一个块后,会返回确认信息。(在client端向DataNode传数据的时候,HDFSOutputStream会有一个chunk buff,写满一个chunk后,会计算校验和并写入当前的chunk。之后再把带有校验和的chunk写入packet,当一个packet写满后,packet会进入dataQueue队列,其他的DataNode就是从这个dataQueue获取client端上传的数据并存储的。同时一个DataNode成功存储一个packet后之后会返回一个ack packet,放入ack Queue中)
  • 写完数据,关闭输输出流。
  • 发送完成信号给nn。
     

读:

  1. client端访问nn,查询元数据信息,获得这个文件的数据块位置列表,返回输入流对象
  2. 就近与一台dn建立输入流 
  3. dn向输入流中中写数据,以packet为单位来校验
  4. 关闭输入流

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HDFSHadoop分布式文件系统,它提供了Java API来进行文件操作。在HDFS中,文件被分成多个块并存储在不同的节点上,因此需要使用分布式文件系统的API来进行文件操作。 HDFS Java API提供了以下几个类来进行文件操作: 1. FileSystem:表示一个文件系统对象,可以通过它来获取文件系统的配置信息、创建文件、删除文件等操作。 2. Path:表示一个文件或目录的路径。 3. FSDataInputStream:表示一个输入流,可以用来HDFS中的文件。 4. FSDataOutputStream:表示一个输出流,可以用来向HDFS入数据。 下面是一个简单的示例代码,演示如何使用HDFS Java API进行文件操作: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; public class HdfsExample { public static void main(String[] args) throws Exception { // 创建一个Configuration对象,用于获取Hadoop配置信息 Configuration conf = new Configuration(); // 获取HDFS文件系统对象 FileSystem fs = FileSystem.get(conf); // 创建一个Path对象,表示要取的文件路径 Path inputPath = new Path("/input/test.txt"); // 创建一个FSDataInputStream对象,用于取文件 FSDataInputStream in = fs.open(inputPath); // 取文件内容 byte[] buffer = new byte[1024]; int len = in.read(buffer); while (len > 0) { System.out.write(buffer, 0, len); len = in.read(buffer); } // 关闭输入流 in.close(); // 创建一个Path对象,表示要入的文件路径 Path outputPath = new Path("/output/test.txt"); // 创建一个FSDataOutputStream对象,用于入文件 FSDataOutputStream out = fs.create(outputPath); // 入文件内容 String content = "Hello, HDFS!"; out.write(content.getBytes()); // 关闭输出流 out.close(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值