hdfs上传文件

news/2024/5/20 1:30:26 标签: hadoop, big data, hdfs, 源码, 写文件

hdfs写数据流程

      • 将文件添加到目录树
      • 将数据写入队列
      • 机架感知
      • DN写数据、客户端收到应答

将文件添加到目录树

假设我们有一段创建文件并写入数据的代码:


    FileSystem fileSystem;
    @Before
    public void init() throws Exception{
        String user = "ocean";
        Configuration configuration = new Confi![image.png](http://ocean-blog.oss-cn-beijing.aliyuncs.com/image_ef50a14d.png?Expires=2261816862&OSSAccessKeyId=LTAI4GK7UEdr2qyS5K6swS9e&Signature=VV9HLVPrdli3DUaMr7Lvh6IeiG8%3D)guration();
        fileSystem = FileSystem.get(new URI("hdfs://hadoop102:8020"), configuration, user);
    }

    @After
    public void close() throws Exception{
        if(fileSystem != null){
            fileSystem.close();
        }
    }
    
    /**
     * 测试创建文件并写入数据
     * @throws IOException
     */
    @Test
    public void testCreatePathAndWrite() throws IOException {
        FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path("/path"));
        fsDataOutputStream.write("hello".getBytes());
    }

我们点进

fileSystem.create(new Path("/path"));

一路create,直到

在这里插入图片描述
再到流的创建:

在这里插入图片描述

最后我们回到NN的RPCServer,客户端要向NameNode的RPCServer发送请求了:

在这里插入图片描述

startFile

在这里插入图片描述

一直进startFile,直到找到addFile

在这里插入图片描述

在这里插入图片描述

addINode就是添加目录树。

在这里插入图片描述

在此就会添加文件。

再次回到客户端请求创建目录树那里:

在这里插入图片描述

在这里插入图片描述

他现在要往外写数据。

在这里插入图片描述

这个stream是一个线程。

在这里插入图片描述

现在就有一个队列在这里阻塞。

将数据写入队列

在这里插入图片描述

现在我们看如何往外写数据。

在这里插入图片描述

找到FSOutputSummerwrite

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

往外写chunkchunkSum

在这里插入图片描述

将数据和校验和写到Packet中。

在这里插入图片描述

写了之后再看检查队列是否已满。

在这里插入图片描述

如果队列满了,就要等。

现在我们的队列肯定是没满。

在这里插入图片描述

所以走queuePacket的操作。

在这里插入图片描述

现在是将Packet中的数据放到队列中,并且唤醒队列。

还记得我们第一部分有一个队列在等待吗?现在他醒了。

机架感知

在这里插入图片描述

第一部分的阻塞走通了。

在这里插入图片描述

现在他要建立管道,其实就是要知道往那几个DN写。

我们进入nextBlockOutputStream()

在这里插入图片描述
到底向哪个DN写。

在这里插入图片描述

到了NN的RPCServer了。

然后一路chooseTarget知道最后的策略。

在这里插入图片描述

进入按顺序获取目的地。

在这里插入图片描述

在这里插入图片描述

第一个副本选择当前节点,第二个副本选择与当前机架不同的节点。

在这里插入图片描述

第三个副本放在和dn1一样的机架。

DN写数据、客户端收到应答

再次回到获取DN那里:

在这里插入图片描述

获取之后,我们就要往第一个DN写,进入createBlockOutputStream

在这里插入图片描述

这里他建立了输出流和输入流,分别是用来往DN写,和从DN接受信息。

在这里插入图片描述

发送数据。

在这里插入图片描述

执行发送。

我们现在的操作是WRITE_BLOCK

找一个类:

在这里插入图片描述

这个DN这边用来接受数据的类。

在这里插入图片描述

他在run方法中又new了一个线程,进去查看。

在这里插入图片描述

找到它的run方法。

在这里插入图片描述
解析操作并处理操作。

在这里插入图片描述

还记得我们的操作是WRITE_BLOCK?进去。

