MacBook上从零搭建Hadoop伪分布式集群实战指南
去年刚换M2芯片的MacBook Pro时,我花了整整三天时间才搞定Hadoop伪分布式环境。期间踩过的坑包括Homebrew安装路径冲突、ARM架构兼容性问题、环境变量配置错误等。本文将分享一套经过验证的完整流程,涵盖JDK 1.8、Hadoop 3.2.2和Spark 3.1.1的配置,特别针对macOS Ventura/Sonoma系统优化。
1. 环境准备与基础配置
1.1 处理ARM架构兼容性问题
M1/M2芯片的Mac需要特别注意软件兼容性。虽然大多数工具已支持ARM64架构,但仍有几个关键点需要注意:
- 优先使用Homebrew安装:Homebrew的ARM版本(/opt/homebrew)能自动处理架构适配问题
- 手动安装时选择ARM版本:官网下载页通常标注
aarch64或ARM64的包 - Rosetta兼容模式:对尚未适配的软件,可通过以下命令创建x86_64终端环境:
arch -x86_64 zsh
1.2 必备工具安装
推荐先通过Homebrew安装基础工具链:
brew install openssl ssh rsync curl配置SSH免密登录(Hadoop集群通信必需):
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 0600 ~/.ssh/authorized_keys测试是否成功:
ssh localhost2. JDK 1.8安装与配置
2.1 安装选项对比
| 安装方式 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
| Homebrew | 自动配置环境变量 | 版本可能较新 | 快速开发环境 |
| 官网下载 | 版本可控 | 需手动配置 | 生产环境兼容 |
| Azul Zulu | ARM原生支持 | 需要注册账户 | M1/M2芯片优化 |
推荐使用Azul Zulu的ARM版本:
brew tap homebrew/cask-versions brew install --cask zulu82.2 环境变量配置
修改~/.zshrc(macOS默认shell):
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8) export PATH=$JAVA_HOME/bin:$PATH验证安装:
java -version # 应输出类似:openjdk version "1.8.0_382"3. Hadoop 3.2.2伪分布式部署
3.1 安装方式选择
对于M1/M2设备,建议手动下载二进制包以避免架构问题:
cd ~/Downloads curl -O https://archive.apache.org/dist/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz tar -xzf hadoop-3.2.2.tar.gz sudo mv hadoop-3.2.2 /usr/local/hadoop3.2 核心配置文件修改
所有配置文件位于/usr/local/hadoop/etc/hadoop/目录:
core-site.xml:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> </property> </configuration>hdfs-site.xml:
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file://${hadoop.tmp.dir}/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file://${hadoop.tmp.dir}/dfs/data</value> </property> </configuration>3.3 环境变量配置
追加到~/.zshrc:
export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"3.4 初始化与启动
首次运行需要格式化NameNode:
hdfs namenode -format启动集群:
start-dfs.sh start-yarn.sh验证服务:
jps # 应看到至少包含:NameNode, DataNode, ResourceManager, NodeManager4. Spark 3.1.1集成部署
4.1 安装注意事项
Spark需要与Hadoop版本匹配。对于Hadoop 3.2.2,应选择"Pre-built for Apache Hadoop 3.2 and later"的包:
curl -O https://archive.apache.org/dist/spark/spark-3.1.1/spark-3.1.1-bin-hadoop3.2.tgz tar -xzf spark-3.1.1-bin-hadoop3.2.tgz sudo mv spark-3.1.1-bin-hadoop3.2 /usr/local/spark4.2 关键配置
编辑/usr/local/spark/conf/spark-env.sh:
cp /usr/local/spark/conf/spark-env.sh.template /usr/local/spark/conf/spark-env.sh echo "export SPARK_DIST_CLASSPATH=$(hadoop classpath)" >> /usr/local/spark/conf/spark-env.sh环境变量配置:
export SPARK_HOME=/usr/local/spark export PATH=$PATH:$SPARK_HOME/bin4.3 启动与验证
启动Spark集群:
$SPARK_HOME/sbin/start-master.sh $SPARK_HOME/sbin/start-worker.sh spark://$(hostname):7077提交测试任务:
spark-submit --class org.apache.spark.examples.SparkPi \ --master spark://$(hostname):7077 \ $SPARK_HOME/examples/jars/spark-examples_2.12-3.1.1.jar 105. 常见问题排查
5.1 端口冲突问题
Hadoop和Spark默认使用以下端口,确保它们未被占用:
| 服务 | 端口 | 检查命令 |
|---|---|---|
| HDFS NameNode | 9000 | lsof -i :9000 |
| YARN | 8088 | `netstat -an |
| Spark Master | 7077 | `ss -tulnp |
5.2 内存配置调整
对于8GB内存的MacBook,建议修改以下配置:
$HADOOP_HOME/etc/hadoop/yarn-site.xml:
<property> <name>yarn.nodemanager.resource.memory-mb</name> <value>4096</value> </property>$SPARK_HOME/conf/spark-defaults.conf:
spark.executor.memory 2g spark.driver.memory 1g5.3 文件权限问题
Hadoop对文件权限敏感,遇到权限错误时可尝试:
hdfs dfs -chmod -R 777 /tmp6. 开发环境优化技巧
6.1 使用Docker简化部署
对于频繁重置环境的需求,可考虑Docker方案:
docker run -it --name hadoop -p 9000:9000 -p 8088:8088 sequenceiq/hadoop-docker:2.7.16.2 IDE集成配置
在IntelliJ IDEA中配置:
- 添加依赖:
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.2.2</version> </dependency> - 设置VM参数:
-Djava.library.path=/usr/local/hadoop/lib/native
6.3 性能监控工具
安装Ganglia进行集群监控:
brew install ganglia配置/usr/local/hadoop/etc/hadoop/hadoop-metrics2.properties:
*.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31 *.sink.ganglia.period=10 namenode.sink.ganglia.servers=localhost:8649