1. 项目概述
作为一名长期从事大数据平台搭建的技术从业者,我深知在Ubuntu系统上构建完整Hadoop生态系统的痛点和难点。本文将分享我在Ubuntu 20.04 LTS上搭建Hadoop+Hive+HBase+Spark全栈环境的实战经验,这是一套经过生产环境验证的稳定版本组合。
这个环境特别适合以下场景:
- 大数据学习与教学实验环境
- 中小型企业数据仓库建设
- 数据分析和处理平台原型开发
- 分布式系统技术验证
2. 环境准备与核心思想
2.1 版本选型策略
大数据组件的版本兼容性至关重要。经过多次测试验证,我推荐以下版本组合:
| 组件 | 版本 | 选择理由 |
|---|---|---|
| 操作系统 | Ubuntu 20.04.6 LTS | 长期支持版,社区资源丰富,稳定性高 |
| Java | OpenJDK 8 | Hadoop官方推荐版本,与HBase等组件兼容性最佳 |
| Hadoop | 3.3.6 | 3.x系列的稳定版本,支持EC编码和GPU加速等新特性 |
| Hive | 3.1.2 | 经典稳定版,SQL兼容性好,文档资料丰富 |
| HBase | 2.4.13 | 2.4.x维护分支,与Hadoop 3.x兼容性良好 |
| Spark | 3.1.2 | 官方长期支持版本,预编译支持Hadoop 3.2+ |
| ZooKeeper | 3.6.3 | 独立部署版本,避免与HBase内置ZK冲突 |
| MySQL | 8.0 | 作为Hive元数据存储,性能优于Derby,支持多会话访问 |
提示:版本选择遵循"稳定优先"原则,避免使用过新或已停止维护的版本。这套组合经过上百次安装验证,各组件间API兼容性良好。
2.2 系统基础配置
用户与权限管理
建议创建专用用户来运行大数据服务,避免使用root账户带来的安全隐患:
bash复制# 创建hadoop用户并赋予sudo权限
sudo useradd -m hadoop -s /bin/bash
sudo passwd hadoop
sudo usermod -aG sudo hadoop
# 切换至hadoop用户
su - hadoop
必备工具安装
这些基础工具将在后续安装和运维中发挥重要作用:
bash复制sudo apt update && sudo apt install -y \
vim curl wget tar git \
openssh-server net-tools \
libxml2-utils # 用于XML配置文件验证
工具链解析:
- curl/wget:用于下载组件包,建议同时安装以便灵活使用
- tar:解压.tar.gz格式的Hadoop生态组件包
- openssh-server:Hadoop集群节点间通信的基础
- net-tools:提供netstat等网络诊断工具
SSH免密登录配置
Hadoop集群管理需要NameNode无密码访问DataNode:
bash复制ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# 验证配置
ssh localhost
exit
注意:如果是真实的多节点集群,需要将公钥分发到所有节点的authorized_keys文件中。
2.3 Java环境部署
Java是大数据生态的运行时基础,安装配置需特别注意:
bash复制sudo apt install -y openjdk-8-jdk
# 验证安装
java -version
# 应输出类似:openjdk version "1.8.0_392"
# 获取JAVA_HOME路径
JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
echo $JAVA_HOME
# 典型输出:/usr/lib/jvm/java-8-openjdk-amd64
永久环境变量配置:
bash复制sudo tee -a /etc/profile <<EOF
export JAVA_HOME=${JAVA_HOME}
export PATH=\$PATH:\$JAVA_HOME/bin
EOF
source /etc/profile
3. Hadoop集群搭建
3.1 Hadoop安装与配置
软件包部署
bash复制wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
sudo tar -zxvf hadoop-3.3.6.tar.gz -C /usr/local
sudo mv /usr/local/hadoop-3.3.6 /usr/local/hadoop
sudo chown -R hadoop:hadoop /usr/local/hadoop
环境变量设置
bash复制sudo tee -a /etc/profile <<'EOF'
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
EOF
source /etc/profile
核心配置文件调整
- hadoop-env.sh - 设置Java环境
bash复制echo "export JAVA_HOME=${JAVA_HOME}" >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh
- core-site.xml - 全局参数
xml复制<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/data/tmp</value>
</property>
</configuration>
- hdfs-site.xml - HDFS专用配置
xml复制<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/local/hadoop/data/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop/data/datanode</value>
</property>
</configuration>
- mapred-site.xml - MapReduce配置
xml复制<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- yarn-site.xml - 资源管理配置
xml复制<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
目录创建与初始化
bash复制mkdir -p /usr/local/hadoop/data/{tmp,namenode,datanode}
# 首次启动前格式化NameNode
hdfs namenode -format
3.2 集群启动与验证
bash复制start-dfs.sh
start-yarn.sh
# 进程验证
jps
# 应看到:NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager
# Web UI访问
echo "HDFS WebUI: http://localhost:9870"
echo "YARN WebUI: http://localhost:8088"
经验:首次启动后,HDFS会进入安全模式约30秒,此时无法执行写操作。可通过
hdfs dfsadmin -safemode wait等待退出。
4. Hive数据仓库搭建
4.1 MySQL元数据库配置
bash复制sudo apt install -y mysql-server
sudo mysql_secure_installation
# 建议设置root密码并禁用匿名用户
# 创建Hive元数据库
sudo mysql -u root -p <<EOF
CREATE DATABASE metastore CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER 'hive'@'%' IDENTIFIED BY 'hive';
GRANT ALL PRIVILEGES ON metastore.* TO 'hive'@'%';
FLUSH PRIVILEGES;
EOF
4.2 Hive安装部署
bash复制wget https://archive.apache.org/dist/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz
sudo tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /usr/local
sudo mv /usr/local/apache-hive-3.1.2-bin /usr/local/hive
sudo chown -R hadoop:hadoop /usr/local/hive
# 环境变量配置
sudo tee -a /etc/profile <<'EOF'
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
EOF
source /etc/profile
4.3 MySQL驱动配置
bash复制wget https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar
cp mysql-connector-j-8.0.33.jar $HIVE_HOME/lib/
4.4 Hive配置文件
创建hive-site.xml:
xml复制<configuration>
<!-- MySQL连接配置 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
<!-- 仓库目录配置 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!-- 临时目录配置 -->
<property>
<name>hive.exec.local.scratchdir</name>
<value>/tmp/hive/${user.name}</value>
</property>
</configuration>
4.5 元数据库初始化
bash复制# 创建HDFS仓库目录
hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -chmod 733 /user/hive/warehouse
# 初始化元数据库
schematool -dbType mysql -initSchema
4.6 Hive启动验证
bash复制hive
-- 测试命令
SHOW DATABASES;
CREATE TABLE test(id int);
DESCRIBE FORMATTED test;
5. ZooKeeper协调服务
5.1 安装与配置
bash复制wget https://archive.apache.org/dist/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
sudo tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz -C /usr/local
sudo mv /usr/local/apache-zookeeper-3.6.3-bin /usr/local/zookeeper
sudo chown -R hadoop:hadoop /usr/local/zookeeper
# 环境变量
sudo tee -a /etc/profile <<'EOF'
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
EOF
source /etc/profile
5.2 配置文件
bash复制mkdir -p /usr/local/zookeeper/data
cat > $ZOOKEEPER_HOME/conf/zoo.cfg <<EOF
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
clientPort=2181
EOF
5.3 服务启动
bash复制zkServer.sh start
zkServer.sh status # 应显示Mode: standalone
# 客户端验证
zkCli.sh -server localhost:2181
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
quit
6. HBase分布式数据库
6.1 安装部署
bash复制wget https://archive.apache.org/dist/hbase/2.4.13/hbase-2.4.13-bin.tar.gz
sudo tar -zxvf hbase-2.4.13-bin.tar.gz -C /usr/local
sudo mv /usr/local/hbase-2.4.13 /usr/local/hbase
sudo chown -R hadoop:hadoop /usr/local/hbase
# 环境变量
sudo tee -a /etc/profile <<'EOF'
export HBASE_HOME=/usr/local/hbase
export PATH=$PATH:$HBASE_HOME/bin
EOF
source /etc/profile
6.2 关键配置
- hbase-env.sh
bash复制echo "export JAVA_HOME=${JAVA_HOME}" >> $HBASE_HOME/conf/hbase-env.sh
echo "export HBASE_MANAGES_ZK=false" >> $HBASE_HOME/conf/hbase-env.sh
- hbase-site.xml
xml复制<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>localhost</value>
</property>
<property>
<name>hbase.wal.async.enabled</name>
<value>false</value>
</property>
</configuration>
6.3 服务启动
bash复制start-hbase.sh
# 验证
jps # 应看到HMaster和HRegionServer
hbase shell
hbase:001:0> status
exit
7. Spark计算引擎
7.1 安装配置
bash复制wget https://archive.apache.org/dist/spark/spark-3.1.2/spark-3.1.2-bin-hadoop3.2.tgz
sudo tar -zxvf spark-3.1.2-bin-hadoop3.2.tgz -C /usr/local
sudo mv /usr/local/spark-3.1.2-bin-hadoop3.2 /usr/local/spark
sudo chown -R hadoop:hadoop /usr/local/spark
# 环境变量
sudo tee -a /etc/profile <<'EOF'
export SPARK_HOME=/usr/local/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
EOF
source /etc/profile
7.2 YARN集成配置
bash复制cp $SPARK_HOME/conf/spark-env.sh.template $SPARK_HOME/conf/spark-env.sh
cat >> $SPARK_HOME/conf/spark-env.sh <<EOF
export JAVA_HOME=${JAVA_HOME}
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=\$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=\$HADOOP_HOME/etc/hadoop
EOF
7.3 运行验证
bash复制# Spark Shell测试
spark-shell
sc.parallelize(1 to 100).count()
:quit
# 提交YARN作业
spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
$SPARK_HOME/examples/jars/spark-examples_2.12-3.1.2.jar 10
8. 集群管理脚本
8.1 一键启动脚本
创建~/start-all.sh:
bash复制#!/bin/bash
echo ">>> Starting ZooKeeper..."
zkServer.sh start
echo ">>> Starting Hadoop HDFS..."
start-dfs.sh
echo ">>> Starting Hadoop YARN..."
start-yarn.sh
echo ">>> Waiting for HDFS safe mode..."
hdfs dfsadmin -safemode wait
echo ">>> Starting HBase..."
start-hbase.sh
echo ">>> Cluster status:"
jps | grep -E 'NameNode|DataNode|ResourceManager|NodeManager|HMaster|HRegionServer|QuorumPeerMain'
8.2 一键停止脚本
创建~/stop-all.sh:
bash复制#!/bin/bash
echo ">>> Stopping HBase..."
stop-hbase.sh
echo ">>> Stopping Hadoop YARN..."
stop-yarn.sh
echo ">>> Stopping Hadoop HDFS..."
stop-dfs.sh
echo ">>> Stopping ZooKeeper..."
zkServer.sh stop
echo ">>> Remaining processes:"
jps | grep -E 'NameNode|DataNode|ResourceManager|NodeManager|HMaster|HRegionServer|QuorumPeerMain' || echo "No related processes"
赋予执行权限:
bash复制chmod +x ~/start-all.sh ~/stop-all.sh
9. 常见问题排查
9.1 HBase启动失败
现象:HMaster进程存在但无法访问Web UI(16010端口)
解决方案:
- 检查HDFS上/hbase目录权限
- 确认ZooKeeper服务状态
- 查看日志
tail -f $HBASE_HOME/logs/hbase-*.log
9.2 Hive元数据连接错误
现象:schematool初始化失败或Hive CLI无法启动
排查步骤:
- 验证MySQL服务状态
- 检查
hive-site.xml中的连接参数 - 确认MySQL驱动jar位置正确
9.3 Spark on YARN问题
现象:Spark作业提交后卡在ACCEPTED状态
解决方法:
- 检查YARN资源管理器日志
- 验证
SPARK_HOME和HADOOP_CONF_DIR环境变量 - 确保Spark版本与Hadoop版本兼容
10. 性能优化建议
-
HDFS调优:
- 适当增加
dfs.namenode.handler.count(默认10) - 调整
dfs.datanode.max.transfer.threads(默认4096)
- 适当增加
-
YARN资源配置:
xml复制<!-- yarn-site.xml --> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>8192</value> <!-- 根据物理内存调整 --> </property> -
Hive执行引擎:
sql复制SET hive.execution.engine=tez; -- 如安装Tez可显著提升性能 -
Spark内存配置:
bash复制
spark-submit --executor-memory 4G --driver-memory 2G ...
这套环境经过多次生产部署验证,各组件版本组合稳定可靠。建议首次搭建时严格遵循本文步骤,待环境稳定运行后再根据实际需求进行调优和扩展。