基于VMware与CentOS 7的Hadoop集群部署全景指南

前言

本文档旨在提供一个全面、细致的Hadoop部署教程,覆盖从基础环境准备到Hadoop伪分布式集群成功运行的每一个环节。内容严格遵循新手友好的原则,对每一步操作、每一条命令以及可能遇到的问题进行深入剖析,确保初学者能够顺利完成部署。整个过程将在VMware Workstation Pro虚拟机环境中,使用CentOS 7.9操作系统进行。

第一章:基础环境搭建------虚拟机与操作系统的准备

部署任何复杂的系统,一个稳定可靠的基础环境是成功的基石。本章将详细介绍如何准备用于Hadoop集群的虚拟机环境,包括VMware的配置和CentOS 7操作系统的安装。

1.1 系统镜像下载

首先,需要获取CentOS 7.9的ISO镜像文件,这是我们将要安装在虚拟机中的操作系统。可以通过访问CentOS的官方归档库来下载。

访问链接:CentOs 7.9 归档库

在该页面中,找到并点击名为CentOS-7-x86_64-DVD-2009.iso的文件进行下载。这个DVD版本包含了完整的软件包,便于后续安装。

1.2 创建新的VMware虚拟机

下载完ISO镜像后,打开VMware Workstation Pro,开始创建新的虚拟机。

  1. 在VMware主界面,点击"创建新的虚拟机"按钮,启动新建虚拟机向导。

  2. 向导类型选择"典型"即可,点击"下一步"。

  3. 在虚拟机硬件兼容性选择界面,保持默认的Workstation 16.2.x或更高版本。这确保了较好的硬件支持和性能。点击"下一步"。

  4. 在"安装来源"步骤,选择"安装程序光盘映像文件(iso)",然后点击"浏览",定位到刚刚下载的CentOS-7-x86_64-DVD-2009.iso文件。

  5. 选择镜像文件后,VMware会识别出操作系统类型。点击"下一步"。

  6. 进入"简易安装信息"界面。这里可以预设一个用户账户和密码,VMware会在安装过程中自动创建。为了方便管理,可以设置一个容易记忆的用户名和密码。

  7. 为虚拟机命名并选择存储位置。强烈建议将虚拟机文件存储在非系统盘(如D盘),以避免占用C盘空间,影响宿主机性能。

1.3 配置虚拟机硬件资源

硬件资源的分配直接影响虚拟机的运行效率,特别是对于Hadoop这样需要消耗较多计算和内存资源的系统。

  1. 处理器配置:根据宿主机性能,为虚拟机分配处理器核心。这里分配了4个处理器核心,这对于单节点的Hadoop学习环境是比较充足的配置。点击"下一步"。

  2. 内存配置:为虚拟机分配内存。这里设置为8GB。Hadoop的各个组件,尤其是NameNode和ResourceManager,对内存有一定要求,8GB可以保证伪分布式模式的流畅运行。

  3. 网络类型:选择"使用网络地址转换(NAT)"。NAT模式可以让虚拟机通过宿主机共享网络访问外部互联网,同时在宿主机内部形成一个独立的局域网,配置简单,是初学者的首选。

  4. I/O控制器类型:保持默认的"LSI Logic (推荐)"。

  5. 磁盘类型:保持默认的"SCSI (推荐)"。

  6. 创建新虚拟磁盘:选择"创建新虚拟磁盘",因为这是一台全新的虚拟机。

  7. 磁盘容量:指定磁盘大小为30GB,并选择"将虚拟磁盘拆分成多个文件"。30GB对于安装操作系统、JDK、Hadoop以及存储少量测试数据是足够的。拆分文件有助于在不同文件系统的磁盘间移动虚拟机。

  8. 磁盘文件位置:保持默认即可,点击"下一步"。

  9. 完成创建:最后,向导会展示所有配置的摘要。如果需要调整,可以点击"自定义硬件"。确认无误后,点击"完成"。

1.4 启动虚拟机并安装CentOS 7

创建完成后,在VMware主界面选中新创建的虚拟机,点击"开启此虚拟机"。

虚拟机会从之前加载的ISO镜像文件启动,并自动开始CentOS 7的安装过程。这个过程是自动化的,因为它使用了VMware的简易安装功能。

安装过程会持续一段时间,包括分区、软件包安装和基本配置。

安装完成后,系统会自动重启并进入登录界面。点击之前设置的用户名,输入密码即可登录到CentOS 7的桌面环境。

