File Read

程序举例:

 public class FileRead {

     public static void main(Sting[] args) throws Exception {
       Configuration conf = new Configuration();
       FileSystem fs = FileSystem.get(conf);
       InputStream in = new InputStream();
       in = fs.open(new Path(args[0]));
       IOUtils.copyBytes(in, System.out, 4096, false);
       IOUtils.closeStream(in);
     }
 }  

过程分析:

(1)open

当client读取文件时,在FileSystem ojbect上调用open()方法,而FileSystem是HDFS的一个instance;

从上述程序中可见:

line5 得到FileSystem的instance

line7 调用FileSystem上的open()方法

(2)get block location

随后,HDFS通过RPC(Remote Procedure Call)来呼叫namenode, 来获得the locations of the blocks for the first few blocks, 对于每一个block, namenode会返回有此block的datanode 的 address, 而且datanode会根据Network Topology被重新排序;

获取locations以后,DFS会返回一个FSDataInputStream给client来读取数据, FSDataInputStream会依次wrap一个DFSInputStream来管理datanode和namenode的I/O,DFSInputStream上同时也存储了first few datanode 的address;

(3)read

client 在FSDataInputStream上call read(), 则DFSInputStream会连接存储第一个block的最近的datanode, 之后不停地call read()方法从datanode读取数据到client, 当到达block的末尾,DFSInputStream会关闭与此datanode的连接, 然后找到存储下一个block的datanode, 依次往复...

(4) DFSInputStream

DFSInputStream按顺序读入每一个packet的最近的一个block, 每读一个block都要重新和一个datanode建立连接;

DFSInputStream同时会和namenode保持连接,来重新获取下一个packet的blocks所在的datanode的locations

(5)FSDataInputStream

FSDataInputStream 是client和datanode连接的中介, client call read() methods 都通过FSDataInputStream来调用DFSInputStream

(6)容错

在读取数据的过程中遇到的错误主要有两类:

1. DFSInputStream和datanode 的communication出现错误, 此时DFSInputStream会尝试连接保存此packet的下一个block所在的datanode中最近的一个, 同时会记录此datanode, 防止读取下一个block是再次从该datanode上读取;

2. DFSInputStream checksum data from datanode时,发现损坏的数据块, 则它会在DFSInputStream尝试从另一个datanode读取此packet的下一个block副本之前报告给namenode;

File Write

程序举例:

 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.conf.Configuration;

 public class CreateDir {
   public static void main(String[] args) throws Exception {
     Configuration conf = new Configuration();
     String dst = args[0];
     FileSystem fs = FileSystem.get(conf);
     fs.create(new Path(dst));
   }
 }

过程分析:

(1)create

当client 写入文件时, 在FileSystem object上调用create()方法, FileSystem是HDFS的一个instance;

(2) create new file in filesystem's namespace

DFS 通过Remote Procedure Call 来call namenode, namenode会在filesystem的namespace产生一个新的文件, 新建文件之前,nanemode会做一些列检查,包括client是否有create file的permission, 要create的文件是否已经存在, 若检查没有通过,则抛出IOException;

create file以后,DFS会返回一个FSDataOutputStream给client来写文件, FSDataInputStream会wrap一个DFSOutputStream来与namenode和datanode交流;

(3) client write data

client开始写入数据到文件时,DFSOutputStream会将待写入的数据split into 很多packets, 这些packet会被写入一个内部队列data queue, DFSOutputStream维护此data queue;

这个data queue将被DataStreamer所用,DataStreamer主要负责向namenode发出申请,来为新的packet的block副本分配合适的datanode, namenode会挑选出合适的datanodes来存储这些data blocks;

存储这个packet的blocks的datanode会组成一个pipeline, 假设每个packet的block的replication level是3, 则此pipeline由3个datanode组成。

DataStreamer将此packet导入pipeline的第一个datanode, 该datanode存储此packet之后forward it to 第二个datanode, 同样地,第二个datanode存储此packet, forward to 第三个datanode;

(4) 容错

从(3)中我们知道DFSOutputStream维护着一个data queue, 此外,

DFSOutputStream还维护一个ack queue(acknowledged), 当一个packet已经被所有在pipeline中的datanode acknowledged, 则,此packet将会从ack queue中移走;

如果写数据时,一个datanode 写入失败,则会发生以下动作:

首先, pipeline会关闭,所有在ack queue中的packets会被添加到data queue前面,以保证下游的datanode不会丢失任何packets, 当前已写入datanode的数据块会被标识, 而写入坏的datnode中的部分数据会在此datanode recover以后被删除;

failed的datanode将从pipeline中移走, namenode 会notice到这些,会重新分配一个datanode来组成新的pipeline; 下一个packet的block不会受到影响;

