LOADING

加载过慢请开启缓存 浏览器默认开启

搭建一主两从Hadoop集群并部署HBase

目录

1. 认识Hadoop和Hbase

1.1 hadoop简单介绍

Hadoop是一个使用java编写的Apache开放源代码框架,它允许使用简单的编程模型跨大型计算机的大型数据集进行分布式处理。Hadoop框架工作的应用程序可以在跨计算机群集提供分布式存储和计算的环境中工作。Hadoop旨在从单一服务器扩展到数千台机器,每台机器都提供本地计算和存储。

1.2 Hadoop架构

Hadoop框架包括以下四个模块:

  • Hadoop Common:这些是其他Hadoop模块所需的Java库和实用程序。这些库提供文件系统和操作系统级抽象,并包含启动Hadoop所需的必要Java文件和脚本。
  • Hadoop YARN:这是作业调度和集群资源管理框架
  • Hadoop分布式文件系统(HDFS):提供对应用程序数据的高吞吐量访问的分布式文件系统。
  • Hadoop MapReduce: 这是基于YARN的大型数据集并行处理系统。

我们可以使用下图来描述Hadoop框架中可用的这四个组件。

img

自2012年以来,术语“Hadoop”通常不仅指向上述基本模块,而且还指向可以安装在Hadoop之上或之外的其他软件包,例如Apache Pig,Apache Hive,Apache HBase,Apache火花等。

1.3 Hadoop如何工作?

(1)阶段1

  用户/应用程序可以通过指定以下项目向Hadoop(hadoop作业客户端)提交所需的进程:

  • 分布式文件系统中输入和输出文件的位置。
  • java类以jar文件的形式包含了map和reduce功能的实现。
  • 通过设置作业特定的不同参数来进行作业配置。

(2)阶段2

  然后,Hadoop作业客户端将作业(jar /可执行文件等)和配置提交给JobTracker,JobTracker负责将软件/配置分发到从站,调度任务和监视它们,向作业客户端提供状态和诊断信息。

(3)阶段3

  不同节点上的TaskTrackers根据MapReduce实现执行任务,并将reduce函数的输出存储到文件系统的输出文件中。

1.4 Hadoop的优点

  • Hadoop框架允许用户快速编写和测试分布式系统。它是高效的,它自动分配数据并在机器上工作,反过来利用CPU核心的底层并行性。
  • Hadoop不依赖硬件提供容错和高可用性(FTHA),而是Hadoop库本身被设计为检测和处理应用层的故障。
  • 服务器可以动态添加或从集群中删除,Hadoop继续运行而不会中断。
  • Hadoop的另一大优点是,除了是开放源码,它是所有平台兼容的,因为它是基于Java的。

1.5 HBase介绍

Hbase全称为Hadoop Database,即hbase是hadoop的数据库,是一个分布式的存储系统。Hbase利用Hadoop的HDFS作为其文件存储系统利用Hadoop的MapReduce来处理Hbase中的海量数据利用zookeeper作为其协调工具

1.6 HBase体系架构

img

Client

  • 包含访问HBase的接口并维护cache来加快对HBase的访问

Zookeeper

  • 保证任何时候,集群中只有一个master
  • 存贮所有Region的寻址入口。
  • 实时监控Region server的上线和下线信息。并实时通知Master
  • 存储HBase的schema和table元数据

Master

  • 为Region server分配region
  • 负责Region server的负载均衡
  • 发现失效的Region server并重新分配其上的region
  • 管理用户对table的增删改操作

RegionServer

  • Region server维护region,处理对这些region的IO请求
  • Region server负责切分在运行过程中变得过大的region

 

HLog(WAL log)

  • HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是 HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和 region名字外,同时还包括sequence number和timestamp,timestamp是” 写入时间”,sequence number的起始值为0,或者是最近一次存入文件系 统中sequence number。
  • HLog SequeceFile的Value是HBase的KeyValue对象,即对应HFile中的 KeyValue

Region

  • HBase自动把表水平划分成多个区域(region),每个region会保存一个表 里面某段连续的数据;每个表一开始只有一个region,随着数据不断插 入表,region不断增大,当增大到一个阀值的时候,region就会等分会 两个新的region(裂变);
  • 当table中的行不断增多,就会有越来越多的region。这样一张完整的表 被保存在多个Regionserver上。

