目录
- 1. 认识Hadoop和Hbase
- 2. 安装搭建hadoop
- 3. 配置启动hadoop
- 4. 安装配置Hbase
- 5. 启动Hbase集群
- 6. 后续及其总结
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框架中可用的这四个组件。
自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体系架构
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 | 说明 |
---|---|---|
hadoop01 | 192.168.154.130 | DataNode、NodeManager、ResourceManager、NameNode |
hadoop02 | 192.168.154.131 | DataNode、NodeManager、SecondaryNameNode |
hadoop03 | 192.168.154.132 | DataNode、NodeManager |
2.2 安装前准备
2.2.1 机器配置说明
发行版:
cat /etc/redhat-release
内核版本:
uname -r
注:本集群内所有进程均由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。以下是具体的步骤:
- 打开
/etc/selinux/config
文件:
sudo nano /etc/selinux/config
- 找到
SELINUX
这一行,将其值改为disabled
:
SELINUX=disabled
- 保存并关闭文件。
- 重启你的系统以使更改生效:
sudo reboot
sestatus
关闭防火墙
在 CentOS 系统中,你可以使用 firewall-cmd
命令来管理防火墙。以下是关闭防火墙的步骤:
临时关闭防火墙:
你可以使用以下命令来临时关闭防火墙,这个命令会立即生效,但在系统重启后,防火墙会再次被启用:
sudo systemctl stop firewalld
永久关闭防火墙:
如果你想要永久关闭防火墙,你需要使用 systemctl
命令来禁用 firewalld
服务。以下是具体的步骤:
- 使用以下命令停止
firewalld
服务:
sudo systemctl stop firewalld
- 使用以下命令禁用
firewalld
服务:
sudo systemctl disable firewalld
这样,即使在系统重启后,防火墙也不会再次启动。
查看防火墙是否关闭
sudo systemctl status firewalld
查看重启后还会不会自动启动
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
2.2.4 修改hosts文件,域名解析
sudo vim /etc/hosts
添加以下行:
192.168.154.130 hadoop01
192.168.154.131 hadoop02
192.168.154.132 hadoop03
(每个人不同)
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)
设置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
查看版本:
java -version
下载解压安装
自行下载或者上传一个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)
那么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
这里的截图也包含了后面的hbase进程
(2)启动YARN
三台都需要:
start-yarn.sh
查看进程:
jps
同上,一次截完了
3.9 集群启动成功
(1)网页访问:http://hadoop01:8088
该页面为ResourceManager 管理界面,在上面可以看到集群中的三台Active Nodes:
(2)网页访问:http://hadoop01:50070/dfshealth.html#tab-datanode
该页面为NameNode管理页面:
到此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
同上Hadoop
5.4 页面查看hbase状态
6. 后续及其总结
安装之后可以进行后面的操作,如建表,修改HBase表,等等。
进行各种环境变量配置时一定要细心,每进行到一个阶段都推荐使用快照保存一下。
虽然配环境真的头大,但是也复习了很多Linux基础命令。