hdfs源码解析之客户端写数据(三)

本文深入解析HDFS客户端写数据过程,重点探讨FSOutputSummer如何维护本地缓冲区buf,并详细阐述create与append操作的区别,尤其是writeChunk()方法在其中的关键作用。
摘要由CSDN通过智能技术生成

接着hdfs源码解析之客户端写数据(二)继续。

fs.write(a.getBytes());

上面write方法郑振调用的是FSOutputSummer.write,FSOutputSummer维护了一个本地缓冲区buf,大小初始为9*chunkSize,append文件时初始化方法不同。循环写buf.length字节数据,buf满了就开始调用writeChecksumChunks写packet。

  @Override
  public synchronized void write(byte b[], int off, int len)
      throws IOException {
    
    checkClosed();
    
    if (off < 0 || len < 0 || off > b.length - len) {
      throw new ArrayIndexOutOfBoundsException();
    }
//循环写buf.length字节数据,buf满了就开始写packet
    for (int n=0;n<len;n+=write1(b, off+n, len-n)) {
    }
  }

private int write1(byte b[], int off, int len) throws IOException {
    if(count==0 && len>=buf.length) {
      // local buffer is empty and user buffer size >= local buffer size, so
      // simply checksum the user buffer and send it directly to the underlying
      // stream
      final int length = buf.length;
      writeChecksumChunks(b, off, length);
      return length;
    }
    
    // copy user data to local buffer
    int bytesToCopy = buf.length-count;
    bytesToCopy = (len<bytesToCopy) ? len : bytesToCopy;
    System.arraycopy(b, off, buf, count, bytesToCopy);
    count += bytesToCopy;
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值