Memstore 与 storefile

  • 一个region由多个store组成,一个store对应一个CF(列族)
  • store包括位于内存中的memstore和位于磁盘的storefile写操作先写入 memstore,当memstore中的数据达到某个阈值,hregionserver会启动 flashcache进程写入storefile,每次写入形成单独的一个storefile
  • 当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、 major compaction),在合并过程中会进行版本合并和删除工作 (majar),形成更大的storefile。
  • 当一个region所有storefile的大小和超过一定阈值后,会把当前的region 分割为两个,并由hmaster分配到相应的regionserver服务器,实现负载均衡。
  • 客户端检索数据,先在memstore找,找不到再找storefile
  • HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元就表 示不同的HRegion可以分布在不同的HRegion server上。
  • HRegion由一个或者多个Store组成,每个store保存一个columns family。
  • 每个Strore又由一个memStore和0至多个StoreFile组成。

2. 安装搭建hadoop

2.1 配置说明

本次集群搭建共三台机器,具体说明下:

主机名IP说明
hadoop01192.168.154.130DataNode、NodeManager、ResourceManager、NameNode
hadoop02192.168.154.131DataNode、NodeManager、SecondaryNameNode
hadoop03192.168.154.132DataNode、NodeManager

2.2 安装前准备

2.2.1 机器配置说明

发行版:

cat /etc/redhat-release

image-20240126182118106

内核版本:

uname -r

image-20240126182259980

注:本集群内所有进程均由hdfs用户启动;要在集群所有服务器都进行操作。

2.2.2 关闭selinux、防火墙

SELinux(Security-Enhanced Linux)是一个 Linux 内核模块,它为 Linux 系统提供了强制访问控制(MAC)机制。SELinux 最初由美国国家安全局(NSA)开发,并且现在是许多 Linux 发行版(如 Fedora、RHEL、CentOS 等)的一部分。

在默认的 Linux 安全模型中,用户和程序主要通过文件权限(即,读取、写入和执行权限)来控制对资源的访问。然而,这种模型可能会被恶意程序利用,例如,如果一个程序被设计为以 root 用户身份运行,那么它就可以访问系统上的任何文件。

SELinux 通过实施更详细和精细的访问控制策略来解决这个问题。例如,即使一个程序以 root 用户身份运行,SELinux 也可以限制它只能访问特定的文件和资源。这种安全模型可以防止或至少减轻某些类型的系统攻击,如缓冲区溢出攻击。

然而,SELinux 的配置和管理可能会比较复杂,因为它需要详细的安全策略。因此,一些用户可能会选择关闭 SELinux,尽管这可能会降低系统的安全性。

在 Linux 系统中,你可以通过以下步骤来临时或永久关闭 SELinux:

临时关闭 SELinux:

你可以使用 setenforce 命令来临时关闭 SELinux。这个命令会立即生效,但在系统重启后,SELinux 会再次被启用。在终端中输入以下命令:

sudo setenforce 0

这里,0 表示关闭 SELinux,1 表示开启 SELinux。

永久关闭 SELinux:

如果你想要永久关闭 SELinux,你需要编辑 /etc/selinux/config 文件。在这个文件中,你会找到 SELINUX 这一行,你可以将其值设置为 disabled 来关闭 SELinux。以下是具体的步骤:

  1. 打开 /etc/selinux/config 文件:
sudo nano /etc/selinux/config
  1. 找到 SELINUX 这一行,将其值改为 disabled
SELINUX=disabled

image-20240126183004320

  1. 保存并关闭文件。
  2. 重启你的系统以使更改生效:
sudo reboot
sestatus

image-20240126182832390

关闭防火墙

在 CentOS 系统中,你可以使用 firewall-cmd 命令来管理防火墙。以下是关闭防火墙的步骤:

临时关闭防火墙:

你可以使用以下命令来临时关闭防火墙,这个命令会立即生效,但在系统重启后,防火墙会再次被启用:

sudo systemctl stop firewalld

永久关闭防火墙:

如果你想要永久关闭防火墙,你需要使用 systemctl 命令来禁用 firewalld 服务。以下是具体的步骤:

  1. 使用以下命令停止 firewalld 服务:
sudo systemctl stop firewalld
  1. 使用以下命令禁用 firewalld 服务:
sudo systemctl disable firewalld

