黑马程序员技术交流社区

标题: 【上海校区】Hadoop2.7.3写入文件源码分析 [打印本页]

作者: 梦缠绕的时候    时间: 2018-9-20 12:01
标题: 【上海校区】Hadoop2.7.3写入文件源码分析




buf:就是本地缓冲区


最后返回你所拷贝的量

进入sum.getBytesPerChecksum()这个方法可以看出bytesPerChecksum是个成员变量

这个成员变量的值就等于chunksize  

传输过程中要进行校验,从data1向data2传输数据的过程中要进行校验处理,把你要传输的数据和你要算的码放在一起,data2拿到你的数据后,再拿到你的校验和,我们通过算法来比较,如果发现码不对,说明数据就被篡改过。

每个校验和对应的字节,就是512一校验,校验和本身占4个字节,所以在清理缓冲区的时候它有个校验和处理,它计算每个校验和所对应的字节数这个

数是512




这个65016跟126是怎么来的呢?

65016除于126=516

单步进入这个方法,里面是计算缓冲区大小的



  DFSPacket内部有四个指针,分别为

      1、checksumStart:标记数据校验和区域起始位置

      2、checksumPos:标记数据校验和区域当前写入位置

      3、dataStart:标记真实数据区域起始位置

      4、dataPos:标记真实数据区域当前写入位置



      数据包是按照一组组数据块写入的,先写校验和数据块,再写真实数据块,然后再写下一组校验和数据块和真实数据块,最后再写上header头部信息,至此整个数据包写完。

      每个DFSPacket都对应一个序列号seqno,还存储了数据在数据块中的位置offsetInBlock、数据包中的数据块(chunks)数量numChunks、数据包中的最大数据块数maxChunks、是否为block中最后一个数据包lastPacketInBlock等信息。


给出个DFSoutputStream的成员变量


checksumPos=33




//send an empty package to mark the end of the block 发送一个空包来标记块的结束,每个块结束的时候还要发送一个空包

到这里数据包里面的数据已经准备好了,setSyncBlock设置同步块,即哪个块是同步点,接着this.flushInternal();     即 flush all data to datanode

//get last block before destorying the streamer


this.queueCurrentPackage(); //  if there is data in the current bufffer,send it across

然后进入到这个方法里面去

这个是为2的时候的截图


唤起消费进程

上面说到的data queue (数据队列) DataStreamer负责树立数据队列,它的职责是根据datanode列表来要求namenode分配合适的新块来存储数据副本,这一组

2、DataStreamer

      DataStreamer是一个后台工作线程,它负责在数据流管道中往DataNode发送数据包。它从NameNode申请获取一个新的数据块ID和数据块位置,然后开始往DataNode的管道写入流式数据包。每个数据包都有一个序列号sequence number。当一个数据块所有的数据包被发送出去,并且每个数据包的确认信息acks被接收到的话,DataStreamer关闭当前数据块,然后再向NameNode申请下一个数据块。

      所以,才会有上述发送数据包和确认数据包这两个队列。

      DataStreamer内部有很多变量,大体如下:

datanode构成一个管线




数据块存储在datanode中,但是fsimage并不描述datanode,取而代之的是,namenode将这种映射关系存放在内存当中,当datanode假如集群的时候,namenode向datanode索取块列表,以建立块的映射关系,namenode还将定期的征询datanode以确保它有最新的块映射



作者: 不二晨    时间: 2018-9-20 17:35
奈斯




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2