单机虚拟机搭建Zookeeper+Hadoop+HBase三节点集群实战指南 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/目录下重命名为zookeepersudo 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然后编辑tickTime2000 initLimit10 syncLimit5 dataDir/usr/local/zookeeper/data dataLogDir/usr/local/zookeeper/logs clientPort2181 server.1node1:2888:3888 server.2node2:2888:3888 server.3node3: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写1node2写2node3写3echo 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_HOMEexport JAVA_HOME/usr/local/jdk8第二个是core-site.xmlconfiguration property namefs.defaultFS/name valuehdfs://node1:9000/value /property property namehadoop.tmp.dir/name value/usr/local/hadoop/tmp/value /property property nameha.zookeeper.quorum/name valuenode1:2181,node2:2181,node3:2181/value /property /configurationfs.defaultFS指定了HDFS的默认访问路径这里指向node1的9000端口。hadoop.tmp.dir是Hadoop的临时目录很多运行时文件都会放在这里。ha.zookeeper.quorum是Zookeeper的地址后面如果启用HDFS HA会用到。第三个是hdfs-site.xmlconfiguration property namedfs.replication/name value2/value /property property namedfs.namenode.name.dir/name value/usr/local/hadoop/name/value /property property namedfs.datanode.data.dir/name value/usr/local/hadoop/data/value /property property namedfs.permissions.enabled/name valuefalse/value /property /configurationdfs.replication设置为2因为三个节点的情况下存两份副本既能保证可靠性又不会占用太多空间。dfs.permissions.enabled设置为false是为了避免权限问题导致操作失败生产环境不建议这样做。第四个是mapred-site.xml这个文件默认不存在需要从模板复制cp mapred-site.xml.template mapred-site.xml然后编辑configuration property namemapreduce.framework.name/name valueyarn/value /property /configuration第五个是yarn-site.xmlconfiguration property nameyarn.resourcemanager.hostname/name valuenode1/value /property property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.nodemanager.resource.memory-mb/name value1024/value /property /configurationyarn.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和node3scp -r /usr/local/hadoop hadoopnode2:/usr/local/ scp -r /usr/local/hadoop hadoopnode3:/usr/local/4.4 HDFS格式化与集群启动在第一次启动之前需要对HDFS进行格式化。在node1上执行hdfs namenode -format格式化成功后你会看到“Storage directory has been successfully formatted”的提示。然后启动HDFSstart-dfs.sh这个脚本会自动读取slaves文件在node2和node3上启动DataNode在node1上启动NameNode和SecondaryNameNode。启动完成后用jps命令检查各节点的进程。node1上应该有NameNode、SecondaryNameNodenode2和node3上应该有DataNode。接着启动YARNstart-yarn.shnode1上会出现ResourceManagernode2和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.xmlconfiguration property namehbase.rootdir/name valuehdfs://node1:9000/hbase/value /property property namehbase.cluster.distributed/name valuetrue/value /property property namehbase.zookeeper.quorum/name valuenode1,node2,node3/value /property property namehbase.zookeeper.property.dataDir/name value/usr/local/zookeeper/data/value /property property namehbase.master.port/name value16000/value /property property namehbase.master.info.port/name value16010/value /property /configurationhbase.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_ZKfalse export HADOOP_HOME/usr/local/hadoopHBASE_MANAGES_ZK设置为false表示使用外部Zookeeper而不是HBase自带的。这个参数很关键如果设置为trueHBase会自己启动一个Zookeeper实例跟我们之前搭建的集群冲突。5.4 HBase集群启动与验证把配置好的HBase目录同步到node2和node3scp -r /usr/local/hbase hadoopnode2:/usr/local/ scp -r /usr/local/hbase hadoopnode3:/usr/local/在node1上启动HBasestart-hbase.sh启动完成后用jps检查进程。node1上应该有HMasternode2和node3上应该有HRegionServer。然后进入HBase shellhbase 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 hadoopnode2:/usr/local/hadoop/etc/ scp -r /usr/local/hadoop/etc/hadoop hadoopnode3:/usr/local/hadoop/etc/ scp -r /usr/local/hbase/conf hadoopnode2:/usr/local/hbase/ scp -r /usr/local/hbase/conf hadoopnode3:/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限制客户端的访问权限。这些操作会显著增加配置的复杂度建议在集群稳定运行一段时间之后再逐步引入。每加一层安全机制都要充分测试确保不会影响正常的读写操作。踩过几次坑之后我最大的体会是搭建集群这件事耐心比技术更重要。每一个报错都有原因每一处配置都有讲究不要跳过任何一个看似不起眼的步骤。把基础打牢了后面学什么都会顺很多。