在这里插入图片描述

首先往当前DN写一份临时数据。

在这里插入图片描述

在这里插入图片描述

然后再往其他DN发送消息。比如DN0通知DN1,这时候DN1也会往磁盘写一份临时数据。

如此往复下去。

现在要往回应答。比如有三个DN,DN2告诉DN1写好了,DN1告诉DN0写好了。我们要接受这个应答。

在这里插入图片描述

再次回到DataStreamerrun方法。

进入initDataStreaming()

在这里插入图片描述

获取应答。

ResponseProcessor是一个线程,走它的run方法。

在这里插入图片描述

在这里插入图片描述

如果数据往DN发送成功了,会将其从ackQueue中移除。但是我们不知道ackQueue是什么。我们知道有一个dataQueue,他的数据往DN走。所以这里相当于是用ackQueue来做一个监听。

在这里插入图片描述

重新回到initDataStreaming()

在这里插入图片描述

他把dataQueue中的packet挪到了ackQueue

为什么要往ackQueue放呢,因为怕写失败了,写失败了的话,就再添到dataQueue再次往DN写。

如果全部写成功了,ackQueue中的数据包就可以干掉了。


http://www.niftyadmin.cn/n/1311985.html

相关文章

@test注解 无法运行_Spring系列(六)- 注解方式测试

步骤1:先运行,看到效果,再学习步骤2:模仿和排错步骤3:效果步骤4:jar步骤5:导入到当前项目中步骤6:TestSpring步骤 1 : 先运行,看到效果,再学习老规矩,先下载下载区(点击进入)的可运行项目,配置运行起来&…

对Java数组的理解

public class Main { public static void main(String[] args){ int[] array {100,100,200}; int[][] a{{1,2},{2,3},{1,1}};//二维数组就是,特殊的一维数组。特殊在存储的元素是数组。 } //以此类推,三维就是特殊的二维。特殊在存储的元素是一个个二维…

oracle insert 报错cpu_Oracle数据库和MySQL数据库的区别(原创)

1、Oracle数据库产品是闭源同时也是收费的,MySQL是开源的项目(免费);2、Oracle是大型数据库,Mysql是中小型数据库;3、Oracle可以设置用户权限、访问权限、读写权限等,MySQL没有;4、O…

linux大于80的文件无法删除,如何恢复 Linux 上删除的文件,第 2 部分

冯 锐 (), 软件工程师,IBM郑 勇 (), 软件工程师, IBM2007 年 12 月 24 日除了普通文件之外,UNIX/Linux 中还存在一些特殊的文件,包括目录、字符设备、块设备、命名管道、socket以及链接;另外还存在一些带有文件洞的文件,这些特殊文…

电商数仓简介

数仓是为决策用的,它的架构逻辑十分严密。 数仓分区ods层dwd与dim层事务型事实表周期型事实表累计型快照事实表dws层dwt层ads层用户行为路径分析漏斗模型留存用户ods层 数仓是分层的。 ods层是直接从hdfs拿数据,不做任何修改,只是添加了时间…

python的try和except用法_在python中利用try..except来代替if..else的用法

在有些情况下,利用try…except来捕捉异常可以起到代替if…else的作用。 比如在判断一个链表是否存在环的leetcode题目中,初始代码是这样的 # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val x # s…

二维数组的长度

public class Main {public static void main(String[] args){int[] array {100,100,200};int[][] a{{1,2,1,10,9},{2,3,1,8,17,16},{1,1,172}};//二维数组就是,特殊的一维数组。特殊在存储的元素是数组。////理解数组的本质以后:System.out.println(a.…

python打开方式错误_【我问 Crossin】python程序一闪而过,是我的打开方式不对?...

原标题:【我问 Crossin】python程序一闪而过,是我的打开方式不对? 除了在公众号、交流群组或论坛上提问,大家有想问的问题也可以直接在本栏目文章下留言,接受以下提问: 与编程相关的问题 工作咨询、学习方向…