唐宋元明清 唐宋元明清
首页
  • 基础

    • Java基础
  • 工具

    • hutool
    • commons
  • 框架

    • Spring Boot相关
  • 设计模式

    • 设计模式入门
  • Hadoop

    • Hadoop分布式搭建
    • Hadoop高可用搭建
    • 集群端口
    • 代码demo
  • Zookeeper

    • Zookeeper集群搭建
  • Hive

    • Hive集群搭建
    • Hive相关
    • HSQL
  • Kafka

    • Kafka集群搭建
  • HBase

    • HBase集群搭建
    • HBase基础学习
  • Spark

    • Spark环境搭建
    • Spark相关知识
  • Flink

    • Flink环境搭建
    • Flink学习
  • Flume

    • Flume安装配置
    • Flume高可用集群安装
    • Flume相关学习
  • Sqoop

    • Sqoop安装配置
    • Sqoop使用
  • 其他

    • docker
  • Oracle

    • Oracle相关知识杂记
    • 系统函数篇
    • 与MySQL语法区别
  • MySQL

    • MySQL知识点
  • Python

    • Python简单语法
    • Python操作Office
    • Python类库学习
    • Python爬虫
  • Shell

    • Shell基础
    • Shell命令行
  • Scala

    • 语法学习
  • 正则表达式

    • 正则基础
  • 调度

    • 调度工具
  • 前端

    • 前端相关
  • 杂记

    • 常用工具或网站
    • 琐碎知识
  • 摘录

    • 摘录
GitHub (opens new window)
首页
  • 基础

    • Java基础
  • 工具

    • hutool
    • commons
  • 框架

    • Spring Boot相关
  • 设计模式

    • 设计模式入门
  • Hadoop

    • Hadoop分布式搭建
    • Hadoop高可用搭建
    • 集群端口
    • 代码demo
  • Zookeeper

    • Zookeeper集群搭建
  • Hive

    • Hive集群搭建
    • Hive相关
    • HSQL
  • Kafka

    • Kafka集群搭建
  • HBase

    • HBase集群搭建
    • HBase基础学习
  • Spark

    • Spark环境搭建
    • Spark相关知识
  • Flink

    • Flink环境搭建
    • Flink学习
  • Flume

    • Flume安装配置
    • Flume高可用集群安装
    • Flume相关学习
  • Sqoop

    • Sqoop安装配置
    • Sqoop使用
  • 其他

    • docker
  • Oracle

    • Oracle相关知识杂记
    • 系统函数篇
    • 与MySQL语法区别
  • MySQL

    • MySQL知识点
  • Python

    • Python简单语法
    • Python操作Office
    • Python类库学习
    • Python爬虫
  • Shell

    • Shell基础
    • Shell命令行
  • Scala

    • 语法学习
  • 正则表达式

    • 正则基础
  • 调度

    • 调度工具
  • 前端

    • 前端相关
  • 杂记

    • 常用工具或网站
    • 琐碎知识
  • 摘录

    • 摘录
GitHub (opens new window)
  • Hadoop

    • Hadoop分布式搭建
    • Hadoop高可用搭建
      • 前提
      • 1. 简介
      • 2. 配置(在之前搭建分布式集群的基础上)
        • 修改配置文件
      • 3. 启动集群
      • 4. 激活namenode
      • 5. HA手动切换
        • 附:自己出的小问题
        • 附: 一个玄学问题(已解决 是中文符号问题)
        • 附:ssh知识
    • 集群端口
    • 代码demo(mr hbase hive redis)
  • Zookeeper

    • Zookeeper集群搭建
  • Hive

    • Hive集群搭建
    • Hive相关
    • HSQL
  • Kafka

    • Kafka集群搭建
  • HBase

    • HBase集群搭建
    • HBase基础学习
  • Spark

    • Spark环境搭建
    • Spark相关知识
    • Spark内核学习
  • Flink

    • Flink环境搭建
    • Flink学习
  • Flume

    • Flume安装配置
    • Flume高可用集群安装
    • Flume相关学习
    • Flume把数据导入hive(文件方式)
  • 数据集成工具

    • Sqoop安装配置
    • Sqoop使用
    • 其他ETL工具
  • Impala

    • Impala
  • 调度

    • 调度工具
  • 其他

    • docker
  • 大数据
  • Hadoop