至此,基础的虚拟机和操作系统环境已经准备就绪。

第二章:系统基础配置

在安装Hadoop之前,需要对新安装的CentOS 7系统进行一些基础配置,以确保后续操作的顺利进行。

2.1 网络连通性测试

首先,打开终端,测试网络是否正常。ping是一个检查网络连通性的基本命令。

bash 复制代码
ping www.baidu.com

如果能看到来自目标地址的连续响应,说明虚拟机已经可以正常访问互联网。

2.2 关闭防火墙

在学习和开发环境中,为了避免Hadoop各组件之间的端口通信被阻止,通常会选择关闭防火墙。在生产环境中,则需要配置精确的防火墙规则。

执行以下命令来停止并永久禁用firewalld服务:

bash 复制代码
# 停止当前运行的防火墙服务
sudo systemctl stop firewalld 
# 禁止防火墙服务开机自启
sudo systemctl disable firewalld

sudo命令用于以管理员权限执行操作。执行时,系统会提示输入当前用户的密码。

2.3 配置SSH免密登录

Hadoop集群的管理脚本(如start-dfs.sh)需要通过SSH来启动和停止各个节点上的服务进程。即使是在伪分布式模式下(所有进程运行在同一台机器上),Hadoop也需要能够免密SSH登录到localhost

  1. 生成密钥对 :使用ssh-keygen命令生成RSA类型的密钥对(一个公钥id_rsa.pub,一个私钥id_rsa)。

    bash 复制代码
    # -t rsa 指定密钥类型为RSA
    # -P '' 指定私钥的密码为空,实现免密
    # -f ~/.ssh/id_rsa 指定密钥文件的存放位置
    ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

    在执行过程中,连续按回车键接受所有默认设置。

  2. 授权公钥 :将生成的公钥内容追加到authorized_keys文件中。这个文件记录了所有被允许通过密钥免密登录到本机的公钥。

    bash 复制代码
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
  3. 设置权限authorized_keys文件对权限有严格要求,必须确保只有文件所有者有读写权限,否则SSH服务会拒绝使用它。

    bash 复制代码
    chmod 0600 ~/.ssh/authorized_keys
  4. 测试免密登录:尝试SSH登录到本机。

    bash 复制代码
    ssh localhost

    第一次连接时,系统会询问是否信任该主机的指纹,输入yes并回车。如果之后没有提示输入密码就直接成功登录,说明免密配置成功。

    测试成功后,输入exit命令退回到原来的会话。

第三章:核心依赖安装与问题排查------JDK

Hadoop是基于Java开发的,因此必须安装Java Development Kit (JDK)。这里选择稳定且广泛兼容的OpenJDK 8。

3.1 首次尝试安装JDK与权限问题

使用yum包管理器来安装JDK。

bash 复制代码
# -y 选项表示对所有提示自动回答yes
sudo yum install -y java-1.8.0-openjdk-devel

执行后,遇到了权限问题,提示当前用户不在sudoers文件中。这意味着该用户没有被授权使用sudo命令。

3.2 解决sudo权限问题

要解决此问题,需要编辑/etc/sudoers文件,为当前用户授予sudo权限。直接编辑此文件风险很高,推荐使用visudo命令,它会在保存时检查文件语法,防止配置错误导致系统无法使用sudo

  1. 切换到root用户,因为只有root用户有权限修改sudoers文件。

    bash 复制代码
    su - root

    输入root用户的密码进行切换。

  2. 执行visudo命令。

    bash 复制代码
    visudo
  3. 在打开的编辑界面中,找到root ALL=(ALL) ALL这一行,在它的下方添加一行,格式如下:

    bash 复制代码
    # 将 "name" 替换为实际的用户名
    name ALL=(ALL:ALL) ALL
  4. 按下Esc键退出插入模式,然后输入:wq并回车,保存并退出。之后可以执行exit退回到普通用户。

3.3 再次尝试安装与网络DNS问题

回到普通用户终端,重新执行JDK安装命令。

bash 复制代码
sudo yum install -y java-1.8.0-openjdk-devel

这次虽然sudo权限问题解决了,但出现了新的报错:"Could not resolve host: mirrors.cloud.aliyuncs.com"。这表明系统无法解析域名,是典型的DNS配置问题。

3.4 配置DNS服务器

