《笔记1》HDFS深入及Hadoop HA

HDFS深入及Hadoop HA

一、复习

  1. 基础课程

    • 大数据本质:就是利用一系列大数据软件工具开发程序对数据进行处理,从数据中提取相关价值信息

      • 大数据软件:Hadoop、Zookeeper、Hive、Spark、Flink
        • 类似于:Excel、Word
      • 数据:种类多,数据量大(传统的方式不行)
      • 处理:开发程序(java还是很重要的)
    • Java

      • 为什么?

        • 大数据的大部分软件都是Java源代码开发的
          • 学习、维护
        • 使用Java语言开发数据处理程序
      • 关键

        • 常用工具类:字符串处理、日期处理

          • 字符串:substring

            数据:http://www.itcast.cn/index.jsp?username=heima
            |
            来源:www.itcast.cn
            
          • 日期:转换

            • 标准日期:yyyy-MM-dd HH:mm:ss
              • 用于标记时间
            • 时间戳:1584738947834
              • 用于计算
            • 数据:18/Aug/2020:12:30:45
              • SimpleDateFormat
        • 多线程、IO流、JVM【内存管理,垃圾回收】、设计模型

    • MySQL

      • 为什么?

        • 掌握一门RDBMS:MySQL 关系型数据库
        • SQL:以后工作中60%开发任务
      • 关键

        • SQL语法

          select 1 from 2 where 3 group by 4 having 5 order by 6 limit 7f
          
          • 每个位置怎么填,代表的含义
          • 每个位置执行顺序
        • 数据库概念:视图、触发器、存储过程、binlog(记录maysql中的所有操作,可以对mysql数据进行回滚)与namenode中的edits相似

    • Linux

      • 为什么?
        • 用于部署大数据平台的,安装大数据············ 软件
      • 关键
        • 命令 :文件管理命令
  2. 入门课程

    • 分布式
      • 本质:将多台机器的资源从逻辑上合并为一个整体,通过分布式程序对外提供统一的服务
      • 功能
        • 解决单机资源不足
        • 通过高并发提高性能
      • 思想:分而治之
      • 流程
        • 分:将一个大任务拆分成若干个小任务
        • 执行:将每个小任务分配给集群中的每个节点来并行执行
        • 合:将所有小任务的结果合并为一个总的结果
      • 架构
        • 普通的主从架构
          • 主节点:管理
          • 从节点:执行
        • 特殊架构:公平架构
          • 每个节点的功能几乎一致
          • ZK、Kafka、ES
      • 问题
        • 多台机器构成分布式,多台机器之间如何实现数据的一致性
  • 主节点存在单点故障,分布式框架可以启动多个主节点,多个主节点只能有一个工作的,如何决定?

  • Zookeeper

    • 功能

      • 存储关键性数据,保证分布式的数据一致性
      • 用于辅助选举
        • 临时节点:如果客户端的连接断开,临时节点会自动被删除
        • 两个NameNode:A和B
          • A和B到ZK中创建同一个临时节点
          • 谁创建成功,谁就是Active,例如A创建成功
          • B创建失败了,B就是Standby状态,B会监听A创建的临时节点
      • 如果A故障,断开连接,临时节点自动删除,B会重新创建这个临时节点,B成为Active
    • 主从

      • Leader
      • Follower
    • 公平节点

      • 每台ZK中存储的数据是一致的

        • 如何保证zk自己的数据一致性
        • 只有Leader能接受些的请求,Leader会将写入广播给所有节点
      • 如果Leader故障,Follower是可以被选举成为leader

      • 每台ZK都可以接受客户端请求

    • Hadoop

      • HDFS:分布式文件系统

        • 功能:实现大数据文件的存储管理
        • 应用场景
          • 离线:以数据产生时间为单位来实现数据处理:每天处理一次,T+1,今天处理昨天的数据
            • 一般的时效性至少是分钟以上级别
            • 实时:以数据为单位来实现数据处理,每产生一条数据就处理一条数据,时效性在ms级别
          • 一次写入和多次读取
          • 不适合于实时、频繁修改或者删除场景
        • NameNode
          • 端口
            • rpc:8020
            • http:50070
          • 管理集群:从节点
            • 心跳机制、汇报块机制
          • 接客
          • 维护元数据:内存
        • DataNode
          • 负责管理自己所在机器的文件系统,接受主节点的任务分配,实现数据的存储读写
        • 机制
          • 分块机制:规则:128M
            • 用于实现HDFS分布式
          • 副本机制:默认3份
            • 用于保证数据的安全
        • 类似:分布式存储
          • Kafka:实时大数据临时存储
          • Hbase:实时随机大数据永久存储
      • ES:构建大数据的全文索引

  • Redis:完全基于内存的分布式存储

  • 分布式计算

    • 条件

      • 程序必须是分布式程序

        • 需求:1+……+9
        • 拆分
          • Task1:1+2+3
          • Task2:4+5+6
        • Task3:7+8+9
        • Task4:Task1 + Task2 +Task3
      • 必须要有一个分布式的运行环境:提供分布式的资源,让程序分布式运行

        • node1:8Core:8GB
          • task1
        • node2:8Core:8GB
          • task2
        • node3:8Core:8GB
        • task3
        • task4
    • MapReduce:分布式编程模型

      • 这是一套分布式编程API,通过这个API写出的代码,就是一个分布式的程序

      • YARN:分布式运行环境,用于提供分布式的资源,资源容器

        • 将MapReduce开发的分布式程序放在YARN中运行,实现分布式计算
        • ResourceManager
          • rpc:8032
          • http:8088

