4. hdfs高可用集群搭建

简介

前面把hadoop机器已经准备好了,zk集群搭建好了,本本就是开始搭建hdfs环境

hadoop环境准备

创建hadoop用户

三台机器都创建hadoop用户

useradd hadoop -d /home/hadoop
echo "1q1w1e1r"  | passwd --stdin hadoop

hadoop用户相互免密登录

进入hadoop用户 su - hadoop

生成一个ssh密钥,执行如下命令一直回车就行

ssh-keygen -t rsa -C 'shura@qq.com'

执行免密脚本,自己也需要跟自己互连

ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop01
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop02
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop03

校验,可以ssh就没问题了

[hadoop@hadoop01 ~]$ ssh hadoop02
Last login: Thu Nov 16 10:10:29 2023
[hadoop@hadoop02 ~]$

上传hadoop包

hadoop选择3.2.4版本

hadoop3.2.4

scp hadoop-3.2.4.tar.gz hadoop@hadoop01:/home/hadoop
scp hadoop-3.2.4.tar.gz hadoop@hadoop02:/home/hadoop
scp hadoop-3.2.4.tar.gz hadoop@hadoop03:/home/hadoop

解压

tar -zxvf hadoop-3.2.4.tar.gz

配置环境变量

vi ~/.bash_profile

export HADOOP_HOME=/home/hadoop/hadoop-3.2.4
PATH=$PATH:$HADOOP_HOME/bin
export PATH

source ~/.bash_profile 使环境变量生效

查看hadoop版本

[hadoop@hadoop01 ~]$ hadoop version
Hadoop 3.2.4
Source code repository Unknown -r 7e5d9983b388e372fe640f21f048f2f2ae6e9eba
Compiled by ubuntu on 2022-07-12T11:58Z
Compiled with protoc 2.5.0
From source with checksum ee031c16fe785bbb35252c749418712
This command was run using /home/hadoop/hadoop-3.2.4/share/hadoop/common/hadoop-common-3.2.4.jar

如上所示表示环境变量配置成功,其它两台机器一样操作

集群规划

我们要搭建的是hdfs的HA集群,需要规划NameNode与DataNode的部署,由于我们只有三台机器,DataNode肯定三台都需要部署,NameNode就一主一备,zkfc与NameNode对应,journalnode每台机器都部署

集群如下

hadoop01hadoop02hadoop03
NameNodeNameNode
DataNodeDataNodeDataNode
journalnodejournalnodejournalnode
zkfczkfc

同步脚本

由于后面需要修改配置文件,并且每台主机配置都是需要一样的,那么可以写一个同步脚本

同步脚本如下,通过修改hadoop01的配置,执行脚本同步到hadoop02与hadoop03

syncFile.sh

#!/bin/bash

