1. 集群搭建的整体设计与选型思路
1.1 为什么要在单台物理机上模拟多节点集群
很多刚接触大数据生态的朋友会有一个误区,觉得搭建集群必须得有三台以上的物理服务器才能动手。实际上在学习和验证阶段,用一台配置还过得去的电脑,通过虚拟机软件跑多个虚拟节点,是性价比最高、也最可控的方案。我自己最开始接触分布式系统的时候,就是在一台16GB内存的笔记本上,用虚拟机开了三个节点,把整套链路跑通的。
这样做的好处非常直接:第一,成本几乎为零,不需要额外购置硬件;第二,快照功能让你可以随时回滚到某个干净的状态,搞崩了也不怕;第三,网络拓扑完全由你自己掌控,排查问题的时候不会受到外部环境的干扰。当然,缺点也很明显——资源是共享的,三个节点同时跑起来对内存和磁盘IO的压力不小,所以合理的资源分配和参数调优就成了关键。
这个项目标题里提到的组合——Zookeeper、Hadoop、HBase——是大数据领域非常经典的一套基础栈。Zookeeper负责分布式协调,Hadoop的HDFS提供底层存储,YARN负责资源调度,HBase则构建在HDFS之上,提供面向列的NoSQL数据库能力。三者之间的关系可以这样理解:HBase要依赖Zookeeper做集群状态管理和RegionServer的协调,同时依赖HDFS做数据持久化存储。所以搭建顺序必须是先Zookeeper,再Hadoop,最后HBase,这个顺序不能乱。
1.2 虚拟机与操作系统版本的选择考量
标题里明确提到了VMware和Ubuntu 18.04,这两个选择其实都有讲究。VMware Workstation在桌面虚拟化领域算是老牌选手了,网络模式配置灵活,快照管理成熟,对新手来说上手门槛低。Ubuntu 18.04虽然现在已经不是最新版本,但它在很长一段时间内都是企业级部署的主流选择,软件源稳定,社区文档丰富,遇到问题容易搜到解决方案。
这里我要特别提醒一点:Ubuntu 18.04默认的OpenJDK版本是11,而Hadoop 2.x和HBase 1.x系列对JDK 8的兼容性最好。如果你不手动切换JDK版本,后面启动HBase的时候大概率会遇到各种奇怪的报错。所以在一开始就把JDK 8装好并设置为默认,能省掉后面很多麻烦。
关于虚拟机的资源配置,我建议每台节点至少分配2GB内存、20GB磁盘、2核CPU。如果你物理机有32GB内存,三个节点各分4GB会更从容一些。磁盘方面,建议把三个节点的虚拟磁盘放在不同的物理分区上,避免IO争抢导致性能急剧下降。网络模式选择NAT或者仅主机模式都可以,关键是三个节点之间要能互相通信,并且能访问外网(安装软件包的时候需要)。
1.3 集群角色分配的通用方案
三个节点的角色分配,我一般采用这样的方案:一台作为Master节点,同时承担NameNode、ResourceManager、HMaster和Zookeeper的角色;另外两台作为Slave节点,承担DataNode、NodeManager、RegionServer和Zookeeper的角色。Zookeeper在三台机器上各部署一个实例,形成一个最小的仲裁集群。
这种分配方式的好处是资源利用最大化,Master节点虽然承担了多个管理角色,但在学习测试场景下负载并不高。Slave节点主要负责数据存储和计算,配置可以稍微高一些。当然,如果你有更多的物理资源,把Zookeeper单独拆出来部署会更接近生产环境的架构。
注意:Zookeeper集群的节点数必须是奇数,这是由Zab协议的多数派选举机制决定的。三个节点允许挂掉一个,五个节点允许挂掉两个,所以三节点是最小的高可用配置。
2. 基础环境准备与系统配置
2.1 虚拟机创建与Ubuntu系统安装
打开VMware Workstation,选择“创建新的虚拟机”,推荐使用自定义配置模式,这样你可以精确控制每一个参数。操作系统选择Linux,版本选择Ubuntu 64位。虚拟机名称建议用有意义的名字,比如“bigdata-node1”,方便后续识别。处理器分配2核,内存分配2048MB起步,网络类型选择NAT。
磁盘方面,我建议选择“将虚拟磁盘拆分成多个文件”,这样迁移和备份会方便一些。磁盘大小设置为20GB,选择“将虚拟磁盘存储为单个文件”也可以,性能会略好一点。创建完成后,挂载Ubuntu 18.04的ISO镜像,启动虚拟机开始安装系统。
安装过程中有几个关键点需要注意:语言选择English(避免中文路径带来的编码问题),时区选择Shanghai,分区选择“Guided - use entire disk”,用户名建议统一设置为“hadoop”或者类似的通用名称,密码设置简单一点但不要太离谱。安装完成后,第一时间安装VMware Tools,这样可以在宿主机和虚拟机之间复制粘贴,也能支持自适应分辨率。
系统装好后,先执行一轮更新:
sudo apt update sudo apt upgrade -y然后安装一些基础工具,后面会频繁用到:
sudo apt install -y vim net-tools openssh-server curl wget2.2 网络配置与主机名映射
三台虚拟机都装好系统之后,需要给它们配置静态IP。Ubuntu 18.04使用netplan管理网络,配置文件在/etc/netplan/目录下,通常是一个yaml文件。编辑这个文件,把dhcp改为static,然后指定IP地址、网关和DNS。
network: version: 2 ethernets: ens33: dhcp4: no addresses: [192.168.1.101/24] gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8, 114.114.114.114]应用配置:
sudo netplan apply三台节点分别设置为192.168.1.101、192.168.1.102、192.168.1.103。然后修改每台机器的主机名:
sudo hostnamectl set-hostname node1接着编辑/etc/hosts文件,把三台机器的IP和主机名映射都加进去:
192.168.1.101 node1 192.168.1.102 node2 192.168.1.103 node3这个步骤非常重要,后面所有配置文件里都会用主机名来互相引用,如果解析不了,集群根本起不来。配置完成后,用ping命令互相测试一下连通性。
2.3 SSH免密登录配置
Hadoop和HBase的启动脚本依赖SSH来远程控制各个节点,所以必须配置免密登录。首先在三台机器上分别生成密钥对:
ssh-keygen -t rsa一路回车即可,不需要设置密码。然后把每台机器的公钥分发到所有节点上:
ssh-copy-id node1 ssh-copy-id node2 ssh-copy-id node3包括本机也要执行一次ssh-copy-id node1(假设当前在node1上)。配置完成后,用ssh node2测试一下,如果不需要输入密码就能登录,说明配置成功。
实操心得:如果ssh-copy-id执行时报错“Permission denied”,检查一下目标机器的
/etc/ssh/sshd_config里PermitRootLogin和PasswordAuthentication这两个参数。Ubuntu默认不允许root用户直接SSH登录,如果你用的是普通用户,一般不会有这个问题。
2.4 JDK安装与环境变量配置
前面提到过,Hadoop 2.x和HBase 1.x对JDK 8的兼容性最好。Ubuntu 18.04的软件源里默认没有JDK 8,需要手动添加源或者直接下载二进制包。我习惯用二进制包的方式,可控性更强。
下载JDK 8的tar.gz包,解压到/usr/local/目录下:
sudo tar -zxvf jdk-8uXXX-linux-x64.tar.gz -C /usr/local/ sudo mv /usr/local/jdk1.8.0_XXX /usr/local/jdk8然后编辑/etc/profile文件,添加环境变量:
export JAVA_HOME=/usr/local/jdk8 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar执行source /etc/profile使配置生效,然后用java -version验证。三台机器都要做同样的操作。
3. Zookeeper集群部署与验证
3.1 Zookeeper安装包部署与目录规划
Zookeeper我选择3.4.x系列,这个版本稳定且与HBase 1.x兼容性好。下载apache-zookeeper-3.4.x.tar.gz,解压到/usr/local/目录下,重命名为zookeeper:
sudo tar -zxvf zookeeper-3.4.x.tar.gz -C /usr/local/ sudo mv /usr/local/zookeeper-3.4.x /usr/local/zookeeper sudo chown -R hadoop:hadoop /usr/local/zookeeper在Zookeeper的根目录下创建data和logs两个目录,分别用来存放快照数据和事务日志:
mkdir -p /usr/local/zookeeper/data mkdir -p /usr/local/zookeeper/logs3.2 zoo.cfg核心参数配置
进入conf目录,复制一份zoo_sample.cfg为zoo.cfg,然后编辑:
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/usr/local/zookeeper/data dataLogDir=/usr/local/zookeeper/logs clientPort=2181 server.1=node1:2888:3888 server.2=node2:2888:3888 server.3=node3:2888:3888这里解释一下几个关键参数的含义。tickTime是Zookeeper的基本时间单元,单位是毫秒,2000毫秒就是2秒。initLimit表示Follower节点与Leader节点建立连接时能容忍的最多tick数,10乘以2000毫秒就是20秒。syncLimit表示Follower与Leader之间心跳检测的最大延迟,5乘以2000毫秒就是10秒。clientPort是客户端连接端口,默认2181。server.X中的X是节点ID,后面跟的是通信地址和端口,2888用于Leader和Follower之间的数据同步,3888用于选举通信。
3.3 myid文件与集群启动
在每台机器的dataDir目录下创建一个名为myid的文件,内容就是对应的server.X中的X数字。node1写1,node2写2,node3写3:
echo "1" > /usr/local/zookeeper/data/myid三台机器都配置完成后,在每台机器上分别启动Zookeeper:
/usr/local/zookeeper/bin/zkServer.sh start启动完成后,用zkServer.sh status查看状态。正常情况下,你会看到一台是Leader,另外两台是Follower。如果三台都是Looking状态,说明选举没有完成,检查一下防火墙是否关闭、myid是否正确、zoo.cfg中的主机名是否能解析。
注意:Ubuntu的防火墙默认可能是开启的,用
sudo ufw disable关掉,或者手动放行2181、2888、3888端口。我一般在学习环境中直接关掉防火墙,省事。
3.4 Zookeeper集群功能验证
用Zookeeper自带的客户端连接进去,做一些基本操作验证:
/usr/local/zookeeper/bin/zkCli.sh -server node1:2181进入客户端后,创建一个节点:
create /test "hello" get /test然后在另一个节点上连接,看看能不能读到同样的数据。如果能读到,说明集群数据同步正常。再测试一下故障转移:把Leader节点停掉,看看剩下的两个节点能不能自动选出新的Leader。这个验证很重要,能让你直观感受到Zookeeper的高可用机制。
4. Hadoop集群部署与配置
4.1 Hadoop安装与目录结构规划
Hadoop我选择2.7.x系列,这个版本与HBase 1.x的兼容性经过了大量验证。下载hadoop-2.7.x.tar.gz,解压到/usr/local/:
sudo tar -zxvf hadoop-2.7.x.tar.gz -C /usr/local/ sudo mv /usr/local/hadoop-2.7.x /usr/local/hadoop sudo chown -R hadoop:hadoop /usr/local/hadoop在Hadoop根目录下创建几个目录:tmp用于存放临时文件,name和data分别用于NameNode和DataNode的数据存储,journal用于JournalNode(如果启用HA的话):
mkdir -p /usr/local/hadoop/tmp mkdir -p /usr/local/hadoop/name mkdir -p /usr/local/hadoop/data4.2 核心配置文件详解
Hadoop的配置文件都在etc/hadoop/目录下,需要修改的有五个文件。第一个是hadoop-env.sh,主要是设置JAVA_HOME:
export JAVA_HOME=/usr/local/jdk8第二个是core-site.xml:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://node1:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>node1:2181,node2:2181,node3:2181</value> </property> </configuration>fs.defaultFS指定了HDFS的默认访问路径,这里指向node1的9000端口。hadoop.tmp.dir是Hadoop的临时目录,很多运行时文件都会放在这里。ha.zookeeper.quorum是Zookeeper的地址,后面如果启用HDFS HA会用到。
第三个是hdfs-site.xml:
<configuration> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/usr/local/hadoop/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/usr/local/hadoop/data</value> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> </configuration>dfs.replication设置为2,因为三个节点的情况下,存两份副本既能保证可靠性,又不会占用太多空间。dfs.permissions.enabled设置为false是为了避免权限问题导致操作失败,生产环境不建议这样做。
第四个是mapred-site.xml,这个文件默认不存在,需要从模板复制:
cp mapred-site.xml.template mapred-site.xml然后编辑:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>第五个是yarn-site.xml:
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>node1</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>1024</value> </property> </configuration>yarn.nodemanager.resource.memory-mb这个参数需要根据你的虚拟机内存来调整。如果每台节点只有2GB内存,设置为1024MB比较合适,留一些给系统和其他进程。
4.3 slaves文件与环境变量配置
编辑etc/hadoop/slaves文件,把DataNode和NodeManager的节点列进去:
node2 node3node1作为Master节点,不承担DataNode角色,所以不列在里面。当然你也可以把node1也加进去,但那样Master节点的负载会更高。
然后在/etc/profile中添加Hadoop的环境变量:
export HADOOP_HOME=/usr/local/hadoop export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH三台机器都要配置。配置完成后,把整个Hadoop目录从node1同步到node2和node3:
scp -r /usr/local/hadoop hadoop@node2:/usr/local/ scp -r /usr/local/hadoop hadoop@node3:/usr/local/4.4 HDFS格式化与集群启动
在第一次启动之前,需要对HDFS进行格式化。在node1上执行:
hdfs namenode -format格式化成功后,你会看到“Storage directory has been successfully formatted”的提示。然后启动HDFS:
start-dfs.sh这个脚本会自动读取slaves文件,在node2和node3上启动DataNode,在node1上启动NameNode和SecondaryNameNode。启动完成后,用jps命令检查各节点的进程。node1上应该有NameNode、SecondaryNameNode,node2和node3上应该有DataNode。
接着启动YARN:
start-yarn.shnode1上会出现ResourceManager,node2和node3上会出现NodeManager。至此,Hadoop集群就启动完成了。
4.5 HDFS与YARN功能验证
在HDFS上创建一个测试目录,上传一个文件,然后读取:
hdfs dfs -mkdir -p /test/input echo "hello hadoop" > test.txt hdfs dfs -put test.txt /test/input/ hdfs dfs -cat /test/input/test.txt如果能看到文件内容,说明HDFS读写正常。然后跑一个WordCount示例,验证YARN的资源调度和MapReduce计算框架:
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.x.jar wordcount /test/input /test/output hdfs dfs -cat /test/output/part-r-00000看到单词计数结果输出,说明整个Hadoop链路都通了。
5. HBase集群部署与联调
5.1 HBase安装与依赖关系梳理
HBase我选择1.4.x系列,这个版本与Hadoop 2.7.x和Zookeeper 3.4.x的兼容性最好。下载hbase-1.4.x-bin.tar.gz,解压到/usr/local/:
sudo tar -zxvf hbase-1.4.x-bin.tar.gz -C /usr/local/ sudo mv /usr/local/hbase-1.4.x /usr/local/hbase sudo chown -R hadoop:hadoop /usr/local/hbaseHBase的架构中,HMaster负责管理RegionServer和元数据,RegionServer负责实际的数据存储和读写。HBase依赖Zookeeper做集群协调,依赖HDFS做底层存储。所以在启动HBase之前,必须确保Zookeeper和Hadoop都已经正常运行。
5.2 hbase-site.xml核心配置
编辑conf/hbase-site.xml:
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://node1:9000/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>node1,node2,node3</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/usr/local/zookeeper/data</value> </property> <property> <name>hbase.master.port</name> <value>16000</value> </property> <property> <name>hbase.master.info.port</name> <value>16010</value> </property> </configuration>hbase.rootdir指向HDFS上的一个目录,HBase的所有数据都会存在这里。hbase.cluster.distributed设置为true表示使用分布式模式。hbase.zookeeper.quorum指定Zookeeper集群的地址。hbase.zookeeper.property.dataDir这个参数在HBase使用外部Zookeeper时其实不会生效,但保留着也无妨。
5.3 regionservers与环境变量配置
编辑conf/regionservers文件:
node2 node3node1作为HMaster节点,不承担RegionServer角色。然后在/etc/profile中添加HBase的环境变量:
export HBASE_HOME=/usr/local/hbase export PATH=$HBASE_HOME/bin:$PATH另外,HBase的启动脚本需要知道Hadoop的配置在哪里,所以要在hbase-env.sh中设置:
export JAVA_HOME=/usr/local/jdk8 export HBASE_MANAGES_ZK=false export HADOOP_HOME=/usr/local/hadoopHBASE_MANAGES_ZK设置为false表示使用外部Zookeeper,而不是HBase自带的。这个参数很关键,如果设置为true,HBase会自己启动一个Zookeeper实例,跟我们之前搭建的集群冲突。
5.4 HBase集群启动与验证
把配置好的HBase目录同步到node2和node3:
scp -r /usr/local/hbase hadoop@node2:/usr/local/ scp -r /usr/local/hbase hadoop@node3:/usr/local/在node1上启动HBase:
start-hbase.sh启动完成后,用jps检查进程。node1上应该有HMaster,node2和node3上应该有HRegionServer。然后进入HBase shell:
hbase shell创建一张测试表:
create 'test_table', 'cf1' put 'test_table', 'row1', 'cf1:name', 'zhangsan' get 'test_table', 'row1'如果能看到插入的数据,说明HBase集群工作正常。再执行status命令,看看集群的节点数量和负载情况。
5.5 三组件联调与常见问题排查
整套环境搭起来之后,最常遇到的问题就是组件之间的依赖关系没有理顺。比如HBase启动时报“Connection refused to Zookeeper”,大概率是Zookeeper没启动或者防火墙没关。再比如HBase的RegionServer启动后马上挂掉,检查一下HDFS是否正常,因为RegionServer需要往HDFS写数据。
还有一个经典问题是时间不同步。三台虚拟机如果时间差超过30秒,Zookeeper和HBase都会报错。用date命令检查一下各节点的时间,如果差异较大,安装ntp服务同步一下:
sudo apt install -y ntp sudo ntpdate ntp.ubuntu.com实操心得:每次启动集群的时候,严格按照Zookeeper -> Hadoop -> HBase的顺序来。关闭的时候反过来,先关HBase,再关Hadoop,最后关Zookeeper。这个顺序能避免很多“进程残留”和“端口占用”的问题。
6. 常见问题速查与避坑经验
6.1 启动失败类问题排查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| Zookeeper启动后状态为Looking | 选举未完成 | 检查myid文件、防火墙、主机名解析 | 确保myid唯一、防火墙关闭、/etc/hosts正确 |
| NameNode启动失败 | 多次格式化导致clusterID不一致 | 查看NameNode日志 | 删除name和data目录重新格式化 |
| DataNode未启动 | slaves文件配置错误 | 检查slaves文件内容 | 确保主机名与/etc/hosts一致 |
| HBase HMaster启动后退出 | Zookeeper连接失败 | 查看HBase日志中的Zookeeper连接信息 | 确认Zookeeper已启动且端口可达 |
| RegionServer启动后挂掉 | HDFS不可用或时间不同步 | 检查HDFS状态和时间差 | 启动HDFS、同步时间 |
6.2 资源不足导致的性能问题
三个节点跑在一台物理机上,最容易出现的就是内存不足。我的经验是,如果物理机只有8GB内存,三个节点各分2GB,跑起来会非常吃力,HBase的RegionServer经常因为内存不足被系统杀掉。这种情况下,要么升级物理内存,要么减少节点数量(比如只用两个节点,但Zookeeper需要奇数节点,所以至少三个)。
另一个常见的性能瓶颈是磁盘IO。三个虚拟机的磁盘文件如果放在同一块机械硬盘上,同时读写的时候IO等待会非常高。有条件的话,把虚拟磁盘放在SSD上,或者至少分散到不同的物理分区。
6.3 配置文件同步的省事技巧
三台机器的配置文件如果手动改,很容易漏掉或者改错。我习惯在node1上改好所有配置,然后用scp批量同步:
scp -r /usr/local/hadoop/etc/hadoop hadoop@node2:/usr/local/hadoop/etc/ scp -r /usr/local/hadoop/etc/hadoop hadoop@node3:/usr/local/hadoop/etc/ scp -r /usr/local/hbase/conf hadoop@node2:/usr/local/hbase/ scp -r /usr/local/hbase/conf hadoop@node3:/usr/local/hbase/同步之前,记得把node1上那些只属于Master节点的配置(比如slaves文件)确认一下,避免把不该同步的内容也传过去。
6.4 快照管理与环境恢复
VMware的快照功能是学习阶段的神器。我建议在几个关键节点打快照:系统刚装好时、JDK和基础环境配好时、Zookeeper集群跑通时、Hadoop集群跑通时、HBase集群跑通时。这样一旦后面搞崩了,可以快速回滚到最近的稳定状态,不用从头再来。
快照会占用额外的磁盘空间,所以不要打太多,保留三到四个关键节点就够了。另外,快照恢复之后,记得检查一下网络配置和主机名,有时候快照恢复会导致这些信息回退。
6.5 日志查看的优先级与技巧
排查问题的时候,日志是最重要的线索。Hadoop和HBase的日志都在各自的logs目录下。我的习惯是先用tail -f实时查看启动日志,看看有没有明显的ERROR。如果启动脚本一闪而过,就去logs目录下找对应的.log文件,用grep过滤ERROR和WARN。
Zookeeper的日志在/usr/local/zookeeper/logs/下,主要看zookeeper.out。Hadoop的NameNode日志在/usr/local/hadoop/logs/下,文件名包含namenode。HBase的HMaster日志在/usr/local/hbase/logs/下,文件名包含master。
提示:日志文件会随着时间不断增大,定期清理一下旧的日志可以释放磁盘空间。用
find /usr/local/hadoop/logs -name "*.log" -mtime +7 -delete可以删除7天前的日志。
7. 集群日常运维与扩展思路
7.1 启动与停止脚本的封装
每次手动敲一堆启动命令太麻烦,我习惯写一个简单的脚本放在用户目录下:
#!/bin/bash case $1 in start) echo "Starting Zookeeper..." for i in node1 node2 node3; do ssh $i "/usr/local/zookeeper/bin/zkServer.sh start"; done echo "Starting Hadoop..." start-dfs.sh start-yarn.sh echo "Starting HBase..." start-hbase.sh ;; stop) echo "Stopping HBase..." stop-hbase.sh echo "Stopping Hadoop..." stop-yarn.sh stop-dfs.sh echo "Stopping Zookeeper..." for i in node1 node2 node3; do ssh $i "/usr/local/zookeeper/bin/zkServer.sh stop"; done ;; status) for i in node1 node2 node3; do echo "=== $i ==="; ssh $i "jps"; done ;; esac这个脚本虽然简单,但能省掉大量重复劳动。注意脚本里的ssh命令需要免密登录已经配置好。
7.2 监控指标与健康检查
集群跑起来之后,需要定期检查健康状况。HDFS的Web界面在http://node1:50070,可以看到NameNode的状态、DataNode列表、存储空间使用情况。YARN的Web界面在http://node1:8088,可以看到ResourceManager的状态、应用列表、节点资源。HBase的Web界面在http://node1:16010,可以看到HMaster的状态、RegionServer列表、表信息。
除了Web界面,命令行工具也很常用。hdfs dfsadmin -report可以查看HDFS的详细报告,yarn node -list可以查看YARN节点列表,hbase hbck可以检查HBase集群的一致性。
7.3 后续扩展方向
这套三节点集群跑通之后,可以往几个方向扩展。一是启用HDFS HA,把NameNode做成两个,用Zookeeper做自动故障转移。二是启用YARN HA,把ResourceManager也做成两个。三是增加节点数量,把集群扩展到五台甚至更多,验证更大规模下的行为。四是集成Hive或Spark,在HBase之上做更丰富的数据分析。
每增加一个组件,依赖关系就复杂一层,所以建议一次只加一个,跑通之后再继续。我自己的经验是,HDFS HA和YARN HA的配置最容易出错,因为涉及到JournalNode和ZKFC这些额外的角色,配置文件也要改很多地方。如果只是学习用途,三节点的非HA集群其实已经足够理解核心原理了。
7.4 数据备份与恢复策略
HBase的数据最终存在HDFS上,所以备份HBase数据本质上就是备份HDFS上的/hbase目录。可以用hdfs dfs -copyToLocal /hbase /backup/hbase把数据拉到本地。恢复的时候反过来,先停掉HBase,把数据传回HDFS,再启动HBase。
不过这种冷备份的方式只适合数据量不大、可以接受停机的情况。如果数据量大,建议用HBase自带的Export/Import工具,或者用Snapshot功能做在线备份。Snapshot的原理是记录元数据的变更,不复制实际数据,所以速度非常快,适合频繁备份。
注意:做任何备份操作之前,先确认集群处于健康状态。如果HBase本身就有不一致的问题,备份出来的数据也是不可靠的。
7.5 安全加固的基本思路
学习环境一般不考虑安全,但如果你打算把这套集群暴露在局域网中给其他人用,就需要做一些基本的安全加固。首先是关闭不必要的端口,只开放Web界面和必要的服务端口。其次是配置Hadoop的权限系统,把dfs.permissions.enabled改回true,并设置合理的用户和组。最后是给Zookeeper和HBase配置ACL,限制客户端的访问权限。
这些操作会显著增加配置的复杂度,建议在集群稳定运行一段时间之后再逐步引入。每加一层安全机制,都要充分测试,确保不会影响正常的读写操作。
踩过几次坑之后,我最大的体会是:搭建集群这件事,耐心比技术更重要。每一个报错都有原因,每一处配置都有讲究,不要跳过任何一个看似不起眼的步骤。把基础打牢了,后面学什么都会顺很多。