分布式管理有两个主要的矛盾:

1怎么保证数据的安全

2分布式管理怎么实现管理的

二、课程目标

  1. HDFS Java API

    • 创建HDFS连接
    • 删除和创建
  2. HDFS额外功能

    • 回收站
    • 跨集群拷贝
  3. Hadoop HA

    • 两个NN和两个RM

    • Zookeeper

三、HDFS Java API

1、应用场景

  • 客户端
    • hdfs:命令
      • 作为HDFS客户端
      • 一般用于实现文件的上传或者管理
    • Java API:用于读写
      • 读:用于读取HDFS文件通过分布式计算框架进行分布式处理
      • 写:用于将处理好的结果进行保存
  • 掌握
    • 如何构建一个HDFS连接
    • 如何删除和创建HDFS文件或者目录
    • 因为分布式计算框架读写HDFS将API已经封装了,只要填写参数就可以了

2、创建模块

image-20201029111105531

3、引入依赖

  • 参考附录一
  • 将log4j.properties配置文件放入resource目录中,用于观察日志

4、配置Windows运行环境

  • 因为Windows上没有安装Hadoop,在Windows的IDEA中运行Hadoop的代码,会报错

  • step1:将提供的Hadoop目录放入一个没有中文的路径下

    例如:D:\hadoop\hadoop2.7.5
    

    image-20201029122915304

  • step2:配置Hadoop的环境变量

    • 添加一个环境变量

      HADOOP_HOME=D:\hadoop\hadoop2.7.5
      
    • 将Hadoop的bin目录添加到path中

      path=之前的path后面加上;D:\hadoop\hadoop2.7.5\bin
      

    image-20201029122948008

    image-20201029123014892

  • step3:重启IDEA,如果不行,就重启笔记本

  • step4:如果step3执行完以后,运行程序代码依旧报错,请执行这一步

    • 将hadoop的bin目录下hadoop.dll这个文件放入Windows的System32目录
    • 重启笔记本,重新运行代码
  • step5:如果step4执行完成以后,还不可以,直接联系老师

5、获取连接及集群信息

    //用于获取一个HDFS连接对象
    public FileSystem getHDFS() throws Exception {
        //构建一个Configuration对象
        /**
         * 每个Hadoop程序都需要一个COnfiguration对象,用于管理当前程序的所有属性配置
         * step1:先加载所有*-default.xml,所有默认配置
         * step2:加载所有*-site.xml,加载用于自定义配置,覆盖默认配置
         * 配置HDFS的地址
         *  方式一:将core-site.xml放入resource目录中
         *  方式二:手动设置某个属性的值
         */
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.88.221:8020");
        //构建一个HDFS连接对象
        FileSystem hdfs = FileSystem.get(conf);
//        FileSystem hdfs = FileSystem.get(new URI("hdfs://192.168.88.221:8020"), conf);
//        FileSystem hdfs = FileSystem.get(new URI("hdfs://192.168.88.221:8020"), conf, "root");
//        System.out.println(hdfs);
        return hdfs;
    }

    @Test
    public void printClusterInfo() throws Exception {
        //获取连接对象,集群管理需要强转为分布式文件系统对象
        DistributedFileSystem hdfs = (DistributedFileSystem) getHDFS();
        //获取所有DN的信息
        DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats();
        //迭代
        for (DatanodeInfo dataNodeStat : dataNodeStats) {
            //打印每个DN的信息
            System.out.println(dataNodeStat.getDatanodeReport());
        }
    }