Ai
2022-02-27
目录

Hadoop高可用搭建

# 前提

分布式搭建入口:https://www.cnblogs.com/Hephaestus/p/12213719.html 集群规划:

namenode datanode journalnode
hadoop100 是(nn2)
hadoop101 是(nn1) 是 是
hadoop102 是 是
hadoop103 是 是

# 1. 简介

高可用程序的类型
主从方式(冷备): 两个相同的应用程序,一个对外提供服务,成为主程序,另一个平时不运行为备程序,就是一个主程序的备份,一旦主程序出现问题,备份提供恢复操作
双主互备(热备): 两个相同的应用程序,同时对外提供服务(两个程序相互为对方备份的存在,双主热备),当启动一个出现问题时,另一个可以对外提供服务,不会造成服务器宕机

# 2. 配置(在之前搭建分布式集群的基础上)

# 修改配置文件

  • 修改核心配置文件: vim etc/hadoop/core-site.xml 加入
<configuration>

        <!-- 指定HDFS中NameNode的地址 -->
        <property>
                <name>fs.defaultFS</name>
                <!--hdfs://hadoop101:9000-->
                <value>hdfs://mycluster</value>
        </property>

        <!-- 指定Hadoop运行时产生文件的存储目录 -->
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/soft/module/hadoop-2.9.2/data/tmp</value>
        </property>

</configuration>
  • 修改hdfs配置文件: vim etc/hadoop/hdfs-site.xml 加入
<configuration>

        <!--HA高可用配置-->
        <!--集群起名-->
        <property>
                <name>dfs.nameservices</name>
                <value>mycluster</value>
        </property>

        <!--指定mycluster的有哪些namenode,nn1,nn2 自己去的名-->
        <property>
                <name>dfs.ha.namenodes.mycluster</name>
                <value>nn1,nn2</value>
        </property>

        <!--nn1 RPC端口 -->
        <property>
                <name>dfs.namenode.rpc-address.mycluster.nn1</name>
                <value>hadoop101:9000</value>
        </property>

        <!--nn1 HTTP端口 -->
        <property>
                <name>dfs.namenode.http-address.mycluster.nn1</name>
                <value>hadoop101:50070</value>
        </property>

        <!--nn2 RPC端口 -->
        <property>
                <name>dfs.namenode.rpc-address.mycluster.nn2</name>
                <value>hadoop100:9000</value>
        </property>

        <!--nn2 HTTP端口 -->
        <property>
                <name>dfs.namenode.http-address.mycluster.nn2</name>
                <value>hadoop100:50070</value>
        </property>

        <!--HA故障切换 -->
        <!-- 当namnode故障,是否自动启动另一个namenode(默认值为false)-->
        <property>
                <name>dfs.ha.automatic-failover.enabled </name>
                <value>false</value>
        </property>

        <!-- journalnode 配置 -->
        <!-- mycluster的两个namenode共享editsa文件目录时,使用journalnode集群信息-->
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>qjournal://hadoop101:8485;hadoop102:8485;hadoop103:8485/mycluster</value>
        </property>

        <!--当mycluster故障时,哪个实现类负责故障切换-->
        <property>
                <name>dfs.client.failover.proxy.provider.mycluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>

        <!--发生failover时,Standby的节点要执行一系列方法把原来那个Active节点中不健康的NameNode服务给杀掉,
                这个叫做fence过程。sshfence会通过ssh远程调用fuser命令去找到Active节点的NameNode服务并杀死它-->
         <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行 -->
        <property>
                <name>dfs.ha.fencing.methods</name>
                <value>sshfence</value>
         </property>

        <!--SSH私钥 使用sshfence隔离机制时需要ssh免登陆-->
        <property>
                <name>dfs.ha.fencing.ssh.private-key-files</name><!--免密登录密钥位置-->
                <!--<value>/home/hadoop/.ssh/id_rsa</value>-->
                <value>/home/banana/.ssh/id_rsa</value>
        </property>

        <!--SSH超时时间 -->
        <property>
                <name>dfs.ha.fencing.ssh.connect-timeout</name>
                <value>30000</value>
        </property>

        <!--Journal Node文件存储地址 -->
        <property>
                 <name>dfs.journalnode.edits.dir</name>
                <value>/soft/module/hadoop-2.9.2/data/tmp/journal</value>
        </property>

