zoukankan      html  css  js  c++  java
  • 初识hadoop及伪集群部署

    hadoop:包含分布式文件系统和分布式计算的一个框架。 HDFS,mapreduce

    1. HDFS的架构:三种节点:NN,SNN,DN。

      1. 不可替代
      2. 存放海量的数据。
        1. 数据 --》----》文件—》存放HDFS—》数据文件(元数据,内容数据)—》元数据在NN,内容数据形成block在DN。
      3. 非常兼容各种分布式计算
        在这里插入图片描述

    HDFS:分布式文件存储系统,提供了 高可靠性、高扩展性和高吞吐率的数据存储服务;

    分布式计算框架MapReduce:计算向数据移动,具有易于编程、高容错性和高扩展性等优点;

    分布式资源管理框架YARN:负责集群资源的管理和调度;

    1.HDFS优点:

    高容错性

    ​ •数据自动保存多个副本

    ​ • 副本丢失后,自动恢复

    适合批处理

    ​ •移动计算而非数据

    ​ •数据位置暴露给计算框架(Block偏移量)

    适合大数据处理

    ​ •GB 、TB 、甚至PB 级数据

    ​ •百万规模以上的文件数量

    ​ •10K+ 节点

    可构建在廉价机器上

    ​ •通过多副本提高可靠性

    ​ •提供了容错和恢复 机制

    2.HDFS缺点:

    低延迟数据访问

    ​ •比如毫秒级

    ​ •低延迟与高吞吐率

    小文件存取

    ​ •占用NameNode 大量内存

    ​ •寻道时间超过读取时间

    并发写入、文件随机修改

    ​ •一个文件只能有一个写者

    ​ •仅支持append

    3.存储模型:字节

    文件线性切割成块(Block):偏移量 offset (byte),Block分散存储在集群节点中,单一文件Block大小一致,文件与文件可以不一致,数据文件切割形成的;

    Block可以设置副本数,副本分散在不同节点中

    •副本数不要超过节点数量

    文件上传可以设置Block大小和副本数,已上传的文件Block副本数可以调整,大小不变

    只支持一次写入多次读取,同一时刻只有一个写入者,可以append追加数据

    4.架构模型

    –文件元数据MetaData,文件数据

    •元数据

    •数据本身

    (主)NameNode节点保存文件元数据:单节点 posix

    (从)DataNode节点保存文件Block数据:多节点

    DataNode与NameNode保持心跳,提交Block列表

    HdfsClient与NameNode交互元数据信息

    HdfsClient与DataNode交互文件Block数据

    在这里插入图片描述

    5.节点的作用:

    **1.NameNode(NN)主: **

    ​ 1、接受客户端的读写请求。

    ​ 2、存储和管理HDFS的元数据(收集DataNode汇报的Block列表信息)。

    ​ 3、基于内存存储 ,不会和磁盘发生交换;

    **2.SNN: **合并元数据文件(edits 和 fsimage)(这个功能也可以由其他节点来完成)

    它不是NN的备份(但可以做备份),它的主要工作是帮助NN合并edits log,减少NN启动时间。

    SNN执行合并时机

    ​ •根据配置文件设置的时间间隔fs.checkpoint.period 默认3600秒

    ​ •根据配置文件设置edits log大小 fs.checkpoint.size 规定edits文件的最大值默认是64MB ,最大128M

    3.DataNode(DN)从 :

    ​ 1、存放和管理block(数据),

    ​ 2、实时往NN汇报

    ​ 3、通过向NN发送心跳保持与其联系(3秒一次),如果NN 10分钟没有收到DN的心跳,则认为其已经lost,并copy其上的block到其它DN。

    4.block(数据块):数据文件切割之后形成一个一个的数据块。还有偏移量 offset (byte),每个块默认有3个副本。默认64M,最大128M

    5.元数据:除文件内容之外的。包括文件的名字、时间、所属用户、权限、大小等等,包括block的位置信息。

    1. **读写流程:**重点

      1. 写流程

        Client:

        ​ 切分文件Block

        ​ 按Block线性和NN获取DN列表(副本数)

        ​ 验证DN列表后以更小的单位流式传输数据

        ​ 各节点,两两通信确定可用

        Block传输结束后:

        ​ DN向NN汇报Block信息

        ​ DN向Client汇报完成

        ​ Client向NN汇报完成

        ​ 获取下一个Block存放的DN列表

        ​ 最终Client汇报完成

        ​ NN会在写流程更新文件状态

        解释2:

        客户端调用 create()来创建文件, Distributed File System 用 RPC 调用 NameNode

        节点, 在文件系统的命名空间中创建一个新的文件。 NameNode 节点首先确定文件原来不

        存在, 并且客户端有创建文件的权限, 然后创建新文件。

        Distributed File System 返回 DFSOutputStream, 客户端用于写数据。 客户端开始

        写入数据, DFSOutputStream 将数据分成块, 写入 Data Queue。 Data Queue 由 Data

        Streamer 读取, 并通知 NameNode 节点分配数据节点, 用来存储数据块(每块默认复制 3

        块)。 分配的数据节点放在一个 Pipeline 里。 Data Streamer 将数据块写入 Pipeline 中的第

        一个数据节点。 第一个数据节点将数据块发送给第二个数据节点。 第二个数据节点将数据发

        送给第三个数据节点。

        DFSOutputStream 为发出去的数据块保存了 Ack Queue, 等待 Pipeline 中的数据节

        点告知数据已经写入成功。
        在这里插入图片描述

      2. 读流程

        Client:

        ​ •和NN获取一部分Block副本位置列表

        ​ •线性和DN获取Block,最终合并为一个文件

        ​ •在Block副本列表中按距离择优选取

        在这里插入图片描述

    2. fsimage和edits的合并

      edits文件记录了客户端对HDFS所做的各种更新操作,客户端所有的写操作都被记录在了此文件中。
      而fsimage文件记录了元数据的文件,这个文件不是实时的,通俗来说,更像是对HDFS的一个快照,它记录了某个时刻下的HDFS的状态信息。
      触发这两个文件合并的条件
      1.HDFS的重新启动
      2.edits文件达到指定的大小(默认64M,可更改)

      3.设置了指定时间促使两文件合并(默认3600s,可更改)

      合并过程(SecondaryNameNode)

      NameNode中产生一个新的edits文件,名为edits.new后续的更新操作写在此文件中
      SecondaryNameNode通过http协议从Name上获取edits文件和fsimage文件
      在SecondaryNameNode上将fsimage文件加载到内存中,然后将edits文件的操作更新到内存中,然后写成一个新的文件fsimage.ckpt
      SecondaryNameNode通过http协议将fsimage.ckpt文件发送到NameNode上

      NameNode将fsimage.ckpt文件更名为fsimage,将edits.new更名为edits

      注意:

      SecondaryNameNode不是NameNode的热备,但也能起到一定的备份作用,这就说明在一定情况下可能会产生数据丢失情况,所以在Hadoop2.0完全分布式中,抛弃了SecondaryNameNode,采用了双NameNode机制来进行热备

      edits文件和fsimage文件的合并发生在SecondaryNameNode上是因为这两个文件比较合并耗时,如果在NameNode上合并可能会导致系统卡顿,所以在SecondaryNameNode上进行

    在这里插入图片描述

    在这里插入图片描述

    hadoop 伪集群部署

    1.环境准备

    1.1.配置jdk

    从已有服务器中远程拷贝jdk
    scp -r jdk1.8.0_171-amd64 root@192.168.200.23:/usr/local/jdk1.8
    配置环境变量
    vi ~/.bash_profile 
    export JAVA_HOME=/usr/local/jdk1.8
    export JRE_HOME=/usr/local/jdk1.8/jre
    export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
    export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH 
    使文件生效
    source ~/.bash_profile 
    

    1.2.配置SSH免密钥登陆

    远程登陆操作示例:
    ssh root@192.168.200.22 'ls -l /'
    
    #创建密钥公钥文件,实现是把公钥放在访问方的认证文件里
    $  ssh-keygen -t dsa -P '' -f /root/.ssh/id_dsa
    $  cd ~/.ssh/
    $  ll
    总用量 12
    id_dsa   #密钥
    id_dsa.pub   #公钥
    known_hosts
    
    #把公钥放在访问方的认证文件里
    cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
    测试
    [root@bd003 .ssh]# ssh root@localhost
    The authenticity of host 'localhost (::1)' can't be established.
    RSA key fingerprint is 2c:67:f7:97:59:8c:de:d0:c5:75:1a:fb:32:35:09:55.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
    Last login: Tue Jun 11 13:49:32 2019 from 192.168.200.1
    [root@bd003 ~]# 
    #没有输入密码即可进
    复制密钥
    /root/.ssh
    [root@bd003 .ssh]# ssh-copy-id -i ~/.ssh/id_dsa.pub root@bd002
    
    到此完成
    

    1.3.时间同步

    yum install ntp
    service ntpd status
    ntpdate time.nist.gov
    或者
    date -s "2019-6-11 09:25:10"
    

    1.4.配置hosts

    vi /etc/hosts
    添加
    192.168.200.21 bd001
    192.168.200.22 bd002
    192.168.200.23 bd003
    192.168.200.24 bd004
    
    查看network
    [root@bd003 /]# cat /etc/sysconfig/network
    NETWORKING=yes
    HOSTNAME=bd003
    

    2.hadoop部署

    2.1 上传解压安装包

    解压
    tar -zxvf hadoop-2.7.7.tar.gz
    移动
    mv hadoop-2.7.7 /opt/bd/
    

    2.2配置hadoop环境变量

    vi ~/.bash_profile
    
    
    export HADOOP_HOME=/opt/bd/hadoop-2.7.7
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    
    修改内置的环境变量
    /opt/hadoop-2.6.5/etc/hadoop/hadoop-env.sh
    文件中修改部分:
    # The java implementation to use.
    export JAVA_HOME=/usr/local/jdk1.8
    #同样的修改mapred-env.sh和yarn-env.sh中的JAVA_HOME
    

    2.3配置hadoop

    1./opt/hadoop-2.6.5/etc/hadoop/core-site.xml 	
    <configuration>
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://bd003:9000</value>
        </property>
        
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/opt/hadoop_data</value>
        </property>
        
    </configuration>
    
    2./opt/hadoop-2.6.5/etc/hadoop/hdfs-site.xml 
    <configuration>
        <property>
            <name>dfs.replication</name>
            <value>1</value>
        </property>
        <property>
            <name>dfs.namenode.secondary.http-address</name>
            <value>bd003:50090</value>
        </property>
    
    </configuration>
    
    3./opt/hadoop-2.6.5/etc/hadoop/slaves
    bd003
    
    
    
    
    

    2.4 NameNode 格式化

    /opt/hadoop-2.6.5/etc/hadoop/bin
    ./hadoop namenode -format
    

    2.5 启动

    /opt/hadoop-2.6.5/sbin
    [root@bd003 sbin]# ./start-dfs.sh 
    
    

    访问: http://192.168.200.23:50070/

    上传测试文件

    /opt/hadoop-2.6.5/bin
    [root@bd003 bin]# ./hdfs dfs -put ~/hadoop-2.6.5.tar.gz  /
    
  • 相关阅读:
    Java中线程池,你真的会用吗?ExecutorService ThreadPoolExcutor
    springcloud中微服务的优雅停机(已验证)
    SpringCloud eureka
    Spring Boot实战:静态资源处理
    你真的理解CountDownLatch与CyclicBarrier使用场景吗?
    Effective.Java第56-66条(规范相关)
    Effective.Java第45-55条(规范相关)
    Effective.Java第34-44条(枚举)
    装饰(Decorator)模式
    合成(Composite)模式
  • 原文地址:https://www.cnblogs.com/ernst/p/12819186.html
Copyright © 2011-2022 走看看