6、创建目录

    @Test
    public void mkdirHDFS() throws Exception {
        FileSystem hdfs = getHDFS();
        //构建我们要创建的路径
        Path path = new Path("/windows");
        //判断目录是否存在
        if(hdfs.exists(path)){
            //存在就删除:第二个参数表示是否递归
            hdfs.delete(path,true);
        }
        //创建目录
        hdfs.mkdirs(path);
        hdfs.close();
    }

7、列举

    @Test
    public void listHDFS() throws Exception {
        FileSystem hdfs = getHDFS();
        //列举方式一
        Path path = new Path("/");
        //列举目录下的所有文件或者目录
        FileStatus[] fileStatuses = hdfs.listStatus(path);
        //迭代
//        for (FileStatus fileStatus : fileStatuses) {
//            //判断是否是一个目录
//            if(hdfs.isDirectory(fileStatus.getPath())){
//                System.out.println(fileStatus.getPath().getName()+"\t"+"this is a dir");
//            }else{
//                System.out.println(fileStatus.getPath().getName()+"\t"+"this is a file");
//            }
//        }
        //方式二:只列举文件
        RemoteIterator<LocatedFileStatus> listFiles = hdfs.listFiles(path, false);
        //迭代
        while (listFiles.hasNext()) {
            //取出当前条
            LocatedFileStatus next = listFiles.next();
            //输出当前条
            System.out.println(next.getPath());
        }
    }

8、上传

@Test
    public void uploadHDFS() throws Exception {
        FileSystem hdfs = getHDFS();
        //构建源文件
        Path inputPath = new Path("file:///E:\\output\\test.txt");
        //构建目标路径
        Path outputPath = new Path("/windows");
        //调用上传方法
        hdfs.copyFromLocalFile(inputPath,outputPath);
    }

9、下载

@Test
    public void downLoadHDFS() throws Exception {
        FileSystem hdfs = getHDFS();
        //构建源文件
        Path inputPath = new Path("/windows/test.txt");
        //构建目标路径
        Path outputPath = new Path("file:///E:\\output\\test");
        //调用下载方法
        hdfs.copyToLocalFile(inputPath,outputPath);
    }

10、合并存储

@Test
    public void mergeFile() throws Exception {
        //先构建本地文件系统对象
        LocalFileSystem local = FileSystem.getLocal(new Configuration());
        //获取HDFS对象
        FileSystem hdfs = getHDFS();
        //构建输出流
        FSDataOutputStream outputStream = hdfs.create(new Path("/windows/merge.txt"));
        //构建输入流
        FileStatus[] fileStatuses = local.listStatus(new Path("E:\\output"));
        for (FileStatus fileStatus : fileStatuses) {
            //打开文件构建输入流
            FSDataInputStream input = local.open(fileStatus.getPath());
            //赋值给输出流
            IOUtils.copyBytes(input,outputStream,4096);
            //关闭输入流
            input.close();
        }
        //关闭输出流
        outputStream.close();
        local.close();
        hdfs.close();
    }

四、HDFS 其他功能

1、Distcp

  • cp:用于实现单个文件系统内的拷贝

  • scp:用于实现两个同类的Linux系统间的拷贝

  • distcp:用于两个HDFS系统之间的数据拷贝

    hadoop distcp  source   target
    hadoop distcp  hdfs://cluster1:8020/test     hdfs://cluster2:8020/test
    