为了让系统能够将域名转换为IP地址,需要配置一个可用的DNS服务器。在CentOS 7中,推荐使用nmtui(NetworkManager Text User Interface)这个文本图形化工具来管理网络配置,这样可以避免配置被系统重启覆盖。

  1. 在终端输入sudo nmtui启动工具。

    bash 复制代码
    sudo nmtui
  2. nmtui界面中,使用方向键选择"Edit a connection",然后按回车。

  3. 选择当前正在使用的网络连接(通常名为ens33),然后移动到右侧的<Edit...>并按回车。

  4. 在编辑界面中,找到"IPv4 CONFIGURATION",将光标移动到右侧的<Show>并按回车,展开详细配置。找到"DNS servers"一项,在<Add...>处按回车,输入一个公共DNS服务器地址,例如114.114.114.114。可以添加多个作为备用,如8.8.8.8223.5.5.5

    配置完成后的效果如下图所示。

  5. 配置完成后,一直用方向键移动到底部,选择<OK>并按回车保存。然后选择Quit退出nmtui

  6. 重启网络服务:为了让新的DNS配置立即生效,需要重启NetworkManager服务。

    bash 复制代码
    sudo systemctl restart NetworkManager
  7. 验证DNS配置 :查看/etc/resolv.conf文件,确认其中包含了刚才配置的DNS服务器地址。

    bash 复制代码
    cat /etc/resolv.conf
3.5 优化软件源并成功安装JDK

在解决网络问题的基础上,为了提高软件包的下载速度,可以将yum的默认源更换为国内的镜像源,例如阿里云或清华大学的镜像源。

  1. 备份默认源

    bash 复制代码
    sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
  2. 下载新的源文件 (这里使用阿里云的源):

    bash 复制代码
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  3. 清理并生成新缓存

    bash 复制代码
    sudo yum clean all
    sudo yum makecache

现在,所有准备工作都已完成。再次执行JDK安装命令:

bash 复制代码
sudo yum install -y java-1.8.0-openjdk-devel

这次,yum命令成功执行,完成了JDK的下载和安装。

最后,验证JDK是否安装成功:

bash 复制代码
java -version

如果命令输出了OpenJDK的版本信息,说明Java环境已正确安装。

第四章:Hadoop安装与伪分布式配置

Java环境就绪后,可以开始安装和配置Hadoop。本章将以Hadoop 3.3.6为例,配置一个伪分布式集群。

4.1 下载并解压Hadoop
  1. 下载Hadoop:从官方源下载Hadoop速度可能较慢,可以切换到国内镜像源(如阿里云)来加速下载。

    bash 复制代码
    # 官方源(可能较慢)
    # wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
    
    # 使用阿里云镜像源
    wget https://mirrors.aliyun.com/apache/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
  2. 解压Hadoop :将下载的压缩包解压到/usr/local目录下。/usr/local是通常用于存放用户自行安装的软件的地方。

    bash 复制代码
    # -z: 处理gzip压缩
    # -x: 解压
    # -v: 显示过程
    # -f: 指定文件
    # -C: 指定解压目录
    sudo tar -zxvf hadoop-3.3.6.tar.gz -C /usr/local/
  3. 重命名目录 :为了方便后续配置和引用,将带有版本号的目录名hadoop-3.3.6重命名为hadoop

    bash 复制代码
    cd /usr/local/
    sudo mv hadoop-3.3.6/ hadoop
4.2 配置Hadoop环境变量

为了能在任何路径下直接使用hadoophdfs等命令,需要将Hadoop的binsbin目录添加到系统的PATH环境变量中。

  1. 编辑系统全局配置文件/etc/profile

    bash 复制代码
    sudo vi /etc/profile
  2. 在文件末尾添加以下内容:

    bash 复制代码
    export HADOOP_HOME=/usr/local/hadoop
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  3. 保存退出后,执行source命令使配置立即生效。

    bash 复制代码
    source /etc/profile
4.3 修改Hadoop核心配置文件

Hadoop的行为由一系列XML配置文件控制,这些文件位于$HADOOP_HOME/etc/hadoop目录中。

进入该目录:

