zoukankan      html  css  js  c++  java
  • 【Hadoop】hdfs,剖析文件上传

    文件上传原理图

    在这里插入图片描述

    剖析文件写入

    1.客户端(client)通过对DistributedFileSystem对象调用create()来新建文件;

    FSDataOutputStream outputStream = fileSystem.create(new Path("/test.txt"));
    

    2.DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间新建一个文件,此时该文件还没有相应的数据块;

    namenode会执行各种不同的检查以确保这个文件不存在以及客户端有新建该文件的权限。
    如果通过检查
    	namenode就会创建新文件记录的一条记录
    否则
    	文件创建失败并向客户端抛出一个IOException异常
    	
    DistributedFileSystem向客户端返回一个FSDataOutputStream对象,由此客户端可以开始写入数据。
    
    就像读取事件一样,FSDataOutputStream封装一个DFSoutPutstream对象,该对象负责处理datanode与namenode之间的通信
    
    
    public FSDataOutputStream create(Path f, final FsPermission permission, final EnumSet<CreateFlag> cflags, final int bufferSize, final short replication, final long blockSize, final Progressable progress, final ChecksumOpt checksumOpt) throws IOException {
            this.statistics.incrementWriteOps(1);
            Path absF = this.fixRelativePart(f);
            return (FSDataOutputStream)(new FileSystemLinkResolver<FSDataOutputStream>() {
                public FSDataOutputStream doCall(Path p) throws IOException, UnresolvedLinkException {
                    DFSOutputStream dfsos = DistributedFileSystem.this.dfs.create(DistributedFileSystem.this.getPathName(p), permission, cflags, replication, blockSize, progress, bufferSize, checksumOpt);
                    return DistributedFileSystem.this.dfs.createWrappedOutputStream(dfsos, DistributedFileSystem.this.statistics);
                }
    
                public FSDataOutputStream next(FileSystem fs, Path p) throws IOException {
                    return fs.create(p, permission, cflags, bufferSize, replication, blockSize, progress, checksumOpt);
                }
            }).resolve(this, absF);
        }
    

    3.在客户端写入数据时,DFSOutpuStream将它分成一个个的数据包,并写入内部队列,称为“数据队列”(data queue)。

    4.DataStreamer处理数据队列,它的责任是挑选出适合存储数据复本的一组datanode,并据此来要求namenode分配新的数据块。这一组datanode构成一个管线----我们假设副本数为3,所以管线中有3个节点。

    5.DFSOutputStream也维护着一个内部数据包队列来等待datanode的收到确认回执,称为“确认队列”。收到管道中所有datanode确认信息后,该数据包才会从确认队列删除。

    如果某一个datanode凉了(宕机),怎么办?
    在这里插入图片描述

    6.客户端完成数据写入后,对数据流调用close()方法。

    7.该操作将所有的数据包写入datanode管线,并在联系到namenode告知其文件在写入之前,等待确认。

  • 相关阅读:
    [转]在SQL Server中,关于with as使用介绍
    系统设计笔记【不断更新中】
    关于PHPZend framework2 框架 学习过程。 阅前须知: ZF2中的配置文件是可以静态文件配置来注册和通过相关函数动态注册。 1.EventManager(事件驱动),关于事件驱动,在ZF2相关资料没有详细说明,可以参考ANDROID的事件驱动,MFC的消息响应/事件驱动。
    http://www.mwop.net/blog/248IntroducingtheZF2PluginBroker.html
    Introducing AkrabatSession zf2
    http://127.0.0.1/loginapi/JsonPacket/example/loginrequestdemo.php
    if ($this>getRequest()>isPost()) {
    email
    Quenz_i997_PDA_CHS.rar
    http://team.aiitec.net/?c=inbox
  • 原文地址:https://www.cnblogs.com/BIG-BOSS-ZC/p/11807322.html
Copyright © 2011-2022 走看看