从零到一:Hadoop伪分布式环境搭建实战与避坑指南
1. 环境准备:Linux系统与基础配置
第一次在Linux上搭建Hadoop伪分布式环境时,我花了整整两天时间才搞定所有依赖。这里分享几个新手容易忽略的关键点:首先建议使用Ubuntu 20.04 LTS或CentOS 7这类主流发行版,避免在冷门系统上踩兼容性坑。我测试过在4核CPU/8GB内存的虚拟机就能流畅运行,但硬盘空间建议预留50GB以上,因为Hadoop的日志文件增长速度快得惊人。
系统装好后第一件事是更新软件源,这个步骤很多教程会跳过,但实际非常重要:
sudo apt update && sudo apt upgrade -y # Ubuntu/Debian
sudo yum update -y # CentOS/RHEL
接着安装基础工具链,后面会频繁用到:
sudo apt install -y ssh pdsh vim net-tools # Ubuntu
sudo yum install -y openssh-clients pdsh vim net-tools # CentOS
注意:如果使用虚拟机环境,务必确认BIOS已开启虚拟化支持。我在旧笔记本上遇到过VT-x未启用导致Hadoop启动失败的案例,用
egrep -c '(vmx|svm)' /proc/cpuinfo命令检查返回值应大于0。
2. JDK安装:版本选择与环境变量配置
Hadoop 3.x官方推荐使用JDK 8或11,但实测发现不同小版本间存在细微差异。我最推荐OpenJDK 1.8.0_342这个经过充分验证的版本,用以下命令安装:
sudo apt install -y openjdk-8-jdk # Ubuntu
sudo yum install -y java-1.8.0-openjdk-devel # CentOS
环境变量配置是新手最容易出错的地方。建议在~/.bashrc和/etc/profile中都添加配置,避免切换用户时失效:
echo 'export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))' >> ~/.bashrc
echo 'export PATH=$PATH:$JAVA_HOME/bin' >> ~/.bashrc
source ~/.bashrc
验证安装时别只用java -version,还要检查javac是否可用:
java -version # 应显示1.8.x
javac -version # 应与java版本一致
遇到JAVA_HOME not set错误时,可以手动指定路径。我在CentOS 7上就遇到过默认安装路径不一致的问题,最终用find /usr/lib/jvm -name "javac"定位到了真实路径。
3. SSH免密登录:密钥生成与权限管理
伪分布式模式要求本机SSH免密登录,这里有个隐藏坑点:如果.ssh目录权限不对,配置会完全失效。正确的操作流程是:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
测试时不要简单用ssh localhost,建议加上-v参数看详细日志:
ssh -v localhost # 观察认证过程
如果遇到Permission denied错误,检查三个地方:
/etc/ssh/sshd_config中PubkeyAuthentication应为yes- 用户home目录权限不能是777(需750)
- SELinux状态可能导致问题,临时关闭用
setenforce 0
4. Hadoop安装与核心配置
下载Hadoop时建议用国内镜像源,清华大学的镜像速度很快:
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz
tar -zxvf hadoop-3.3.4.tar.gz -C /opt
mv /opt/hadoop-3.3.4 /opt/hadoop
环境变量配置要特别注意Hadoop的路径:
echo 'export HADOOP_HOME=/opt/hadoop' >> ~/.bashrc
echo 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin' >> ~/.bashrc
配置文件修改是重中之重,这几个文件必须仔细核对:
etc/hadoop/hadoop-env.sh:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 # 根据实际路径修改
export HADOOP_SSH_OPTS="-p 22" # 如果SSH端口不是22需指定
etc/hadoop/core-site.xml:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
</property>
</configuration>
etc/hadoop/hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/hadoop/hdfs/datanode</value>
</property>
</configuration>
5. 初始化与故障排查
格式化NameNode前务必确认数据目录不存在:
hdfs namenode -format # 首次初始化
启动时建议分步验证:
start-dfs.sh
jps # 应看到NameNode/DataNode/SecondaryNameNode
常见错误解决方案:
- WARN util.NativeCodeLoader:
echo 'export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"' >> $HADOOP_HOME/etc/hadoop/hadoop-env.sh
- 端口占用问题:
netstat -tulnp | grep java # 查看冲突进程
- 网页界面无法访问:
检查
etc/hadoop/hdfs-site.xml中的dfs.http.address配置,防火墙需开放9870端口
最后验证HDFS是否正常工作:
hdfs dfs -mkdir /test
hdfs dfs -put localfile /test
hdfs dfs -ls /test
更多推荐
所有评论(0)