这样,即使在系统重启后,防火墙也不会再次启动。

查看防火墙是否关闭

sudo systemctl status firewalld

image-20240126183648528

查看重启后还会不会自动启动

sudo systemctl is-enabled firewalld

如果这个命令返回 “disabled”,那么防火墙在系统重启后不会自动启动。如果它返回 “enabled”,那么防火墙在系统重启后会自动启动。

2.2.3 准备用户

因为Hadoop启动时默认以非root启动,以root启动会有各种报错,难以解决,所以我们需要创建一个普通用户

创建用户

sudo useradd hdfs

设置密码

sudo passwd hdfs

加入sudoers

以便可以使用sudo命令

sudo visudo

找到类似于以下的行:

root    ALL=(ALL:ALL) ALL

在这一行下面,添加一个新的行,将 “hdfs” 替换为你想要添加的用户名:

hdfs    ALL=(ALL:ALL) ALL

image-20240126185145185

2.2.4 修改hosts文件,域名解析

sudo vim /etc/hosts

添加以下行:

192.168.154.130 hadoop01
192.168.154.131 hadoop02
192.168.154.132 hadoop03

(每个人不同)

image-20240126185445948

2.2.5 同步时间

sudo yum -y install ntpdate
sudo ntpdate cn.pool.ntp.org

2.2.6 ssh互信配置

注:要在集群所有服务器都进行操作

(1)生成密钥对,一直回车即可

ssh-keygen

默认RSA,创建ed25519也行,但是RSA这里复制公钥方便一丢丢。

(2)保证每台服务器各自都有对方的公钥(包括自己)

ssh-copy-id hdfs@hadoop01
ssh-copy-id hdfs@hadoop02
ssh-copy-id hdfs@hadoop03

(3)验证无秘钥认证登录

ssh hdfs@hadoop01
ssh hdfs@hadoop02
ssh hdfs@hadoop03

2.3 配置jdk

从CentOS的yum源安装或者自己下载解压安装都可以

yum安装

sudo yum update
sudo yum install java-1.8.0-openjdk-devel

查看安装目录:

readlink -f $(which java)

image-20240126200311094

设置JAVA_HOME:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.392.b08-2.el7_9.x86_64

验证JAVA_HOME:

echo $JAVA_HOME

image-20240126200428768

查看版本:

java -version

image-20240126191803042

下载解压安装

自行下载或者上传一个jdk包,解压:

tar -xvf jdk-8u201-linux-x64.tar.gz -C /usr/local

授权:

chown hdfs.hdfs -R /usr/local/jdk1.8.0_201/

软连接:

ln -s /usr/local/jdk1.8.0_201/ /usr/local/jdk

配置环境变量:

sudo vim /etc/profile.d/jdk.sh

添加以下行:

export JAVA_HOME=/usr/local/jdk
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

使生效:

source /etc/profile.d/jdk.sh

验证:

java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)

2.4 安装Hadoop

CentOS自带的yum不含Hadoop的资源,所以我们要手动下载:

下载:

wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6-src.tar.gz

解压到~下:

tar -xvf hadoop-3.3.6.tar.gz -C ~/

授权:

chown hdfs.hdfs -R ~/hadoop-3.3.6

这只是一台的配置,等会配置完直接通过scp复制到其他节点

3. 配置启动hadoop

3.1 hadoop-env.sh 配置hadoop环境变量

cd ~/hadoop-3.3.6/etc/hadoop/
vim hadoop-env.sh

添加如下行:

export JAVA_HOME=/usr/local/jdk
export HADOOP_HOME=~/hadoop-3.3.6
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop

如果之前通过yum安装的jdk,你应该查找jdk安装目录:

readlink -f $(which java)

image-20240126195443067

那么JAVA_HOME就为/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.392.b08-2.el7_9.x86_64(安装目录)

3.2 core-site.xml 配置HDFS

vim core-site.xml
<configuration>
    <!-- 指定HDFS默认(namenode)的通信地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop01:9000</value>
    </property>
    <!-- 指定hadoop运行时产生文件的存储路径 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/data/hadoop/tmp</value>
    </property>
</configuration>

3.3 hdfs-site.xml 配置namenode

