hdfs上传文件

将文件添加到目录树

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


    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中的数据包就可以干掉了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值