zoukankan      html  css  js  c++  java
  • 使用客户端操作hdfs

    一、HDFS
    1. HDFS的本质是一个文件系统,特点是分布式,需要在多台机器启动多个NN,DN进程组成一个分布式系统

    2. HDFS不支持对一个文件的并发写入,也不支持对文件的随机修改,不适合存储小文件(存储小文件时会降低NN的服务能力)

    3. HDFS的块大小
    块大小可以通过hdfs-site.xml中的dfs.blocksize进行配置!
    如果不配置,那么在hadoop1.x时,dfs.blocksize=64M,在hadoop2.xdfs.blocksize=128M

    默认值为128M的原因:
    hadoop默认使用hadoop的集群的机器都采用普通的机器磁盘!

    基于最佳传输消耗理论,一次传输中寻址时间为总传输时间的1%为最佳状态!

    目前机器磁盘的寻址时间普遍为10ms, 10ms / 1% * 磁盘的写入速度(100M/S)=100M

    如果公司的磁盘写入速度为300M/S,可以将dfs.blocksize=256M,
    如果公司的磁盘写入速度为500M/S,可以将dfs.blocksize=512M。

    块大小不能太小:
    如果块太小,会造成降低NN的服务能力!在读取和上传一个大的文件时带来额外的寻址时间消耗

    块大小不能太大:
    如果块太大,在一次上传时,如果发生异常,需要重新传输,造成网络IO资源的浪费!
    在随机读取某部分内容时,不够灵活!

    4. 两个概念
    块大小指的是块的极限值!
    副本数指的也是副本的最大值!

    这两个参数都是在客户端上传文件时指定!

    5. 块的属性
    length: 块的实际大小
    offset: 块的便宜量,这个块从文件的哪部分开始保存数据

    二、使用客户端操作hdfs

    1.使用shell客户端
    hadoop fs 命令 参数: 既可以操作本地模式的HDFS也可以操作分布式的HDFS
    hdfs dfs 命令 参数: 只操作分布式的HDFS

    2.使用javaapi
    FileSystem: 客户端的基类
    LocalFileSystem: 本地文件系统
    DistributedFileSystem: 分布式文件系统

    具体的实现取决于配置文件的fs.defaultFS参数的配置!

    Configuration: 负责读取配置文件中的参数,保存到一个map中!
    默认Configuration会读取类路径下8个配置文件!

    Configuration.set(name,value): 手动添加属性

    Path : 一个文件的路径
    Path.toString() : 输出文件的完整的URI(协议+路径)
    Path.getName() : 输出文件名

    FileStatus: 文件的状态(文件的属性信息)
    LocatedFileStatus: 除了包含文件的属性信息,还包含文件所有的块的位置信息(length,offset,hosts)

    FileSystem.listStatus(Path p) | FileSystem.getFileStatus(Path p)

    2.自定义上传和下载

    上传: 获取本地文件系统对文件文件的一个输入流,读取文件,将读到的数据通过HDFS上对目标路径的输出流,进行写出!
    下载: 获取HDFS文件系统对文件的一个输入流,读取文件,将读到的数据通过本地文件系统上对目标路径的输出流,进行写出!

    ①获取文件系统上对某个路径的输入流 : DFSFileInputStream is=FileSystem.open(Path p);
    ②获取文件系统上对某个路径的输出流 : FileSystem.create(Path p);
    ③数据的拷贝 : IOUtils.copyBytes(in,out,4096,true);
    ④定位读取: DFSFileInputStream.seek(int offset);

    三、文件的读写流程
    1.写流程
    ①启动服务端NN,DN进程,提供一个分布式文件系统客户端
    ②由客户端向NN发送请求,请求上传一个文件,NN对请求进行合法性检查(权限,路径是否合法,路径是否已经存在)
    ③如果合法,NN响应客户端允许上传
    ④客户端根据自己设置的块大小,读取文件中第一块的内容,请求NN分配DN列表
    ⑤NN参考客户端上传的文件的副本数,根据机架感知,返回对应的DN列表
    ⑥客户端会请求举例最近的DN节点,再由DN列表中的每个DN节点都请求举例最近的DN节点,建立数据传输通道
    ⑦通道建立完成,客户端将第一块的数据,封装为一个个packet,发送到通道的下一个节点
    通道的每一个DN节点在收到packet后,进行校验,检验合法,罗盘存储,将packet发送到下一个DN节点,回复客户端ack确认消息!
    ⑧第一个块传输完成后,DN向NN上报块的消息,只要有一个DN节点上报块信息,NN就认为这个块已经传输完成,通道关闭,
    开始下一个块的传输
    ⑨下一个块依次按照④-⑧流程传输
    ⑩所有的块传输完成后,NN响应客户端传输完成,客户端关闭输出流

    2.异常写流程
    在写流程的⑦,客户端每封装一个packet(64K),将packet存储到dataQuene队列中,在发送时,将dataQuene队列中的
    每个packet依次发送到通道,packet在发送到通道后,会从dataQuene中移动到ackQuene队列!

    一旦一个packet收到了所有dn节点回复的ack确认消息,ackQuene中的这个packet会被删除!
    如果在收到确认消息时,超时,此时中断传输,所有外部的packet,会立刻回滚到dataQuene,重新建立传输通道,
    剔除坏的节点,继续传输,只要有传输完成后,DN向NN上报块的消息,
    只要有一个DN节点上报块信息,NN就认为这个块已经传输完成,通道关闭。

    副本数如果暂时不满足条件,之后NN会自动检查,维护副本数!

    3.读流程
    ①启动服务端NN,DN进程,提供一个分布式文件系统客户端
    ②由客户端向NN发送请求,请求下载一个文件,NN对请求进行合法性检查(权限,路径是否合法)
    ③如果合法,NN响应客户端允许下载,同时返回当前下载文件的所有元数据信息(块的映射信息)
    ④客户端根据返回的元数据信息,去每个对应的DN节点按照顺序依次下载每个块

    4.拓扑距离
    拓扑距离指网络中各个节点之间抽象的一种距离!通常指两个节点到达共同祖先节点的和!
    一般为2n

    5.机架感知
    2.7.2的默认的机架感知策略:
    在本地机架挑选一个节点,保存第一个副本!如果本地机架没有DN节点,挑选距离本地机架最近的一个节点!
    在本机机架挑选另一个节点,保存第二个副本!如果本地机架没有DN节点,挑选距离本地机架最近的一个节点!
    在其他机架选择一个节点,保存第三个副本!

  • 相关阅读:
    HDOJ 1028 母函数分析
    尼姆博弈的典型例题
    HDOJ1232 畅通工程 DFS
    第一个八皇后
    HDOJ 1242
    我的“插入算法”实现
    第五讲 this 类变量 类方法
    我的“二分查找算法”实现
    我对锤子ROM 功能的看法——视觉篇
    第六讲 Java 四大特性:抽象 封装 继承 多态
  • 原文地址:https://www.cnblogs.com/20183544-wangzhengshuai/p/13751787.html
Copyright © 2011-2022 走看看