vim hdfs-site.xml
<configuration>
    <!-- 设置namenode的http通讯地址 -->
    <property>
        <name>dfs.namenode.http-address</name>
        <value>hadoop01:50070</value>
    </property>
 
    <!-- 设置secondarynamenode的http通讯地址 -->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop02:50090</value>
    </property>
 
    <!-- 设置namenode存放的路径 -->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/data/hadoop/name</value>
    </property>
 
    <!-- 设置hdfs副本数量 -->
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <!-- 设置datanode存放的路径 -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/data/hadoop/datanode</value>
    </property>
 
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
</configuration>
sudo mkdir /data/hadoop/name -p
sudo mkdir /data/hadoop/datanode -p

3.4 mapred-site.xml 配置框架

vim mapred-site.xml
<configuration>
    <!-- 通知框架MR使用YARN -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.application.classpath</name>
        <value>
        /usr/local/hadoop/etc/hadoop,
        /usr/local/hadoop/share/hadoop/common/*,
        /usr/local/hadoop/share/hadoop/common/lib/*,
        /usr/local/hadoop/share/hadoop/hdfs/*,
        /usr/local/hadoop/share/hadoop/hdfs/lib/*,
        /usr/local/hadoop/share/hadoop/mapreduce/*,
        /usr/local/hadoop/share/hadoop/mapreduce/lib/*,
        /usr/local/hadoop/share/hadoop/yarn/*,
        /usr/local/hadoop/share/hadoop/yarn/lib/*
        </value>
    </property>
</configuration>

3.5 yarn-site.xml 配置resourcemanager

vim yarn-site.xml
<configuration>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop01</value>
    </property>
 
    <property>
        <description>The http address of the RM web application.</description>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>${yarn.resourcemanager.hostname}:8088</value>
    </property>
 
    <property>
        <description>The address of the applications manager interface in the RM.</description>
        <name>yarn.resourcemanager.address</name>
        <value>${yarn.resourcemanager.hostname}:8032</value>
    </property>
 
    <property>
        <description>The address of the scheduler interface.</description>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>${yarn.resourcemanager.hostname}:8030</value>
    </property>
 
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>${yarn.resourcemanager.hostname}:8031</value>
    </property>
 
    <property>
        <description>The address of the RM admin interface.</description>
        <name>yarn.resourcemanager.admin.address</name>
        <value>${yarn.resourcemanager.hostname}:8033</value>
    </property>
</configuration>

3.6 配置masters & slaves

echo 'hadoop01' >> ~/hadoop-3.3.6/etc/hadoop/masters
echo 'hadoop02 hadoop03' >> ~/hadoop-3.3.6/etc/hadoop/slaves

3.7 启动前准备

3.7.1 准备启动脚本

启动脚本文件全部位于 ~/hadoop-3.3.6/sbin/ 文件夹下:

(1)修改 start-dfs.sh 和 stop-dfs.sh 文件添加:

HDFS_DATANODE_USER=hdfs
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=hdfs
HDFS_SECONDARYNAMENODE_USER=hdfs

(2)修改start-yarn.sh 和 stop-yarn.sh文件添加:

YARN_RESOURCEMANAGER_USER=hdfs
HADOOP_SECURE_DN_USER=hdfs
YARN_NODEMANAGER_USER=hdfs

3.7.2 授权

sudo chown -R hdfs.hdfs ~/hadoop-3.3.6/
sudo chown -R hdfs.hdfs /data/hadoop/

3.7.3 配置hadoop命令环境变量

sudo vim /etc/profile.d/hadoop.sh

添加如下:

export HADOOP_HOME=~/hadoop-3.3.6
PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

3.7.4 集群初始化

我们在hadoop01上修改了hadoop-3.3.6下的很多文件,现在要同步到hadoop02和hadoop03

使用scp命令:

scp -r ~/hadoop-3.3.6 hadoop02:~/
scp -r ~/hadoop-3.3.6 hadoop03:~/

3.8 启动Hadoop集群

3.8.1 第一次启动前需要格式化,集群所有服务器都需要

hdfs namenode -format

3.8.2 启动并验证集群

(1)启动namenode、datanode

三台都需要:

start-dfs.sh

查看进程:

jps

image-20240126204444006

image-20240126204542442

image-20240126204657107

这里的截图也包含了后面的hbase进程

(2)启动YARN

三台都需要:

start-yarn.sh

查看进程:

jps

同上,一次截完了

3.9 集群启动成功

(1)网页访问:http://hadoop01:8088

该页面为ResourceManager 管理界面,在上面可以看到集群中的三台Active Nodes:

image-20240126205252646

(2)网页访问:http://hadoop01:50070/dfshealth.html#tab-datanode

该页面为NameNode管理页面:

image-20240126205344804

到此hadoop集群已经搭建完毕!!!

4. 安装配置Hbase

4.1 安装HBase

下载:

wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.5.7/hbase-2.5.7-bin.tar.gz

解压:

tar -xvf hbase-2.5.7-bin.tar.gz -C ~/hbase-2.5.7

授权:

sudo chown -R hdfs.hdfs ~/hbase-2.5.7/

4.2 配置HBase

4.2.1 hbase-env.sh 配置hbase环境变量

cd ~/hbase-2.5.7/conf/
vim vim hbase-env.sh
export JAVA_HOME=/usr/local/jdk
export HBASE_CLASSPATH=~/hbase-2.5.7/conf

4.2.2 hbase-site.xml 配置hbase

vim hbase-site.xml
<configuration>
<property>
    <name>hbase.rootdir</name>
    <!-- hbase存放数据目录 -->
    <value>hdfs://hadoop01:9000/hbase/hbase_db</value>
    <!-- 端口要和Hadoop的fs.defaultFS端口一致-->
</property>
<property>
    <name>hbase.cluster.distributed</name>
    <!-- 是否分布式部署 -->
    <value>true</value>
</property>
<property>
    <name>hbase.zookeeper.quorum</name>
    <!-- zookooper 服务启动的节点,只能为奇数个 -->
    <value>hadoop01,hadoop02,hadoop03</value>
</property>
<property>
    <!--zookooper配置、日志等的存储位置,必须为以存在 -->
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/data/hbase/zookeeper</value>
</property>
<property>
    <!--hbase master -->
    <name>hbase.master</name>
    <value>hadoop01</value>
</property>
<property>
    <!--hbase web 端口 -->
    <name>hbase.master.info.port</name>
    <value>16666</value>
</property>
</configuration>

注:zookeeper有这样一个特性:

  • 集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的。
  • 也就是说如果有2个zookeeper,那么只要有1个死了zookeeper就不能用了,因为1没有过半,所以2个zookeeper的死亡容忍度为0;
  • 同理,要是有3个zookeeper,一个死了,还剩下2个正常的,过半了,所以3个zookeeper的容忍度为1;
  • 再多列举几个:2->0 ; 3->1 ; 4->1 ; 5->2 ; 6->2 会发现一个规律,2n和2n-1的容忍度是一样的,都是n-1,所以为了更加高效,何必增加那一个不必要的zookeeper

4.2.3 指定集群节点

vim regionservers

添加如下:

hadoop01
hadoop02
hadoop03

5. 启动Hbase集群

5.1 配置hbase命令环境变量

sudo vim /etc/profile.d/hbase.sh

添加如下:

export HBASE_HOME=~/hbase-2.5.7
PATH=$HBASE_HOME/bin:$PATH

5.2 启动前准备

sudo mkdir -p /data/hbase/zookeeper
vim /data/hbase/rsync.sh

添加以下内容:

for i in hadoop02 hadoop03
    do
         sudo rsync -a /data/hbase $i:/data/
         sudo scp -p /etc/profile.d/hbase.sh $i:/etc/profile.d/
done
 
#复制hbase配置到其他机器
for i in hadoop02 hadoop03
    do
         sudo rsync -a  ~/hbase-2.5.6 $i:~/hbase-2.5.6
done

授权:

sudo chown -R hdfs.hdfs /data/hbase

启动复制脚本:

./data/hbase/rsync.sh

5.3 启动hbase

注:只需在hadoop01服务器上操作即可。

(1)启动

start-hbase.sh

(2)验证

jps

image-20240126211709277

同上Hadoop

5.4 页面查看hbase状态

网页访问http://hadoop01:16666

image-20240126210922766

6. 后续及其总结

安装之后可以进行后面的操作,如建表,修改HBase表,等等。

进行各种环境变量配置时一定要细心,每进行到一个阶段都推荐使用快照保存一下。

虽然配环境真的头大,但是也复习了很多Linux基础命令。

载入天数...载入时分秒...