#1. 判断参数个数
if [ $# -lt 1 ]
then
    echo Not Enough Arguement!
    exit;
fi

#2. 遍历集群所有机器
for host in hadoop02 hadoop03
do
    echo ====================  $host  ====================
    #3. 遍历所有目录,挨个发送

    for file in $@
    do
        #4. 判断文件是否存在
        if [ -e $file ]
            then
                #5. 获取父目录
                pdir=$(cd -P $(dirname $file); pwd)

                #6. 获取当前文件的名称
                fname=$(basename $file)
                ssh $host "mkdir -p $pdir"
                rsync -av $pdir/$fname $host:$pdir
            else
                echo $file does not exists!
        fi
    done
done

执行效果如下

[hadoop@hadoop01 hadoop-3.2.4]$ /home/hadoop/hadoop-3.2.4/syncFile.sh /home/hadoop/hadoop-3.2.4/etc/
==================== hadoop02 ====================
sending incremental file list

sent 983 bytes  received 19 bytes  668.00 bytes/sec
total size is 109,238  speedup is 109.02
==================== hadoop03 ====================
sending incremental file list

sent 983 bytes  received 19 bytes  2,004.00 bytes/sec
total size is 109,238  speedup is 109.02

配置文件修改

core-site.xml定义了hadoop的全局配置信息

core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <!--hadoop集群的默认文件系统,hdfs高可用集群中写nameservice名称,不能出现下划线-->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://shura/</value>
    </property>

    <!-- 指定hadoop工作目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/hadoop-3.2.4/tmp</value>
    </property>

    <!-- 指定zookeeper集群访问地址 -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
    </property>

    <!-- 配置为了解决以后其他组件连接HDFS集群  -->
    <property>
        <name>hadoop.proxyuser.bigdata.hosts</name>
        <value>*</value>
    </property>

    <property>
        <name>hadoop.proxyuser.bigdata.groups</name>
        <value>*</value>
    </property>

    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>hadoop</value>
    </property>

</configuration>

hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <!-- 指定HDFS的nameservices为 crm, 需要跟core-site.xml中保持一致 -->
    <property>
        <name>dfs.nameservices</name>
        <value>shura</value>
    </property>

    <!-- NameNode持久化存储命名空间和事务日志的本地文件系统上的路径。 -->
      
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/home/hadoop/hadoop-3.2.4/dfs/namenode</value>
    </property>
      <!-- DataNode 存放块位置写,逗号隔开 -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/home/hadoop/hadoop-3.2.4/dfs/datanode/1,/home/hadoop/hadoop-3.2.4/dfs/datanode/2</value>
    </property>
    <property>
        <!--指定hdfs保存数据的副本数量-->
        <name>dfs.replication</name>
        <value>2</value>
    </property>


    <!-- 设置crm集群有两个namenode, 分别为nn1,nn2 -->
    <property>
        <name>dfs.ha.namenodes.shura</name>
        <value>nn1,nn2</value>
    </property>

    <!-- 配置nn1 的RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.shura.nn1</name>
        <value>hadoop01:9000</value>
    </property>

    <!-- 配置nn1的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.shura.nn1</name>
        <value>hadoop01:50070</value>
    </property>

    <!-- 配置nn2 的RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.shura.nn2</name>
        <value>hadoop03:9000</value>
    </property>

    <!-- 配置nn2的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.shura.nn2</name>
        <value>hadoop03:50070</value>
    </property>

    <!-- 指定JournalNode 在本地磁盘存放数据的位置 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/home/hadoop/hadoop-3.2.4/journaldata</value>
    </property>

    <!-- 指定NameNode的edits元数据在journalNode上的服务器 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/shura</value>
    </property>

    <!-- 开启NameNode 自动切换 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>

    <!-- 配置nameNode失败自动切换的实现方式 shura一定保持与core-site一样-->
    <property>
        <name>dfs.client.failover.proxy.provider.shura</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    <!-- 配置隔离机制方法 -->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>
            sshfence
            shell(/bin/true)
        </value>
    </property>

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

    <!-- 配置sshfence隔离机制超时时间 -->
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>

    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>
</configuration>


workers

hadoop01
hadoop02
hadoop03

以上配置文件在hadoop01上修改,通过syncFile.sh脚本同步

[hadoop@hadoop01 hadoop]$ /home/hadoop/hadoop-3.2.4/syncFile.sh /home/hadoop/hadoop-3.2.4/etc/
==================== hadoop02 ====================
sending incremental file list
etc/hadoop/
etc/hadoop/core-site.xml
etc/hadoop/hdfs-site.xml
etc/hadoop/workers

sent 5,601 bytes  received 113 bytes  11,428.00 bytes/sec
total size is 112,138  speedup is 19.63
==================== hadoop03 ====================
sending incremental file list
etc/hadoop/
etc/hadoop/core-site.xml
etc/hadoop/hdfs-site.xml
etc/hadoop/workers

sent 5,601 bytes  received 113 bytes  11,428.00 bytes/sec
total size is 112,138  speedup is 19.63

启动journalnode

journalnode的定义见上一篇文章,hdfs概述与高可用原理

hdfs --daemon start journalnode
WARNING: /home/hadoop/hadoop-3.2.4/logs does not exist. Creating.

## 查看java进程
[hadoop@hadoop01 ~]$ jps
30272 JournalNode
31554 Jps

格式化HDFS

在hadoop01执行下面命令

hdfs namenode -format

该命令会在hdfs上创建一个新的文件系统,并且初始化其目录结构与元数据信息,它会清空NameNode节点的数据目录,包括fsimage和edits文件并且创建新的,是一个比较危险的动作,一般环境搭建的时候使用

fsimage 文件系统的元数据信息

edits 元数据的变化历史记录

执行完后目录效果

[hadoop@hadoop01 hadoop-3.2.4]$ ls -lrt dfs/ journaldata/
journaldata/:
total 4
drwxrwxr-x 4 hadoop hadoop 4096 Nov 16 16:01 shura

dfs/:
total 8
drwxrwxr-x 3 hadoop hadoop 4096 Nov 16 16:00 namenode
drwxrwxr-x 4 hadoop hadoop 4096 Nov 16 16:02 datanode

standby同步元数据

我们有两个NameNode,一个是active,一个是standby,standby是用于同步,在搭建环境的时候,可以手动进行一次同步

需要启动active ,在hadoop01启动

hdfs --daemon start namenode

[hadoop@hadoop01 ~]$ jps
30272 JournalNode
32617 NameNode
32686 Jps

在hadoop03,执行同步命令

hdfs namenode -bootstrapStandby

格式化zkfc

hdfs zkfc -formatZK

启动hdfs集群

只需要一台机器执行start-dfs.sh就可以了

/home/hadoop/hadoop-3.2.4/sbin/start-dfs.sh

## hadoop01
[hadoop@hadoop01 sbin]$ jps
30272 JournalNode
1153 DataNode
1683 Jps
32617 NameNode
1545 DFSZKFailoverController

## hadoop02
[hadoop@hadoop02 ~]$ jps
22608 DataNode
20283 JournalNode
1581 Jps

## hadoop03
[hadoop@hadoop03 ~]$ jps
19265 JournalNode
1227 Jps
21725 DataNode
21598 NameNode
21934 DFSZKFailoverController

查看状态

[hadoop@hadoop01 ~]$ hdfs haadmin  -getAllServiceState
hadoop01:9000                                      active
hadoop03:9000                                      standby

访问

访问NameNode,我们配置的http地址是50070

hadoop01

hadoop03

如上结果所示,与我们规划部署一致

总结

hdfs的部署就到这了,下节我们开始简单使用hdfs


欢迎关注,学习不迷路!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/154080.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Spring】Spring中的DI(依赖注入)Dependence Import

由之前的IoC可以知道&#xff0c;我们写在具体对象后面的new方法肯定不能要了&#xff0c;这时候就要通过依赖注入的形式将Dao配置到Service中 Dependence Import的步骤如下&#xff1a; 1. 在Service类中给Dao提供setter方法 原本我们是直接给bookDao new了一个对象 public …

论文3写作技巧

目录 ⼩论⽂怎么写1 定位⽬标期刊2 写⼩论⽂的核⼼&#xff1a;模仿 ⼩论⽂怎么写 1 定位⽬标期刊 2 写⼩论⽂的核⼼&#xff1a;模仿

JS-项目实战-新增水果库存功能实现

1、fruit.js function $(name) {if (name) {//假设name是 #fruit_tblif (name.startsWith("#")) {name name.substring(1); //fruit_tblreturn document.getElementById(name);} else {return document.getElementsByName(name); //返回的是NodeList类型}} }//当…

HDRP图形入门:RTHandle未知问题

正好电脑看奥本海默&#xff0c;全程尿点十足&#xff0c;就一边看一边把之前整合HDRP遇到的问题说一下。 那就是RTHandle的未知问题&#xff0c;这是官方对RTHandle的说明&#xff1a; unity RTHandle 源代码如下&#xff1a; using System.Collections.Ge…

04-快速掌握Redis,了解Redis中常见的结构类型及其应用场景

Redis快速入门 Remote Dctionary Server Redis是用C语言开发的一个开源的、基于内存的(高性能)键值对(key-value)结构化NoSql数据库,每秒内查询次数可以达到100000的QPS 键值型: Redis中存储的数据都是以key、value对的形式存储&#xff0c;而value的形式多种多样(如字符串、…

2023年第九届数维杯国际大学生数学建模挑战赛A题

2023年第九届数维杯国际大学生数学建模挑战赛正在火热进行&#xff0c;小云学长又在第一时间给大家带来最全最完整的思路代码解析&#xff01;&#xff01;&#xff01; A题思路解析如下&#xff1a; 完整版解题过程及代码&#xff0c;稍后继续给大家分享~ 更多题目完整解析点…

SpringCloud微服务:Nacos的集群、负载均衡、环境隔离

目录 集群 在user-service的yml文件配置集群 启动服务 负载均衡 order-service配置集群 设置负载均衡 当本地集群的服务挂掉时 访问权重 环境隔离 1、Nacos服务分级存储模型 一级是服务&#xff0c;例如userservice 二级是集群&#xff0c;例如杭州或上海 …

【AI视野·今日Sound 声学论文速览 第三十三期】Wed, 25 Oct 2023

AI视野今日CS.Sound 声学论文速览 Wed, 25 Oct 2023 Totally 8 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers CDSD: Chinese Dysarthria Speech Database Authors Mengyi Sun, Ming Gao, Xinchen Kang, Shiru Wang, Jun Du, Dengfeng Yao, Su Jing W…

jQuery【事件处理器、鼠标事件、表单事件、键盘事件、浏览器事件、事件对象、jQuery遍历】(三)-全面详解(学习总结---从入门到深化)

目录 事件之绑定事件处理器 事件之鼠标事件 事件之表单事件 事件之键盘事件 事件之浏览器事件 事件对象 jQuery遍历 事件之绑定事件处理器 1、 .on() 在选定的元素上绑定一个或多个事件处理函数 $("#button").on("click", function(event){console…

Android---网络编程优化

网络请求操作是一个 App 的重要组成部分&#xff0c;程序大多数问题都是和网络请求有关。使用 OkHttp 框架后&#xff0c;可以通过 EventListener 来查看一次网络请求的详细情况。一次完整的网络请求会包含以下几个步骤。 也就是说&#xff0c;一次网络请求的操作是从 DNS 解析…

第四代智能井盖传感器:万宾科技智能井盖位移监测方式一览

现在城市化水平不断提高&#xff0c;每个城市的井盖遍布在城市的街道上&#xff0c;是否能够实现常态化和系统化的管理&#xff0c;反映了一个城市治理现代化水平。而且近些年来住建部曾多次要求全国各个城市加强相关的井盖管理工作&#xff0c;作为基础设施重要的一个组成部分…

Python windows安装Python3环境

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

Vue3 自定义hook函数

这个hook函数并不是Vue3 自带的&#xff0c;而是为了方便我们书写和复用代码。 当我们在setup函数中写了很多内容过后&#xff0c;就会变得很乱&#xff0c;所以我们将实现相同功能的数据、方法和生命周期等等打包单独放在一个文件中&#xff0c;就会整洁很多。 例如&#xf…

Linux友人帐之网络编程基础邮件服务器与DHCP服务器

一、邮件服务器概述 1.1邮件服务基础 邮件服务器是一种计算机程序&#xff0c;它通过电子邮件协议接收、存储、处理和发送电子邮件。邮件服务器可以与电子邮件客户端程序&#xff08;如Outlook、Thunderbird等&#xff09;或Web邮件界面&#xff08;如Gmail、Outlook.com等&am…

操作系统OS/存储管理/内存管理/内存管理的主要功能_基本原理_要求

基本概念 内存管理的主要功能/基本原理/要求 **内存管理的主要功能&#xff1a; ** 内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理&#xff0c;使程序员摆脱存储分配的麻烦&#xff0c;提高编程效率。地址转换。在多道程序环境下&#xff0c;程序中的逻辑地…

数字档案室建设评价

数字档案室建设评价应考虑以下几个方面&#xff1a; 1. 安全性&#xff1a;数字档案室的主要目的是确保档案资料的安全性。评价应考虑数字档案室的物理安全性、防火措施、保密措施、网络安全等方面。 2. 可访问性&#xff1a;数字档案室应该易于访问和使用。评价应考虑数字档案…

OCC教学:预备基础

预备基础&#xff1a;1.概览 什么是Open CASCADE Technology&#xff1f; Open CASCADE Technology (OCCT) 是一个功能强大的开源 C 库&#xff0c;由数千个类组 成&#xff0c;并提供以下领域的解决方案&#xff1a; 表面和实体建模&#xff1a;对任何对象进行建模。3D 和 …

制造业数据标准化的优势分析

之前我们介绍过>>数据驱动工作效率提升的5个层次——以PreMaint设备数字化平台为例&#xff0c;这次我们将深入分析数据标准化在制造业中的优势。 从持续的供应链中断和疯狂的通货膨胀&#xff0c;到日益昂贵和难以采购的原材料&#xff0c;制造企业正面对越来越多的挑战…

APM/PX4/betaflight/inav开源飞控之IMU方向

APM/PX4/betaflight/inav开源飞控之IMU方向 1. 源由2. 坐标系2.1 APM/PX4&#xff1a;机体坐标 右手系规则2.2 betaflight/inav&#xff1a;xEast-yNorth-zUp yaw反向 右手系规则 3. 转向定义3.1 APM/PX43.2 betaflight/inav 4. 实例4.1 I C M 42688 P ICM42688P ICM42688P…

把jar包打到本地仓库然后上传到私服

1.首先把需要打成maven的包放到本地 2.然后本地配置maven的环境变量 没有配置的话可以看看下面这个&#xff0c;教程很详细 Windows系统配置maven环境_windows配置maven环境变量-CSDN博客 3.WinR cmd 输入如下的指令&#xff1a; mvn install:install-file -Dfile.\device…