bash 复制代码
cd /usr/local/hadoop/etc/hadoop/
  1. 配置 hadoop-env.sh : 这个脚本用于设置Hadoop运行时的环境变量,最重要的是指定JAVA_HOME

    bash 复制代码
    sudo vi hadoop-env.sh

    在文件中添加(或修改)JAVA_HOME的设置,指向之前安装的OpenJDK路径。

    bash 复制代码
    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk

    注意:这里的路径可能需要根据实际安装情况调整,后续排错环节会展示如何找到精确路径。

  2. 配置 core-site.xml: 这是Hadoop的核心配置文件,用于定义HDFS的地址和端口。

    bash 复制代码
    sudo vi core-site.xml

    <configuration>标签内添加:

    xml 复制代码
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>

    这指定了HDFS NameNode的RPC地址为localhost9000端口。

  3. 配置 hdfs-site.xml: 这个文件用于配置HDFS的具体参数。

    bash 复制代码
    sudo vi hdfs-site.xml

    <configuration>标签内添加:

    xml 复制代码
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>

    dfs.replication指定了HDFS中文件的副本数量。在伪分布式(单机)模式下,只有一个数据节点,所以副本数必须设置为1。

第五章:启动集群与问题排查

配置完成后,可以尝试启动Hadoop集群。这个过程常常会遇到一些典型问题,本章将一一解决。

5.1 首次启动尝试与用户问题
  1. 格式化NameNode :这是启动HDFS前的初始化步骤,它会创建文件系统的元数据存储结构。此操作只在第一次启动前执行,否则会清空HDFS上的所有数据。

    bash 复制代码
    hdfs namenode -format
  2. 启动HDFS和YARN

    bash 复制代码
    start-dfs.sh
    start-yarn.sh

    执行后,出现报错。日志提示不允许以root用户启动NameNode和DataNode。这是Hadoop的一项安全措施,避免以最高权限用户运行服务。

5.2 解决root用户启动问题

解决方案是创建一个专门用于运行Hadoop服务的普通用户,并通过配置告知Hadoop使用该用户。

  1. 创建hadoop用户

    bash 复制代码
    sudo useradd hadoop
    sudo passwd hadoop

    根据提示为新用户hadoop设置密码。

  2. 修改 hadoop-env.sh :再次编辑hadoop-env.sh,添加环境变量来指定运行HDFS和YARN各组件的用户。

    bash 复制代码
    sudo vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh

    在文件末尾添加:

    bash 复制代码
    export HDFS_NAMENODE_USER="hadoop"
    export HDFS_DATANODE_USER="hadoop"
    export HDFS_SECONDARYNAMENODE_USER="hadoop"
    export YARN_RESOURCEMANAGER_USER="hadoop"
    export YARN_NODEMANAGER_USER="hadoop"
5.3 切换用户后的JAVA_HOME路径问题

切换到hadoop用户,并重新尝试格式化NameNode。

bash 复制代码
su hadoop
hdfs namenode -format

此时出现新的错误:Error: JAVA_HOME is not set and could not be found. 这表明hadoop-env.sh中配置的JAVA_HOME路径不正确或不完整。

  1. 查找精确的JDK路径yum安装的OpenJDK路径通常带有详细的版本号。使用find命令查找精确路径。

    bash 复制代码
    # 需要在root或有sudo权限的用户下执行
    find /usr/lib/jvm -name java-1.8.0-openjdk*
  2. 修正 hadoop-env.sh :切换回有sudo权限的用户(或root),编辑hadoop-env.sh,将JAVA_HOME的值更新为find命令找到的完整路径。

    bash 复制代码
    # 示例路径,应替换为实际找到的路径
    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64
5.4 日志目录权限问题

修正JAVA_HOME后,再次切换到hadoop用户并执行格式化,可能还会遇到权限错误,提示无法创建日志目录。这是因为/usr/local/hadoop目录的所有者是root,而hadoop用户没有写入权限。

解决方案是将整个Hadoop安装目录的所有权变更为hadoop用户

bash 复制代码
# 在root或有sudo权限的用户下执行
sudo chown -R hadoop:hadoop /usr/local/hadoop

(注:原文中只修改了logs目录权限,但修改整个目录的所有权是更彻底、更标准的做法,可以避免后续其他权限问题)

5.5 成功启动并验证集群