2、Archive

  • HDFS不适合存储小文件,原因是小文件会占用大量的元数据,导致元数据检索性能较差

  • 解决

    • 方案一:将多个小文件合并为一个大文件,存储在HDFS上
      • 物理上
      • 前提:对这些小文件的处理的逻辑是一致的
    • 方案二:将多个小文件存储时,在逻辑上合并,构建一条元数据
      • file1
      • file2
      • file3
      • ||
      • file => file1,file2,file3
  • 功能:将多个小文件从逻辑上合并,减少元数据存储

  • .har

  • 创建归档文件

    • 先启动yarn
    hdfs dfs -mkdir -p /hartest/test1
    hadoop  archive  -archiveName wc.har -p /wordcount /hartest/test1
    
  • 查看归档文件

    hdfs dfs -ls -R /hartest/test1/wc.har
    hdfs dfs -ls -R har:///hartest/test1/wc.har
    hdfs dfs -cat /hartest/test1/wc.har/part-0
    

3、Snapshot

  • 允许构建快照

    hdfs dfsadmin -allowSnapshot /jdk
    
  • 创建快照

    hdfs dfs -createSnapshot /jdk
    
  • 查看快照

    /jdk/.snapshot/
    
  • 对比、恢复快照

    hdfs dfs -mv /testfile.txt /jdk/
    hdfs snapshotDiff /jdk . .snapshot/s20201029-154836.113
    hdfs dfs -cp /jdk/.snapshot/s20201015-161451.498/*  /jdk/
    
  • 删除快照

    hdfs dfs -deleteSnapshot /jdk s20201015-161451.498
    
  • 禁止构建快照

    hdfs dfsadmin -disallowSnapshot /jdk
    

4、HDFS Trash

  • 配置回收站的属性

    <property>
       <name>fs.trash.interval</name>
       <value>10080</value>
    </property>
    
    • 表示隔多长时间清理一次回收站,单位为分钟

    • 跳过回收站

      hdfs dfs -rm -r -skipTrash /jdk
      
    • 恢复数据:直接从回收站的目录中移动回来即可

五、Hadoop的HA

1、主从架构问题

  • 主:NameNode,ResourceManager
    • 负责管理集群集群:接受所有DN的心跳和汇报机制
    • 接客
    • 负责维护元数据
  • 从:DataNode,NodeManager
    • 负责执行主节点分配的任务
  • 问题
    • 如果从节点故障,集群不受影响
    • 如果主从节点故障,集群出现单点故障问题,整个集群将不可用
      • 解决:启动多个主节点
        • 两个NameNode
        • 两个ResourceManager
    • 问题:如何实现两个NameNode的协同工作
      • 状态
        • Active:工作
        • Standby:备份
      • 实现
        • 通过Zookeeper
  • 解决
    • Hadoop中提供了HA机制
      • 允许提供两个主节点,来实现高可用,通过zookeeper来实现Active和Standby的选举和切换
      • 一个NameNode是工作状态的
      • 一个NameNode是备份状态的
    • Hadoop中提供了Federation联盟机制
      • 允许启动两个NameNode,都是工作状态
      • 即使在工作中使用:需要搭配HA一起使用
      • 本质:构建两套HDFS集群

2、Hadoop中HA实现

  • 以NameNode为例:两个NameNode
  • 问题1:两个NameNode,谁是Active,谁是Standby
    • 利用ZK实现辅助选举
    • ZKFC:每一个NameNode就会有一个ZKFC进程
      • 负责构建NameNode与ZK之间的联系
      • 每个ZKFC负责监听NameNode,并且与ZK构建连接
        • 创建临时节点
        • 监听临时节点
        • 状态的切换
  • 问题2:两个NameNode,DataNode会向哪个NameNode发送心跳和汇报块?
    • 所有的DataNode会向所有的NameNode进行注册,发送心跳和汇报块
    • 只有Active的NameNode会发送指令
  • 问题3:两个NameNode,其中一个是Active的,客户端只能将请求给Active的NameNode,客户端如何知道谁是Active的?
    • 客户端会通过配置文件或者所有NameNode的地址,挨个请求
    • 工作中:有的公司会自己开发一个类,实现让客户端从zookeeper中获取Active的地址,然后进行请求
  • 问题4:如何保证两个NameNode的内存元数据是一致的,只有这样,Active宕机或者故障,Standby才能完整的接替原来的Active?
    • 实现思路:共享Active的NameNode的edits文件
      • Active的NameNode将edits进行记录
      • Standby的NameNode读取edits对自己元数据进行修改
      • 实现:实现分布式数据共享
        • 能不能用ZK解决?
        • 不能,zk不能存储大量数据
    • 最终实现:Hadoop中模仿ZK实现了一种Journalnode机制
      • 类似于Zookeeper的公平节点
      • 分布式架构:每台机器的journalnode是一样的

image-20201029172235198

附录一:Hadoop Maven依赖

<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.7.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.7.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>2.7.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-core</artifactId>
        <version>2.7.5</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
    </dependency>
</dependencies>

附录二:HadoopHA实现

1、拍摄三台虚拟机的快照

  • 关闭所有进程

    sbin/stop-dfs.sh
    sbin/stop-yarn.sh
    
  • 关机

    • 不关机拍摄的快照比较大,占磁盘空间
  • 拍摄三台机器的快照【用于恢复当前状态,后续学习过程中不用HA】

  • 启动三台机器

  • 节点规划

    进程/机器node1node2node3
    NameNode*【Active】*【Standby】
    ZKFC**
    JN***
    DataNode***
    ResourcecManager*【StandBy】*【Active】
    NodeManager***

2、修改配置文件

  • 删除三台机器原来的临时目录,重新创建,三台机器都要执行

    cd /export/server/hadoop-2.7.5/
    rm -rf hadoopDatas/
    #创建hadoop的临时存储目录:存储数据块、fsimage等
    mkdir datas
    #用于journal进程存储edits文件的目录
    mkdir journalnode
    
  • 修改第一台机器的配置

  • core-site.xml

    <property>
    	<name>fs.defaultFS</name>
    	<value>hdfs://mycluster</value>
    </property>
    <property>
    	<name>hadoop.tmp.dir</name>
    	<value>/export/server/hadoop-2.7.5/datas</value>
    </property>
    <property>
    	<name>fs.trash.interval</name>
    	<value>10080</value>
    </property>
    <property>
       <name>ha.zookeeper.quorum</name>
       <value>node1:2181,node2:2181,node3:2181</value>
    </property>
    
    • fs.defaultFS:指定HDFS入口地址
      • mycluster:这是HDFS逻辑名称
      • 必须与hdfs-site.xml中dfs.nameservice的属性保持一致
    • ha.zookeeper.quorum:指定访问的zookeeper的地址
  • hdfs-site.xml

    <property>
    	<name>dfs.permissions.enabled</name>
    	<value>false</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>node1:8020</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn2</name>
      <value>node2:8020</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn1</name>
      <value>node1:50070</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn2</name>
      <value>node2:50070</value>
    </property>
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>
    </property>
    <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/export/server/hadoop-2.7.5/journalnode</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_rsa</value>
    </property>
    <property>
    	<name>dfs.ha.automatic-failover.enabled</name>
    	<value>true</value>
    </property>
    
    • dfs.nameservices:用于定义HDFS逻辑名称,将多个NameNode封装为一个整体的名称
    • dfs.ha.namenodes.mycluster:定义这个集群中有几个namenode,每个namenode的逻辑名称
    • dfs.namenode.rpc-address.mycluster.nn1/nn2:定义两个NameNode的具体地址
    • dfs.namenode.shared.edits.dir:指定journalnode服务的地址
    • dfs.journalnode.edits.dir:journalnode将edits文件存储的位置
    • dfs.client.failover.proxy.provider.mycluster:指定客户端请求服务端的方式
    • dfs.ha.fencing.methods:隔离机制
    • dfs.ha.automatic-failover.enabled:开启自动切换
  • yarn-site.xml

    <property>
    	<name>yarn.resourcemanager.ha.enabled</name>
    	<value>true</value>
    </property>
    <property>
      	<name>yarn.resourcemanager.cluster-id</name>
      	<value>cluster1</value>
    </property>
    <property>
      	<name>yarn.resourcemanager.ha.rm-ids</name>
      	<value>rm1,rm2</value>
    </property>
    <property>
      	<name>yarn.resourcemanager.ha.id</name>
    	<value>rm1</value>
    </property>
    <property>
      	<name>yarn.resourcemanager.hostname.rm1</name>
      	<value>node3</value>
    </property>
    <property>
      	<name>yarn.resourcemanager.hostname.rm2</name>
      	<value>node2</value>
    </property>
    <property>
      	<name>yarn.resourcemanager.webapp.address.rm1</name>
      	<value>node3:8088</value>
    </property>
    <property>
      	<name>yarn.resourcemanager.webapp.address.rm2</name>
      	<value>node2:8088</value>
    </property>
    <property>
      	<name>yarn.resourcemanager.zk-address</name>
      	<value>node1:2181,node2:2181,node3:2181</value>
    </property>
    <property>
      	<name>yarn.resourcemanager.recovery.enabled</name>
      	<value>true</value>
    </property>
    <property>
      	<name>yarn.resourcemanager.store.class</name>
      	<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    

3、分发并修改

  • 分发给第二台和第三台机器

    cd /export/server/hadoop-2.7.5/etc/hadoop/
    scp core-site.xml hdfs-site.xml yarn-site.xml node2:$PWD
    scp core-site.xml hdfs-site.xml yarn-site.xml node3:$PWD
    
  • 修改第一台机器的yarn-site.xml

    • 编辑yarn-site.xml

      cd /export/server/hadoop-2.7.5/etc/hadoop/
      vim yarn-site.xml
      
    • 删除以下内容

      <!--在node3上配置rm1,在node2上配置rm2-->
      <!--注意:这个在YARN的另一个机器上一定要修改,非RM的其他机器上不配置此项-->
      <property>
      	<name>yarn.resourcemanager.ha.id</name>
      	<value>rm1</value>
      </property>
      
  • 修改第二台机器的yarn-site.xml

    • 编辑yarn-site.xml

      cd /export/server/hadoop-2.7.5/etc/hadoop/
      vim yarn-site.xml
      
    • 更改以下内容:将rm1修改为rm2

      <!--在node3上配置rm1,在node2上配置rm2-->
      <!--注意:这个在YARN的另一个机器上一定要修改,非RM的其他机器上不配置此项-->
      <property>
      	<name>yarn.resourcemanager.ha.id</name>
      	<value>rm2</value>
      </property>
      
  • 三台机器安装 psmisc

    yum install psmisc -y
    

4、启动

  • 启动zookeeper

    /export/server/zookeeper-3.4.6/bin/start-zk-all.sh
    
    #!/bin/bash
    ZK_HOME=/export/server/zookeeper-3.4.6
    
    for number in {1..3}
    do
            host=node${number}
            echo ${host}
            /usr/bin/ssh ${host} "cd ${ZK_HOME};source /etc/profile;${ZK_HOME}/bin/zkServer.sh start"
            echo "${host} started"
    done
    
  • 第一次启动需要进行格式化:以后不需要执行

    • 启动三台机器的journalnode,三台机器都要执行

      cd /export/server/hadoop-2.7.5/
      sbin/hadoop-daemon.sh start journalnode
      
    • 第一台机器的NameNode进行格式化

      bin/hdfs namenode -format
      
    • 第一台机器同步元数据到第二台机器

      scp -r datas node2:$PWD 
      
    • 第一台机器关联zookeeper,进行初始化

      bin/hdfs zkfc -formatZK
      
    • 三台机器关闭journalnode

      sbin/hadoop-daemon.sh stop journalnode
      
  • 第一台机器启动HDFS

    start-dfs.sh
    #会自动启动所有HDFS的进程
    
  • 第三台机器启动YARN

    start-yarn.sh
    #只启动当前机器的RM和所有的NM
    
  • 第二台机器启动ResourceManager

    yarn-daemon.sh start resourcemanager
    

5、测试

  • 查看网页状态

    image-20201029173342399

    image-20201029173400235

  • 关闭当前Active状态的NameNode,检查Standby的NameNode是否能自动切换,以及读写是否正常

    • 查看状态

      hdfs haadmin -getServiceState nn1
      hdfs haadmin -getServiceState nn2
      hdfs haadmin -failover nn2 nn1
      语法:hdfs haadmin -failover active standby
      
    • 测试写入

      hdfs dfs -put /export/data/wordcount.txt /
      
    • 关闭active状态的NameNode

      hadoop-daemon.sh stop namenode
      
    • 再次查看状态

      hdfs haadmin -getServiceState nn1
      hdfs haadmin -getServiceState nn2
      
    • 测试读取

      hdfs dfs -cat /wordcount.txt
      
  • 关闭当前Active状态的RM,检查Standby的RM是否能自动切换

image-20201029174032583

image-20201029174234522

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章鱼哥TuNan&Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值