zoukankan      html  css  js  c++  java
  • Hadoop基础-HDFS的读取与写入过程剖析

                    Hadoop基础-HDFS的读取与写入过程剖析

                                         作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

      本篇博客会简要介绍hadoop的写入过程,并不会设计到源码,我会用图和文字来描述hdfs的写入过程。

    一.hdfs写数据流程

     

       如上图所示,想要把一个4.2G的文件写入到hdfs集群中,它是怎么实现的呢?其步骤简要如下:

    1>.客户端向NameNode请求在"/user/yinzhengjie/movies/"目录下上传一个名称叫“苍老师.rmvb”的视频;

    2>.NameNode检查客户端是否有权限上传,如果有返回客户端可以上传,否则返回权限被拒绝。

    3>.客户端请求第一个block上传到哪几个DataNode服务器上;

    4>.NameNode返回3个DataNode节点,分别为DataNode1,DataNode2,DataNode3(如上图所示);

    5>.客户端请求DataNode1上传数据,DataNode1收到请求会继续调用DataNode2,然后DataNode2再调用DataNode3,将这个同学管道简历完成;

    6>.DataNode1,DataNode2,DataNode3逐级应答客户端

    7>.客户端开始往DataNode1上传第一个block(先从磁盘读取数据存放到一个本地内存缓冲区),以package为单位,DataNode1收到一个package就会传给DataNode2,DataNode2传给DataNode3;DataNode1每传一个packet会放入一个应答队列等待应答;

    8>.当一个block传输完成后,客户端再次请求NameNode上传第二个block的服务器。(重复执行3~7步)

    HDFS Client:
        DistributedFileSystem:分布式文件系统,负责链接NameNode
        FSDataOutputStream:数据输出流,负责数据的存储和输出
    
    NameNode:
        存放元数据
        
    DataNode:
        存储数据
        
        
    一致性模型:
        hdfs默认的写入方式是:客户端开始往DataNode1上传第一个block(先从磁盘读取数据存放到一个本地内存缓冲区),
    以package为单位,DataNode1收到一个package就会传给DataNode2,DataNode2传给DataNode3;DataNode1每传一个
    packet会放入一个应答队列等待应答。
        据说所述,默认的写入方式可靠性很强,但是也意味着会消耗着大量的传输时间,浪费了大量的时间。如果客户端开始往
    DataNode1上传第一个block成功后,DataNode1立即写入数据到磁盘并告诉NameNode写入完毕,接下来就上传第二个block,
    与此同时,DataNode1会将client传来的数据同步到其它两个节点中。
        想要使用一致性模型,我们在写入的时候只要调用输出流的“hflush()”一致性刷新方法即可。
        

    二.hdfs读数据流程

      如上图所示,想要把一个4.2G的文件从hdfs集群中读取,它是怎么实现的呢?其步骤简要如下:

    1>.客户端向NameNode请求下载"/user/yinzhengjie/movies/苍老师.rmvb"的文件;

    2>.NameNode通过查询元数据,如果找到文件块所在的DataNode地址列表就返回给客户端,如果没有找到元数据信息就返回客户端访问的资源不存在;

    3>.客户端拿到NameNode的数据之后,挑选一台DataNode服务器(就近原则,然后随机)请求读取数据;

    4>.DataNode开始传输数据给客户端(从磁盘里面读取数据放入流,以package为单位来做实验);

    5>.客户端以package为单位接收,现在本地缓存,然后写入目标文件;

    一. Hadoop中需要哪些配置文件,其作用是什么?
    1>core-site.xml:
        (1)fs.defaultFS:hdfs://cluster1(域名),这里的值指的是默认的HDFS路径 。
        (2)hadoop.tmp.dir:/export/data/hadoop_tmp,这里的路径默认是NameNode、DataNode、secondaryNamenode等存放数据的公共目录。用户也可以自己单独指定这三类节点的目录。
        (3)ha.zookeeper.quorum:hadoop101:2181,hadoop102:2181,hadoop103:2181,这里是ZooKeeper集群的地址和端口。注意,数量一定是奇数,且不少于三个节点 。
    2>.hadoop-env.sh: 只需设置jdk的安装路径,如:export JAVA_HOME=/usr/local/jdk。
    3>.hdfs-site.xml:
        (1)dfs.replication:他决定着系统里面的文件块的数据备份个数,默认为3个。
        (2)dfs.data.dir:datanode节点存储在文件系统的目录 。
        (3)dfs.name.dir:是namenode节点存储hadoop文件系统信息的本地系统路径 。
    4>.mapred-site.xml:
        mapreduce.framework.name: yarn指定mr运行在yarn上。
    
    二.请列出正常工作的Hadoop集群中Hadoop都分别需要启动哪些进程,它们的作用分别是什么?
    1>.NameNode它是hadoop中的主服务器,管理文件系统名称空间和对集群中存储的文件的访问,保存有metadate。
    2>.SecondaryNameNode它不是namenode的冗余守护进程,而是提供周期检查点和清理任务。帮助NN合并editslog,减少NN启动时间。
    3>.DataNode它负责管理连接到节点的存储(一个集群中可以有多个节点)。每个存储数据的节点运行一个datanode守护进程。
    4>.ResourceManager(JobTracker)JobTracker负责调度DataNode上的工作。每个DataNode有一个TaskTracker,它们执行实际工作。
    5>.NodeManager(TaskTracker)执行任务。
    6>.DFSZKFailoverController高可用时它负责监控NN的状态,并及时的把状态信息写入ZK。它通过一个独立线程周期性的调用NN上的一个特定接口来获取NN的健康状态。FC也有选择谁作为Active NN的权利,因为最多只有两个节点,目前选择策略还比较简单(先到先得,轮换)。
    7>.JournalNode 高可用情况下存放namenode的editlog文件。
    
    三.简述Hadoop的几个默认端口及其含义
    1>.dfs.namenode.http-address:50070
    2>.SecondaryNameNode辅助名称节点端口号:50090
    3>.dfs.datanode.address:50010
    4>.fs.defaultFS:8020 或者9000
    5>.yarn.resourcemanager.webapp.address:8088
  • 相关阅读:
    python __init__.py
    估算小结
    ssh vim中不小心按下ctrl+s
    估算方法
    SSH 下使vim语法高亮显示 && 终端下vim配置
    not enough arguments for format string搞死人
    函数的形参 实参
    Linux 共享内存机制
    select函数参数及其使用
    找出两个字符串最长公共子串
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/9614267.html
Copyright © 2011-2022 走看看