当写入一个block时若大量的datanode failed,只要满足dfs.replication.min(default is 1), 则此写入就不会失败,block会被复制并同步到cluster上的datanode中,知道达到dfs.replication所设的数目(默认是3)

(5)数据写入的收尾阶段

当client完成数据写入是,client会调用在FSDataOutputStream 上的close()。 此动作会在给namenode发送file完成写入的信号之前flushs所有剩余的packets到datanode pipeline并等待acknowledge;

因为DataStreamer之前曾为所有的packets向namenode申请过block locations, 故namenode已经知道此文件由哪些blocks组成。

hadoop2.2原理:分析HDFS的文件读写的更多相关文章

  1. HDFS API 文件读写代码演示

    一:准备工作 1.新建class类 2.开启HDFS服务 3.将配置文件拷贝进resources路径 方便了Configuration的读取配置. 二:读出HDFS文件系统中的文件到控制台 4.读出在 ...

  2. 012 HDFS API 文件读写代码演示

    一:准备工作 1.新建class类 2.开启HDFS服务 3.将配置文件拷贝进resources路径 方便了Configuration的读取配置. 二:读出HDFS文件系统中的文件到控制台 4.读出在 ...

  3. 【Hadoop】二、HDFS文件读写流程

    (二)HDFS数据流   作为一个文件系统,文件的读和写是最基本的需求,这一部分我们来了解客户端是如何与HDFS进行交互的,也就是客户端与HDFS,以及构成HDFS的两类节点(namenode和dat ...

  4. 2、Hdfs架构设计与原理分析

    文章目录 1.Hadoop架构 2.HDFS体系架构 2.1NameNode 2.1.1元数据信息 2.1.2NameNode文件操作 2.1.3NameNode副本 2.1.4NameNode心跳机 ...

  5. Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题

    Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...

  6. Hadoop2源码分析-HDFS核心模块分析

    1.概述 这篇博客接着<Hadoop2源码分析-RPC机制初识>来讲述,前面我们对MapReduce.序列化.RPC进行了分析和探索,对Hadoop V2的这些模块都有了大致的了解,通过对 ...

  7. 大数据【二】HDFS部署及文件读写(包含eclipse hadoop配置)

    一 原理阐述 1' DFS 分布式文件系统(即DFS,Distributed File System),指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连.该系统架构 ...

  8. [置顶] Hadoop2.2.0中HDFS的高可用性实现原理

    在Hadoop2.0.0之前,NameNode(NN)在HDFS集群中存在单点故障(single point of failure),每一个集群中存在一个NameNode,如果NN所在的机器出现了故障 ...

  9. HDFS 文件读写过程

    HDFS 文件读写过程 HDFS 文件读取剖析 客户端通过调用FileSystem对象的open()来读取希望打开的文件.对于HDFS来说,这个对象是分布式文件系统的一个实例. Distributed ...

随机推荐

  1. Linux用户级线程和内核级线程区别

    1.内核级线程: (1)线程的创建.撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调度实体的线程.(2)这些线程可以在全系统内进行资源的竞争.(3)内核空间内为每一个内核支持线程设置了一个线 ...

  2. vim 的 tags 模块 与 ctags

    1. 概述 一般来说,在代码中跳转,离不开 ctags. 实际上,vim 中代码跳转是由 vim tags 模块完成的,tags 模块依赖于 tags 文件. ctags(Generate tag f ...

  3. php 一维数组排序,保留key值

    function sort_with_keyName($arr,$orderby='desc'){ //在内存的另一处 $a 复制内容与 $arr 一样的数组 foreach($arr as $key ...

  4. mysql cluster 安装配置方案

    mysql cluster (mysql 集群)安装配置方案   一.准备 1.准备服务器 计划建立有5个节点的MySQL CLuster体系,需要用到5台服务器,但是我们做实验时没有这么多机器,可以 ...

  5. crontab环境变量问题

    今天设置linux定时任务时,python内调用的shell指令总执行失败,单独调用python脚本则无问题,考虑到是环境变量未生效引起. 故在执行crontab -e编辑配置文件时,将shell内执 ...

  6. C++对象创建与释放

    创建对象有以下四种形式: #include <iostream> using namespace std; class A{ private: int i; public: A(){ co ...

  7. Ajax跨域请求——PHP服务端处理

    header('Access-Control-Allow-Origin:*'); // 响应类型 header('Access-Control-Allow-Methods:POST'); // 响应头 ...

  8. JSON Date Format/JSON 日期格式方法分享

    我是很懒的,不想多说,所以直接上代码.亲们懂的. <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://w ...

  9. jquery checkbox 选中 全选 插件

    checkbox  选中 全选 在项目中经常用到,但是不同的程序员写出的东西各有差异,在此整合了jquery checkbox插件,用起来很方便,也总结了我们项目中通常会出现问题的地方,一行代码搞定. ...

  10. Centos7 设置IPtables

    entOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop firewalld.service #停止fire ...