zoukankan      html  css  js  c++  java
  • HDFS命令操作和高可用

    1.HDFS的命令行操作

    • 查看所有HDFS的命令

      [root@node01 ~]# hdfs dfs #也可使用hadoop dfs
      
    • 创建HDFS的文件夹,如果父目录不存在,则创建(-p)

      • /user目录是用户父目录,用户名做子目录,、/user/root代表用户家目录
      • 如果使用hdfs shell 缺省hdfs路径的时候,使用该目录
      [root@node01 ~]# hdfs dfs -mkdir -p /user/root
      
    • 删除HDFS的文件夹,如果文件夹非空,则迭代删除(-r)

      • 注意:如果是上传到家目录(/user/root)或者删除家目录下的文件,则可以不指定上传路径
      [root@node01 ~]# hdfs dfs -rm -r /user
      
    • 删除root用户在HDFS上的家目录下的hello.txt

      • root用户的HDFS家目录为/user/root
      • 注意:如果是上传到家目录(/user/root)或者删除家目录下的文件,则可以不指定上传路径
      hdfs dfs -rm hello.txt 
      
    • 上传文件到家目录(/user/root)

      • 注意:如果是上传到家目录(/user/root)或者删除家目录下的文件,则可以不指定上传路径
      [root@node01 ~]# hdfs dfs -put ./myapps/hadoop-2.6.5.tar.gz /user/root
      #也可写为[root@node01 ~]# hdfs dfs -put ./myapps/hadoop-2.6.5.tar.gz
      

      1560305444740

    • 将一个大小为2.4M的文件test.txt,按照文件block大小为1M的规则进行切割,并上传到家目录

      • 注意:如果是上传到家目录(/user/root)或者删除家目录下的文件,则可以不指定上传路径
      • 可以在/opt/hadoop_data/dfs/data/current/BP-893326395-192.168.223.101-1560264134076/current/finalized/subdir0/subdir0目录下查看切割后的块信息
      [root@node01 ~]# hdfs dfs -D dfs.blocksize=1048576 -put test.txt
      #也可写为[root@node01 ~]# hdfs dfs -D dfs.blocksize=1048576 -put test.txt /user/root
      

      1560306401779

    1560306637215

    • 上传文件到HDFS的家目录下,文件block副本数为3,文件block大小为1MB

      • 注意:每一个属性前面都要加一个-D
      hdfs dfs -D dfs.replication=3 -D dfs.blocksize=1048576 -put hello.txt /user/root
      

    1560307613554

    2.HA 模式原理

    Hadoop 2.0产生背景

    • Hadoop 1.0中HDFS和MapReduce在高可用、扩展性等方面存在问题
    • HDFS存在的问题
      • NameNode单点故障,难以应用于在线场景
        • 解决方案:HA
      • NameNode压力过大,且内存受限,影扩展性
        • 解决方案:F联邦
    • MapReduce存在的问题 响系统
      • JobTracker访问压力大,影响系统扩展性
      • 难以支持除MapReduce之外的计算框架,比如Spark、Storm等

    Hadoop 1.x与Hadoop 2.x

    1560307732182

    • Hadoop 2.x由HDFS、MapReduce和YARN三个分支构成;
      • HDFS:NN Federation(联邦)、HA;
        • 2.X:只支持2个节点HA,3.0实现了一主多从
      • MapReduce:运行在YARN上的MR;
        • 离线计算,基于磁盘I/O计算
      • YARN:资源管理系统

    HDFS 2.x

    • 解决HDFS 1.0中单点故障(HA)和内存受限(联邦)问题。

    • HDFS2.x中Federation和HA分离,HA只能有两个NameNode

    • 解决单点故障

      • HDFS HA:通过主备NameNode解决
      • 如果主NameNode发生故障,则切换到备NameNode上
    • 解决内存受限问题

      HDFS Federation(联邦):水平扩展,支持多个NameNode;

      • (1)每个NameNode分管一部分目录;
      • (2)所有NameNode共享所有DataNode存储资源
    • 2.x仅是架构上发生了变化,使用方式不变

    • 对HDFS使用者透明

    • HDFS 1.x中的命令和API仍可以使用

    HA(解决单点故障)介绍

    主备NameNode

    解决单点故障(属性,位置

    • 主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换
    • 所有DataNode同时向两个NameNode汇报数据块信息(位置)
    • JNN:集群(属性)
    • standby:备,完成了edits.log文件的合并产生新的image,推送回ANN

    两种切换选择

    • 手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合
    • 自动切换:基于Zookeeper实现

    基于Zookeeper自动切换方案

    • ZooKeeper Failover Controller:监控NameNode健康状态,
    • 并向Zookeeper注册NameNode
    • NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC 锁的NameNode变为active

    主备模型实现

    1560308753215

    1560308449471

    第一部分:fsimage和editslog: 主NameNode向JNN中写一条editslog记录,备用NN就读入一条editslog记录,保证主备NN之间的内存状态一致。

    第二部分:blk文件一致(存储的block块信息)DataNode向主NN和备NN一起汇报存储的block块信息和心跳。

    这样,主备NN之间内存状态完全一致,就可以进行切换了。

    注:fsimage推送的时机通过一些参数来设置,fsimage和editslog合并的工作是由备用NameNode完成。

    1560308797028

    HA工作流程总结

    1. 一个NameNode进程处于Active状态,另1个NameNode进程处于Standby状态。Active的
      NameNode负责处理客户端的请求。
    2. Active的NN修改了元数据之后,会在JNs的半数以上的节点上记录这个日志,Standby状态的
      NameNode会监视任何对JNs上editlog的更改,一旦edits log出规更改,Standby的NN就会根据
      edits log更改自己记录的元数据。
    3. 当发生故障转移时。Standby主机会确保已经读取了JNs上所有的更改来同步它本身记录的元数据,然后由Standby状态切换为Active状态。
    4. 为了确保在发生故障转移操作时拥有相同的数据块位置信息,DNs向所有NN发送数据块位置
      信息和心跳数据。
    5. JNs只允许一台NameNode向JNs写edits log数据,这样就能保证不会发生“脑裂”。

    3. 使用Zookeeper完成主备NN自动切换

    由运维来调。主NN和备用NN之间是由人工来切换的。
    要【实现主备NN间自动切换】,可通过搭建Zookeeper集群来实现。

    Zookeeper: 它是负责选举算法。选举一个Namenode的状态为Active。同时记录每个Namenode的运行信息。

    ZKFC: 监控各自的NameNode(每一个NameNode一定有一个与之对应的ZKFC)。负责NameNode的状态切换。借助ssh服务来切换NameNode的状态(一定要配置SSH服务的免密钥)。

    1560308449471

    Zookeeper集群在启动的前多少秒会完成一个工作,选一个leader。

    如何选leader:

    每台机器有俩参数,一个是zxid:Zookeeper事务ID,一个是myID。

    • zxid:ZooKeeper事务ID,执行的事务数量,执行的事务数量多最新的就是leader
    • myID:每一个Zookeeper节点都会有一个myid,当zxid相同时,谁的myID大,谁就是leader。

    Zookeeper集群上会有一个目录结构,可供创建一个临时节点。两个NameNode上都有一个zkfc组件,随时与zookeeper集群保持联系(心跳信息),监控这个临时节点,一旦检测不到心跳时,这个临时节点就会消失,此时另外一个NameNode就会申请创建临时节点,谁创建了临时节点,谁就是leader。

    在Zookeeper上创建一个临时目录,用来存放哪个NameNode是主NameNode(ActiveNameNode)。在一开始的时候没有临时节点,两个namenode争抢创建,谁创建成功,谁就是ActiveNameNode。

    zkfc进程和NameNode进程是在一台机器上的。Zkfc监控所在主机的NameNode的健康状态(操作系统和硬件是否有问题),如果有问题会将Zookeeper集群中的临时节点删掉。

    注:当一个ActiveNameNode宕机StandByNameNode切换成Active状态之前,会将之前的ActiveNameNode确保变成StandBy状态。

    记忆点:

    防止分区,过半机制,Zookeeper临时目录,zkfc和NameNode在一台主机上。

    总结:

    1560319698928

    1560319712136

    4.联邦(解决内存受限)

    多个NAmeNode进行扩展,根据目录分别将元数据文件分给多个NameNode。

    • 通过多个namenode/namespace把元数据的存储和管理分散到多个节点中,使到namenode/namespace可以通过增加机器来进行水平扩展。
    • 能把单个namenode的负载分散到多个节点中,在HDFS数据规模较大的时候不会也降低HDFS的性能。
    • 可以通过多个namespace来隔离不同类型的应用,把不同类型应用的HDFS元数据的存储和管理分派到不同的namenode中。

    使用联邦加HA

    1560322661159

    1560322679224

    5.HA 配置-搭建

    1.整体规划

    node1 node2 node3 node4
    NN-1 NN-2
    JNN-1 JNN-2 JNN-3
    DN-1 DN-2 DN-3
    ZK-1 ZK-2 ZK-3
    ZKFC-1 ZKFC-2

    Active NameNode : 一个集群只有一个Active,接受客户端的读写请求,记录edits日志(元数据)。

    StandbyNameNode : 一个集群中可能有多个Standby。合并edits和fsimage文件,从而更新fsimage。等待 ActiveNameNode的死亡。

    JournalNode: 共享edits日志文件。当ANN写入一条日志的同时,往JournalNode集群中也写入一条。当它接受一条日志,同时通知StandbyNamenode获取。

    DataNode: 保存和管理block。并且往两种NameNode同时汇报block的位置信息。

    Zookeeper: 它是负责选举算法。选举一个Namenode的状态为Active。同时记录每个Namenode的运行信息。

    ZKFC: 监控各自的NameNode(每一个NameNode一定有一个与之对应的ZKFC)。负责NameNode的状态切换。借助ssh服务来切换NameNode的状态(一定要配置SSH服务的免密钥)。

    1560324657356

    2.为每个节点设置免密钥和安装hadoop与java环境

    安装java环境

    1. 安装jdk

        rpm –ivh jdk-7u80-linux-x64.rpm  -I install,-v 查看安装进度,-h 计算hash值  
      

      注:如何查看jdk的安装路径

      whereis java :查看java命令的路径
      cd /usr/java 
      ls :->jdk1.7.0_80 
      cd  /jdk1.7.0_80 
      

      pwd 复制jdk的安装路径

    2. vi /etc/profile 配置环境变量

      export JAVA_HOME=jdk的安装路径
      export PATH=$PATH:$JAVA_HOME/bin 
      
    3. 执行source /etc/profile 让配置生效

    4. 使用jps验证是否按照

    如果已有某个主机有了jdk,可以直接远程拷贝到其他机器

    scp -r /usr/java root@node02:/usr/java
    

    设置免密钥

    为了管理脚本去管理其他节点做免密钥

    1. 生成密钥

      ssh–keygen :生成公钥和私钥。
      
    2. 在管理节点把公钥拷给其他节点

      node01为管理节点

      [root@node01 java]ssh-copy-id -i ./id_rsa.pub root@node01
      [root@node01 java]ssh-copy-id -i ./id_rsa.pub root@node02
      [root@node01 java]ssh-copy-id -i ./id_rsa.pub root@node03
      [root@node01 java]ssh-copy-id -i ./id_rsa.pub root@node04
      

    设置每个主机时间同步

    [root@node01 ~]# date -s "2019-06-12 16:45:16"
    [root@node02 ~]# date -s "2019-06-12 16:45:16"
    [root@node03 ~]# date -s "2019-06-12 16:45:16"
    [root@node04 ~]# date -s "2019-06-12 16:45:16"
    

    或者在xshell上直接输入命令

    1560329281219

    安装hadoop

    3.搭建Zookeeper集群

    三台zookeeper:node02,node03,node04

    1. 先关闭当前主机的集群

      stop-dfs.sh
      
    2. 通过 xftp上传zookeeper.tar.gz上传到node2,node3,node4,解压

      [root@node02 ~]# tar -zxvf zookeeper-3.4.6.tar.gz
      
    3. 将压缩包移动到到/opt目录下

      [root@node02 ~]# mv zookeeper-3.4.6 /opt
      
    4. 配置环境变量

      [root@node02 zookeeper-3.4.6]# pwd
      /opt/zookeeper-3.4.6
      [root@node02 zookeeper-3.4.6]# vi /etc/profile
      .....
      export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64
      export HADOOP_HOME=/root/myapps/hadoop-2.6.5
      export ZOOKEEPER_HOME=/opt/zookeeper-3.4.6
      export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
      

      .
      /etc/profile 让配置文件生效

    5. 将/etc/profile文件拷贝到其他两台机器node3和node4

      scp /etc/profile node3:/etc
      scp /etc/profile node4:/etc
      

      且分别在每台机器上执行配置文件,让它生效。

    6. 到$ZOOKEEPER_HOME/conf路径下,复制zoo_sample.cfg为zoo.cfg

      • 因为zookeeper默认使用zoo.cfg这个文件
      [root@node02 ~]# cd $ZOOKEEPER_HOME/conf
      [root@node02 conf]# ls
      configuration.xsl  log4j.properties  zoo_sample.cfg
      [root@node02 conf]# mv zoo_sample.cfg zoo.cfg
      [root@node02 conf]# ll
      总用量 12
      -rw-rw-r--. 1 1000 1000  535 2月  20 2014 configuration.xsl
      -rw-rw-r--. 1 1000 1000 2161 2月  20 2014 log4j.properties
      -rw-rw-r--. 1 1000 1000  922 2月  20 2014 zoo.cfg
      
    7. vi zoo.cfg 配置存放zookeeper集群数据的路径以及zookeeper集群中的机器(在node02,node03,node04中均需要配置)

      修改:

      dataDir=/var/sxt/hadoop/zk 在这个目录下存放zookeeper的数据

      添加:

      server.1=node02:2888:3888 1号服务器是在node2机器上。

      server.2=node03:2888:3888

      server.3=node04:2888:3888

      (2888是通信端口,3888是选举端口)

      Zookeeper机器间进行通信走的是2888端口,投票选择leader时走3888端口

      [root@node02 conf]# vi zoo.cfg
      ...
      dataDir=/var/sxt/hadoop/zk
      ...
      server.1=node02:2888:3888
      server.2=node03:2888:3888
      server.3=node04:2888:3888
      
    8. 在node02,node03,node04中创建/var/sxt/hadoop/zk目录,并在目录下放一个myid,在myid中编辑当前zookeeper的编号(上一步中配置的server编号 要对应)。

      [root@node02 conf]# mkdir -p /var/sxt/hadoop/zk
      [root@node02 conf]# echo 1 > /var/sxt/hadoop/zk/myid
      [root@node02 opt]# cat /var/sxt/hadoop/zk/myid
      1
      [root@node03 ~]# mkdir -p /var/sxt/hadoop/zk
      [root@node03 ~]# echo 2 > /var/sxt/hadoop/zk/myid
      [root@node03 ~]# cat /var/sxt/hadoop/zk/myid
      2
      [root@node04 ~]# mkdir -p /var/sxt/hadoop/zk
      [root@node04 ~]# echo 3 > /var/sxt/hadoop/zk/myid
      [root@node04 ~]# cat /var/sxt/hadoop/zk/myid 
      3
      
      
    9. 启动zookeeper 在每台机器上 查看zk状态

      • 注意:每台机器的防火墙都需要关闭

        1.首先查看防火墙状态:  
        service iptables status  
        
        永久性生效,重启后不会复原  
        开启:  
        chkconfig iptables on  
        关闭:  
        chkconfig iptables off  
        
        2.即时生效,重启后复原  
        开启:  
        service iptables start  
        关闭:  
        service iptables stop  
        
        
      • 查看zookeeper集群启动状态

        zkServer.sh status

        此时要注意起了几台机器的zookeeper服务,因为要遵循过半机制,一半以上机器的zookeeper启动才算启动成功。

        一般zookeeper可以保证 不管出什么问题200ms内都可以解决问题,且占用资源少,非常稳定,可以直接用于生产环境。

      [root@node02 zookeeper-3.4.6]# zkServer.sh  start
      JMX enabled by default
      Using config: /opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
      Starting zookeeper ... STARTED
      [root@node02 zookeeper-3.4.6]# zkServer.sh  status
      JMX enabled by default
      Using config: /opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
      Mode: follower
      
      
      [root@node03 conf]# zkServer.sh  start
      JMX enabled by default
      Using config: /opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
      Starting zookeeper ... STARTED
      [root@node03 conf]# zkServer.sh  status
      JMX enabled by default
      Using config: /opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
      Mode: follower
      
      
      [root@node04 ~]# zkServer.sh  start
      JMX enabled by default
      Using config: /opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
      Starting zookeeper ... STARTED
      [root@node04 ~]# zkServer.sh  status
      JMX enabled by default
      Using config: /opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
      Mode: leader
      

    4.hadoop配置

    配置之前停掉hadoop服务。Jps查看进程。

    1. 配置hdfs-site.xml文件

      • 配置主备NN:

        1560339374816

      • 配置journalNode集群:

        1560339425739

      1560339439006

      1560339450154

      注:

      1) 命名服务,对应core-site.xml文件中的hdfs://mycluster。

      2) 配置是哪些机器为hdfs提供NameNode服务 nn1,nn2指定的是逻辑名称。

      3) 为NameNode逻辑名称指定实际机器。

      4) 指定三台journal服务器的地址为node1、2、3 ,端口为8485。

      5) 客户端查找Active状态的NameNode:向所有的NameNode均发送连接请求

      6)sshfence:保证在StandBy状态的NameNode启动前,杀死Active状态的NameNode进程。保证当前只有一个Active状态的NameNode。

      7)/root/.ssh/id_dsa 指定私钥位置。

      8)指定jounalNode存放editslog文件位置

      9)启用自动故障切换

      <configuration>
      	<property>
      		<name>dfs.replication</name>
      		<value>2</value>
      	</property>
      	<property>
        		<name>dfs.nameservices</name>
        		<value>mycluster</value>
      	</property>
      	<property>
        		<name>dfs.ha.namenodes.mycluster</name>
        		<value>nn1,nn2</value>
      	</property>
      	<property>
        		<name>dfs.namenode.rpc-address.mycluster.nn1</name>
        		<value>node01:8020</value>
      	</property>
      	<property>
        		<name>dfs.namenode.rpc-address.mycluster.nn2</name>
        		<value>node02:8020</value>
      	</property>
      	<property>
        		<name>dfs.namenode.http-address.mycluster.nn1</name>
        		<value>node01:50070</value>
      	</property>
      	<property>
        		<name>dfs.namenode.http-address.mycluster.nn2</name>
        		<value>node02:50070</value>
      	</property>
      	<property>
        		<name>dfs.namenode.shared.edits.dir</name>
        		<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
      	</property>
      
      	<property>
        		<name>dfs.journalnode.edits.dir</name>
        		<value>/var/sxt/hadoop/ha/jn</value>
      	</property>
      
      
      	<property>
        		<name>dfs.client.failover.proxy.provider.mycluster</name>
        		<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
      	</property>
      	<property>
        		<name>dfs.ha.fencing.methods</name>
        		<value>sshfence</value>
      	</property>
      	<property>
        		<name>dfs.ha.fencing.ssh.private-key-files</name>
        		<value>/root/.ssh/id_dsa</value>
      	</property>
      	<property>
         		<name>dfs.ha.automatic-failover.enabled</name>
         		<value>true</value>
       	</property>
      </configuration>
      
      

      具体解读

      <configuration>
      <!-- 定义hdfs集群ID号 -->
      <property>
        <name>dfs.nameservices</name>
        <value>bjsxt</value>
      </property>
      <!-- 定义hdfs集群中namenode的ID号 -->
      <property>
        <name>dfs.ha.namenodes.bjsxt</name>
        <value>nn1,nn2</value>
      </property>
      <!-- 定义namenode的主机名和RPC协议的端口 -->
      <property>
        <name>dfs.namenode.rpc-address.bjsxt.nn1</name>
        <value>node1:8020</value>
      </property>
      <property>
        <name>dfs.namenode.rpc-address.bjsxt.nn2</name>
        <value>node4:8020</value>
      </property>
      <!-- 定义namenode的主机名和HTTP协议的端口 -->
      <property>
        <name>dfs.namenode.http-address.bjsxt.nn1</name>
        <value>node1:9870</value>
      </property>
      <property>
        <name>dfs.namenode.http-address.bjsxt.nn2</name>
        <value>node4:9870</value>
      </property>
      <!-- 定义共享edits的URL -->
      <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://node2:8485;node3:8485;node4:8485/laoxiao</value>
      </property>
      <!-- 定义HDFS的客户端连接HDFS集群时返回active namenode地址 -->
      <property>
        <name>dfs.client.failover.proxy.provider.bjsxt</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
      </property>
      <!-- HDFS集群中两个namenode切换状态时的隔离方法 -->
      <property>
            <name>dfs.ha.fencing.methods</name>
            <value>sshfence</value>
      </property>
      <!-- HDFS集群中两个namenode切换状态时的隔离方法的密钥 -->
      <property>
            <name>dfs.ha.fencing.ssh.private-key-files</name>
            <value>/root/.ssh/id_rsa</value>
      </property>
      
      <!-- journalnode集群中用于保存edits文件的目录 -->
      <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/journalnode/data</value>
      </property>
      
      <!-- HA的HDFS集群自动切换namenode的开关-->
      <property>
         <name>dfs.ha.automatic-failover.enabled</name>
         <value>true</value>
       </property>
      </configuration>
      
    2. 配置core-site.xml文件

      注:

      1)2181是客户端连接端口($ZOOKEEPER_HOME/conf文件查看)

      2)最后一个property配置是为了和Zookeeper保持一个长连接,监控ActiveNameNode,随时准备好选出新的leader。

      3)hdfs://mycluster 类似于Java中的接口的功能。不管哪台namenode为主,只要访问mycluster,就会自动访问到主NameNode。mycluster是虚拟的,哪台机器是主NameNode,mycluster就是谁。

      1560339860640

      <configuration>
      <property>
              <name>fs.defaultFS</name>
              <value>hdfs://mycluster</value>
          </property>
      <property>
              <name>hadoop.tmp.dir</name>
              <value>/var/sxt/hadoop/ha</value>
      </property>
      <!-- HDFS连接zookeeper集群的地址和端口 -->
      <property>
         <name>ha.zookeeper.quorum</name>
         <value>node02:2181,node03:2181,node04:2181</value>
       </property>
      </configuration>
      
      
    3. 在所有节点中node1-4配置Slaves

      • DataNode在哪几个主机就写哪几个主机的名字
      [root@node01 hadoop]# vi slaves 
      
            1 node02
            2 node03
            3 node04
      
    4. 将这两个配置文件在其余节点上做同步 4台机器均要有

      [root@node01 hadoop]# scp hdfs-site.xml core-site.xml node02:`pwd`
      hdfs-site.xml                                                                                                     100% 2237     2.2KB/s   00:00    
      core-site.xml                                                                                                     100% 1090     1.1KB/s   00:00    
      [root@node01 hadoop]# scp hdfs-site.xml core-site.xml node03:`pwd`
      hdfs-site.xml                                                                                                     100% 2237     2.2KB/s   00:00    
      core-site.xml                                                                                                     100% 1090     1.1KB/s   00:00    
      [root@node01 hadoop]# scp hdfs-site.xml core-site.xml node04:`pwd`
      hdfs-site.xml                                                                                                     100% 2237     2.2KB/s   00:00    
      core-site.xml                                                                                                     100% 1090     1.1KB/s   00:00
      

    5.设置node02到node01的免密钥

    • 免密钥只需在node01到node2,node3,node4和 node2到node1上设置

      [root@node02 .ssh]# ssh-copy-id -i ./id_rsa.pub root@node02
      [root@node02 .ssh]# ssh-copy-id -i ./id_rsa.pub root@node01
      

    6.启动HA的Hadoop

    1. 启动三台journalNode(node1,node 2,node3)

      [root@node01 hadoop]# hadoop-daemon.sh start journalnode
      starting journalnode, logging to /root/myapps/hadoop-2.6.5/logs/hadoop-root-journalnode-node01.out
      [root@node01 hadoop]# jps
      1448 Bootstrap
      3017 JournalNode
      3068 Jps
      
      
      [root@node02 .ssh]# hadoop-daemon.sh start journalnode
      starting journalnode, logging to /root/myapps/hadoop-2.6.5/logs/hadoop-root-journalnode-node02.out
      [root@node02 .ssh]# jps
      2657 Jps
      2390 QuorumPeerMain
      2606 JournalNode
      
      
      
      [root@node03 hadoop]# hadoop-daemon.sh start journalnode
      starting journalnode, logging to /root/myapps/hadoop-2.6.5/logs/hadoop-root-journalnode-node03.out
      [root@node03 hadoop]# jps
      2242 QuorumPeerMain
      2376 JournalNode
      2427 Jps
      
      
      
    2. 任意选择一台NameNode节点(node1,node2),格式化HDFS

      [root@node01 hadoop]# hdfs namenode -format
      

      出现以下情况说明格式化成功,否则查找错误

      ...
      19/06/12 20:15:41 INFO common.Storage: Storage directory /var/sxt/hadoop/ha/dfs/name has been successfully formatted.
      ...
      
    3. 格式化后启动当前NameNode进程

      [root@node01 hadoop]# hadoop-daemon.sh start namenode
      starting namenode, logging to /root/myapps/hadoop-2.6.5/logs/hadoop-root-namenode-node01.out
      [root@node01 hadoop]# jps
      3153 NameNode
      1448 Bootstrap
      3017 JournalNode
      3228 Jps
      

    7.【停止HA集群】

    1. 停止HDFS:stop-dfs.sh
    2. 停止zookeeper集群(在三台zookeeper上node2 ode3 ode4都要执行):zkServer.sh stop

    8.测试HA集群是否搭建成功

    1. 浏览器中访问node1:50070,node2:50070,查看他们的状态是否是一个Active,一个StandBy

    2. 杀死主NameNode,查看备用NameNode是否变为Active状态。

    1560386422826

    ​ 在任意一台zookeeper集群中的机器上的zkCli.sh客户端执行

    1560386437063

    ​ 浏览器中访问node2,查看是否变成 Active状态。

    	停掉node2的zkfc进程,查看ActiveNameNode是否切换node1
    

    1560386460257

    1. 上传文件测试

    1560386492859

    9.写一个脚本,让这个集群先启动Zookeeper,再启动HDFS,再查看每个节点上的进程信息

    创建一个脚本,给其赋予可执行的权限

    1560386544793

    编辑脚本vi start-ha.sh:

    1560386561926

    创建停止HA集群的脚本:

    1560386593174

    1560386605030

    运行stop-ha.sh

    1560386625666

    运行start-ha.sh

    1560386654918

    6.Zookeeper操作

    1. 查看临时文件

      查看:在zookeeper集群中任意一台机器上执行zkCli.sh客户端连接, 最后一行执行(ls /)

      1560386264258

    2. 查看临时节点的文件内容:

      1560386290370

    总结:

    1560386306206

    退出zookeeper客户端zkCli.sh:quit

    搭建完成

  • 相关阅读:
    Oracle自带的sql developer导入导出数据
    LSMW批处理工具操作手册
    JS控制TABLE表格在任意一行下面添加一行(有待完善)
    SAP销售模块塑工常见问题和解决方案(自己收藏)
    SAP采购订单历史明细报表源代码(自己收藏)
    SAP公司间采购订单关联交货单报表源代码(自己收藏)
    《嵌入式系统可靠性设计技术及案例解析》读书笔记(七)
    《嵌入式系统可靠性设计技术及案例解析》读书笔记(六)
    《嵌入式系统可靠性设计技术及案例解析》读书笔记(五)
    《嵌入式系统可靠性设计技术及案例解析》读书笔记(四)
  • 原文地址:https://www.cnblogs.com/chenxiaoge/p/13335464.html
Copyright © 2011-2022 走看看