所有问题解决后,进行最后的操作。

  1. hadoop用户重新格式化NameNode

    bash 复制代码
    su hadoop
    hdfs namenode -format

    在提示Re-format filesystem? (Y or N)时输入Y并回车。

    看到successfully formattedExiting with status 0表示格式化成功。

  2. 启动HDFS和YARN服务 (确保当前是hadoop用户):

    bash 复制代码
    start-dfs.sh
    bash 复制代码
    start-yarn.sh
  3. 验证服务进程 :使用jps命令可以查看Java进程,如果看到NameNode, DataNode, SecondaryNameNode, ResourceManager, NodeManager等进程,说明集群已成功启动。

  4. 命令行验证 :通过hdfs dfs命令与HDFS进行交互,测试文件系统的可用性。

    • 在HDFS上创建一个目录:hdfs dfs -mkdir /test

    • 在本地创建一个测试文件:echo "Hello Hadoop" > test.txt

    • 将本地文件上传到HDFS:hdfs dfs -put test.txt /test

    • 查看HDFS上的文件列表和内容:

      bash 复制代码
      hdfs dfs -ls /test
      hdfs dfs -cat /test/test.txt

    成功显示文件内容,证明HDFS功能正常。

  5. Web UI验证:Hadoop提供了Web界面来监控集群状态。

    • HDFS NameNode Web UI : http://<虚拟机的IP地址>:9870
    • YARN ResourceManager Web UI : http://<虚拟机的IP地址>:8088

    在虚拟机的火狐浏览器中访问http://localhost:9870http://localhost:8088

    看到这两个Web界面正常显示,标志着Hadoop伪分布式集群已成功部署并处于可用状态。

第六章:Hadoop核心概念与后续步骤
6.1 Hadoop核心构成

Hadoop是一个用于分布式存储和分布式处理大规模数据集的开源框架。它主要解决两个核心问题:

  1. 海量数据存储(Storage Problem): 当数据量超过单台计算机的存储能力时,需要一种能够横向扩展的存储方案。Hadoop通过其**HDFS(Hadoop Distributed File System)**组件解决了这个问题。HDFS将大文件切分成数据块(Block),并将这些块的多个副本存储在集群的不同机器上,提供了高容错性和高吞吐量的数据访问。
  2. 海量数据计算(Computation Problem) : 对存储在多台机器上的海量数据进行分析计算,效率低下。Hadoop通过其MapReduce计算模型和**YARN(Yet Another Resource Negotiator)**资源管理框架解决了这个问题。YARN负责集群资源的调度和管理,而MapReduce(或其他计算框架如Spark、Flink)则是在YARN之上运行的分布式计算程序,实现了"计算向数据移动",大大提高了处理效率。
6.2 准备实际应用:MovieLens数据集

为了进行实际的数据分析任务,可以准备一个公开的数据集,例如MovieLens。

  1. 重新启动Hadoop(如果已关闭):

    bash 复制代码
    # 确保是hadoop用户
    start-dfs.sh 
    start-yarn.sh
  2. 下载并解压数据集 :这里使用ml-latest-small版本,它包含约10万条电影评分数据,非常适合入门练习。

    bash 复制代码
    wget https://files.grouplens.org/datasets/movielens/ml-latest-small.zip
    unzip ml-latest-small.zip
    cd ml-latest-small

    下载并解压后,主要会用到movies.csv(电影信息)和ratings.csv(评分信息)这两个文件。后续的数据分析任务,例如编写MapReduce程序来统计电影平均分,就可以基于这些数据展开。首先需要将这些数据文件通过hdfs dfs -put命令上传到HDFS中,然后便可以启动计算任务。

总结

通过以上六个章节的详细步骤,一个功能完备的Hadoop伪分布式环境已经成功搭建在VMware虚拟机中。这个过程不仅涵盖了从零开始的每一步操作,还深入探讨了权限配置、网络DNS、环境变量设置等环节中常见的错误及其排查方法。这个稳定运行的Hadoop环境,为后续学习MapReduce编程、HDFS操作以及探索更复杂的Hadoop生态系统组件打下了坚实的基础。

相关推荐
硬核子牙3 小时前
存储核心:EXT文件系统
linux
isaki1373 小时前
arm day1
linux·运维·arm开发
正午阳光下3 小时前
LINUX下好用的图形化界面串口助手cutecom
linux·cutecom
Dovis(誓平步青云)3 小时前
《场景化落地:用 Linux 共享内存解决进程间高效数据传输问题(终篇)》
linux·运维·服务器
LCG元3 小时前
实战:打造你的专属 Linux 工作环境(Oh My Zsh + 插件推荐)
linux
java_logo3 小时前
PERL Docker 容器化部署指南
linux·运维·docker·容器·eureka·centos·perl
敲上瘾3 小时前
C++ ODB ORM 完全指南:从入门到实战应用
linux·数据库·c++·oracle·db
一直向钱3 小时前
Ubuntu 服务器的无法使用WinSCP低版本连接登录
linux·服务器·ubuntu
歪歪1004 小时前
解决多 Linux 客户端向 Windows 服务端的文件上传、持久化与生命周期管理问题
linux·运维·服务器·开发语言·前端·数据库·windows