</configuration>
  • 修改从机配置文件: vim etc/hadoop/slaves
hadoop101
hadoop102
hadoop103
  • 分发配置文件 xsync.sh etc/hadoop/

# 3. 启动集群

  • 启动journalnode集群
    将journalnode部署在DataNode节点上 在DataNode节点执行 ./sbin/hadoop-daemon.sh start journalnode
  • 格式化namenode(一定要在journalnode集群启动后再进行格式化) (1) 先删除所有节点上的 tmp dfs/name dfs/data logs 等目录
    (2) 在nn1(namenode1)上执行 ${HADOOP_HOME}/bin/hdfs namenode -format(注意一定是英文符'-') hdfs namenode -format(明明一样的命令问什么有时好使有时不好使????[中英文符号问题])
    (3) 在hadoop101(nn1上)启动namenode hadoop-daemon.sh start namenode
  • namenode2同步namenode1上格式化后的信息(先启动nn1的namenode) 在nn2(namenode2)上执行 hdfs namenode -bootstrapStandby
  • 在namenode1启动集群 sbin/start-dfs.sh

# 4. 激活namenode

  • 执行完前面的步骤后 此时namenode1和namenode2都是standby状态(通过web服务查看),还不能正常提供服务,需要将将其中一个节点切换到active状态。
  • 将namenode1切换为active状态 在namennode1执行 ./bin/hdfs haadmin -failover --forceactive nn2 nn1(这里nn2, nn1表示namenode的服务名,需要与hdfs-sit.xml中的配置保持一致。)然后查看namenode1和namenode2的状态

# 5. HA手动切换

  • 在active状态的namenode执行 kill -9 xxx(进程id)
  • 切换namenode 在namenode2上切换为active ./bin/hdfs haadmin -failover --forceactive nn1 nn2(执行后日志会报错,是因为jar包版本的原因,不影响切换状态。)

# 附:自己出的小问题

(1) 8.8.8.101:8485: Call From hadoop101/8.8.8.101 to hadoop101:8485 failed on connection exception: java.net.ConnectException: 拒绝连接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused 问题:未启动journal集群(./sbin/hadoop-daemon.sh start journalnode)

(2) Unable to fetch namespace information from active NN at hadoop101/8.8.8.101:9000: Call From hadoop100/8.8.8.100 to hadoop101:9000 failed on connection exception: java.net.ConnectException: 拒绝连接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused 问题:未启启动主机器的namenode:(./hadoop-daemon.sh start namenode)

(3) 对于拒绝连接问题:如果你的所有配置都是正确的,那么这个问题只能是host,network,firewall(当然还有你输命令的问题)

# 附: 一个玄学问题(已解决 是中文符号问题)

  • 启动namenode不好使,jps发现没有namenode
  • 查看日志
  • 手动新建文件夹,发现报错no format,所以是hdfs namenode -format不好使 改为${HADOOP_HOME}/bin/hdfs namenode -format格式化就好使了, 之后重新格式化用hdfs namenode -format好使,不知道是什么原因

# 附:ssh知识

ssh默认会把你每个你访问过计算机的公钥(public key)都记录在/root/.ssh/known_hosts。当再次访问该主机时,OpenSSH会校对公钥。如果公钥不同,OpenSSH则发出警告,避免你受到ONS Hijack之类的攻击。

解决办法:

1、手动删除/root/.ssh/known_hosts文件,放心在你再次使用ssh时它会再次自动生成。但这样也会把其他主机的公钥删 掉,下次登录需要重新输入密码,如果你有足够的耐心,也可以打开/root/.ssh/known_hosts文件,找到对应主机那一行手 动修改为正确的RSA key。

2、根据网上其他人说的,修改配置文件“~/.ssh/config”,加上下面两行,重启服务器。

StrictHostKeyChecking no
UserKnownHostsFile /dev/null

但不建议这么做,因为SSH登陆时会忽略known_hsots文件,不安全。

编辑 (opens new window)
上次更新: 2022/11/22, 17:20:22
Hadoop分布式搭建
集群端口

← Hadoop分布式搭建 集群端口→

Theme by Vdoing | Copyright © 2022-2025 Ai | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×