从虚拟机到第一个MapReduce程序:我的Hadoop 2.7.7伪分布式环境搭建全记录

1. 为什么选择这条技术路线

记得第一次听说Hadoop是在三年前的一次技术分享会上,当时演讲者用"大数据界的瑞士军刀"来形容它。如今终于有机会亲手搭建一个伪分布式环境,既兴奋又忐忑。选择Hadoop 2.7.7这个经典版本,主要是考虑到社区支持完善,遇到问题容易找到解决方案。

在虚拟化方案的选择上,我最终敲定VMware Player而不是VirtualBox,原因很实际:

  • 硬件加速:对Intel VT-x/AMD-V的支持更稳定
  • 网络配置:NAT和桥接模式切换更直观
  • 快照管理:关键时刻能快速回滚配置
  • 社区支持:遇到问题时Stack Overflow上的解决方案更多

小贴士:如果主机是Windows 10及以上系统,记得在BIOS中开启虚拟化技术(VT-x),否则安装时会遇到"此主机不支持Intel VT-x"的报错。

2. CentOS 7最小化安装的踩坑实录

从CentOS官网下载的Minimal ISO只有900MB左右,安装过程却暗藏玄机。我选择了英文界面(避免后续出现编码问题),分区方案采用自动配置,但有几个关键设置必须手动调整:

  1. 网络配置:安装时务必启用网络连接
  2. 软件选择:勾选"Development Tools"组
  3. 时区设置:选择Asia/Shanghai(即使UTC更规范)
  4. root密码:设置足够复杂但自己能记住的密码

安装完成后,第一件事就是更换yum源。阿里云的镜像速度最快:

sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
sudo yum makecache

3. Java环境配置的纠结之路

Hadoop对Java版本的要求很严格,2.7.x系列需要Java 7或8。我面临两个选择:

安装方式优点缺点
yum安装简单快捷版本不可控
手动安装版本精准配置复杂

最终选择了手动安装Oracle JDK 8u221,过程比想象中曲折:

  1. 从Oracle官网下载jdk-8u221-linux-x64.tar.gz
  2. 解压到/usr/local/java目录
  3. 配置环境变量时遇到了坑:
# 在~/.bashrc末尾添加
export JAVA_HOME=/usr/local/java/jdk1.8.0_221
export PATH=$PATH:$JAVA_HOME/bin

执行source ~/.bashrc后,java -version仍然显示旧版本。原来系统预装了OpenJDK,需要用alternatives切换:

sudo alternatives --config java

4. Hadoop伪分布式环境搭建

下载hadoop-2.7.7.tar.gz后,我将其解压到/usr/local/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:/usr/local/hadoop/dfs/name</value>
    </property>
</configuration>

最紧张的时刻莫过于执行hdfs namenode -format,看到"Storage directory /usr/local/hadoop/dfs/name has been successfully formatted"的提示才松了口气。

5. SSH免密登录的玄学问题

按照教程执行:

ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

但ssh localhost仍然要求输入密码。排查后发现是SELinux在作祟:

sudo setenforce 0  # 临时关闭
sudo vi /etc/selinux/config  # 永久设置为disabled

6. 第一个MapReduce程序的诞生

启动HDFS后,我决定用经典的WordCount来测试环境。过程比预想的顺利:

  1. 在HDFS上创建输入目录

    hdfs dfs -mkdir /input
    
  2. 上传测试文本

    hdfs dfs -put /path/to/local/text.txt /input
    
  3. 运行WordCount

    hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /input /output
    

当在浏览器中访问http://localhost:9870看到HDFS管理界面时,那种成就感难以言表。查看输出结果的那一刻,所有报错和调试的烦恼都烟消云散了。

更多推荐