文章

Hadoop 集群部署

Hadoop 架构

Hadoop 是一个大数据平台框架,包括多个核心模块:

  • HDFS(分布式文件系统)
  • YARN(资源调度与管理框架)
  • MapReduce(计算框架)
  • 还有 Hive、HBase、Spark 等扩展组件

参考:[[Hadoop 集群架构]]

Hadoop 集群模式

Hadoop 是以 HDFS 作为底层存储系统,用于在分布式环境下存储数据。

Hadoop 有两种安装方式,即单节点多节点

单节点集群意味着只有一个 DataNode 在一台机器上运行并设置所有 NameNode、DataNode、ResourceManager 和 NodeManager。一般用于学习和测试目的。

多节点集群,有多个 DataNode 在运行,并且每个 DataNode 运行在不同的机器上。多节点集群在组织中实际用于分析大数据。

多节点集群

本例使用全分布式运行 Hadoop 多节点集群。

节点分布说明:

主机名 节点类型 节点说明
hadoop01 NameNode[NodeManager] NameNode 作为 HDFS 主节点,负责管理文件系统命名空间并调节客户端对文件的访问。
hadoop02 ResourceManager[NodeManager] ResourceManager 负责管理集群资源和调度任务。NodeManager 负责启动和监视。
hadoop03 DataNode[NodeManager] 充当工作节点,负责在 HDFS 中存储实际数据。
hadoop04 ProxyServer / MapReduce [NodeManager] 其他服务节点(例如 Web 应用程序代理服务器和 MapReduce 作业历史记录服务器)

Hadoop 安装配置

先决条件

准备环境

  • 4 台节点主机(或虚拟机环境如使用 VMware Workstation Pro)
  • Linux 操作系统 CentOS 7
  • CentOS 7 已默认安装 OpenJDK 1.8
  • SSH 服务
  • hadoop-3.3.6

如果 jps 命令不可用,安装 JDK 的开发工具包。

yum update
yum install java-1.8.0-openjdk-devel   # 如果使用的是 OpenJDK 1.8

说明:

  • 在 Hadoop 集群中,每个节点上都会运行多个 Java 进程来执行不同的 Hadoop 组件。
  • jps 命令用于列出 Java 虚拟机 (JVM) 上正在运行的 Java 进程,可以检查 Hadoop 节点进程是否成功启动。

节点设置主机名

检查多节点主机的 IP 地址(使用 ifconfig 命令)。

使用 hostnamectl 命令来设置新的主机名。如:

hostnamectl set-hostname hadoop01

在主机文件 /etc/hosts 中添加主节点和数据节点及其各自的 IP 地址映射关系。

192.168.83.130  hadoop01
192.168.83.131  hadoop02
192.168.83.132  hadoop03
192.168.83.133  hadoop04

注意:暂时禁用防火墙限制。所有主机使用同一套配置参数。

配置 SSH 可信访问

如果要使用可选的启动和停止脚本,可以安装 SSH。,并且在 Hadoop 集群中的每个节点上运行 sshd 服务进程,以便主节点通过 SSH 远程启动和管理从节点的 Hadoop 守护进程 。此外,建议还安装 pdsh 以更好地管理 SSH 资源。

  1. 启动 sshd 服务;若没有,自行安装。
$ systemctl start sshd
  1. 在主节点上创建 SSH 密钥。
$ ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa

说明:

  • 该命令会生成一个 RSA 密钥对,包括一个私钥和一个公钥。私钥用于对数据进行签名或解密,而公钥用于验证签名或加密数据。
  • -P "" :实现 SSH 免密登录。
  • -f ~/.ssh/id_rsa:生成的授权密钥保存至 id_rsa 文件。
  1. 将生成的 SSH 密钥复制到主节点的授权密钥中。
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
  1. 将主节点的 SSH 密钥复制到从节点的授权密钥。
$ ssh-copy-id -i ~/.ssh/id_rsa.pub user@remotehost
  1. 验证 SSH 连接远程主机。
$ ssh user@remotehost

示例:

[root@hadoop .ssh]# ssh root@192.168.83.130
Last login: Sun Apr 21 21:08:09 2024
[root@hadoop02 ~]# 

安装 Hadoop

  1. 下载 Hadoop(可执行的二进制发布包)
wget https://archive.apache.org/dist/hadoop/core/hadoop-3.3.6/hadoop-3.3.6.tar.gz
  1. 提取 Hadoop tar 文件到指定目录 /opt
tar -zxf hadoop-3.3.6.tar.gz -C /opt
  1. 编辑 /etc/profile 或用户根目录 .bashrc 文件
vim /etc/profile

设置 Hadoop 环境变量内容: ^bc49c1

# 配置 Hadoop 系统环境变量
export HADOOP_HOME=/opt/hadoop-3.3.6
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.libray.path=$HADOOP_HOME/lib"

export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

export CLASSPATH=$CLASSPATH:$HADOOP_HOME/share/hadoop/client/*:$HADOOP_HOME/share/hadoop/common/*:$HADOOP_HOME/share/hadoop/hdfs/*:$HADOOP_HOME/share/hadoop/mapreduce/*:$HADOOP_HOME/share/hadoop/yarn/*

说明:

  • $HADOOP_OPTS 环境变量属性值告诉 Java 虚拟机在加载本机库时应该搜索的 Hadoop 本地库路径。
  1. 验证 Hadoop 安装
hadoop version

编辑配置文件

编辑 Hadoop 配置文件。Hadoop 所有配置都位于 etc/hadoop 目录中,在给定配置文件中配置重要参数。

core-site.xml 文件

core-site.xml 文件通知 Hadoop 守护进程 NameNode 在集群中运行的位置。它包含 Hadoop 核心的配置设置。例如 HDFS 和 MapReduce 常见的 I/O 设置。

core-site.xml 核心配置:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
	<!-- 配置 NameNode URI。默认使用的端口号9000 -->
	<property>
		<name>fs.defaultFS</name>
		<value>hdfs://hadoop01:9000</value>
    </property>
    <!-- 配置 NameNode 的 RPC 地址 -->
    <property>
        <name>fs.default.name</name>
        <value>hdfs://hadoop01:8020</value>
    </property>

	<!--用于指定SequenceFiles中使用的读/写缓冲区的大小。-->
	<property>
		<name>io.file.buffer.size</name>
		<value>131072</value>
    </property>
    <!--定义了 Hadoop 临时目录的路径 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/local/hadoop/tmp</value>
    </property>

	<property>
         <name>dfs.webhdfs.enabled</name>
         <value>true</value>
	</property>
 
	<property>
		<name>hadoop.proxyuser.root.hosts</name>
        <value>*</value>
	</property>
	<property>
        <name>hadoop.proxyuser.root.groups</name>
        <value>*</value>
	</property>
</configuration>

说明:集群节点通信地址,一般可以根据地址格式使用主机名或 IP 地址。集群内主机在 Web 页面访问管理节点可以使用主机名或 IP 地址;集群外主机在 Web 页面访问集群节点只能使用 IP 地址。

hdfs-site.xml 文件

hdfs-site.xml 文件包含 HDFS 守护进程(即 NameNode、DataNode、Secondary NameNode)的配置设置。还包含 HDFS 的复制因子、块大小和权限检查等。

hdfs-site.xml 核心配置:

<configuration>
    <!-- 指定 NameNode 存储元数据的目录 -->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>
	        /var/local/hadoop/data/namenode/first, 
	        /var/local/hadoop/data/namenode/second
	    </value>
    </property>
    
    <!-- 指定 DataNode 存储数据块的目录 -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>
	        /var/local/hadoop/data/datanode/first,
	        /var/local/hadoop/data/datanode/second
        </value>
    </property>
    
    <!-- 指定 HDFS 副本数量 -->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    
    <!-- 配置 NameNode 的 RPC 地址。默认端口 8020 -->
    <property>
        <name>dfs.namenode.rpc-address</name>
        <value>hadoop01:8020</value>
    </property>

	<!-- 配置 DataNode 的地址 -->
    <property>
        <name>dfs.datanode.address</name>
        <value>0.0.0.0:50010</value>
    </property>
    
    <!-- 配置 DataNode 的 HTTP 地址 -->
    <property>
        <name>dfs.datanode.http.address</name>
        <value>0.0.0.0:50075</value>
    </property>
    
    <!-- 配置 DataNode 的 IPC 地址 -->
    <property>
        <name>dfs.datanode.ipc.address</name>
        <value>0.0.0.0:50020</value>
    </property>
    
    <!-- 启用 HDFS 权限 -->
    <property>
        <name>dfs.permissions.enabled</name>
        <value>true</value>
    </property>
</configuration>

说明:通常使用 0.0.0.0 表示监听所有网络接口上的连接。这意味着 DataNode 将接受来自任何网络接口的连接。

mapred-site.xml 文件

mapred-site.xml 文件包含 MapReduce 应用程序的配置设置,例如可以并行运行的 JVM 数量、映射器和减速器进程的大小、进程可用的 CPU 核心等。

mapred-site.xml 核心配置:

<configuration>
	<!-- MapReduce 应用程序相关参数 -->
	<property>
	  <!-- 指定 MapReduce 框架类型。在 YARN 上运行 MapReduce 作业 -->
	  <name>mapreduce.framework.name</name>
	  <value>yarn</value>
	</property>
	<property>
		<!-- 指定 MapReduce 应用程序的类路径。-->
		<!-- 默认包含安装目录 Hadoop 分发包中的相关 JAR 文件 -->
        <name>mapreduce.application.classpath</name>   
        <value>
	        $HADOOP_HOME/share/hadoop/client/*,
	        $HADOOP_HOME/share/hadoop/common/*,
            $HADOOP_HOME/share/hadoop/common/lib/*,
            $HADOOP_HOME/share/hadoop/hdfs/*,
            $HADOOP_HOME/share/hadoop/hdfs/lib/*,
            $HADOOP_HOME/share/hadoop/mapreduce/*,
            $HADOOP_HOME/share/hadoop/tools/lib/*,
            $HADOOP_HOME/share/hadoop/yarn/*,
            $HADOOP_HOME/share/hadoop/yarn/lib/*
        </value>
    </property>

	<!-- MapReduce JobHistory Server 相关参数 -->
    <property>
	  <!-- 指定 MapReduce JobHistory Server 监听的地址和端口 -->
      <name>mapreduce.jobhistory.address</name>
      <value>hadoop04:10020</value>
    </property>
    
    <property>
      <!-- 指定 MapReduce JobHistory Server Web 页面访问的地址和端口 -->
      <name>mapreduce.jobhistory.webapp.address</name>
      <value>hadoop04:19888</value>
    </property>

	<!-- MapReduce 作业历史记录的中间存储目录 -->
    <property>
        <name>mapreduce.jobhistory.intermediate-done-dir</name>
        <value>/tmp/mapred/history/intermediate</value>
    </property>

    <!-- MapReduce 作业历史记录的最终存储目录 -->
    <property>
        <name>mapreduce.jobhistory.done-dir</name>
        <value>/tmp/mapred/history/done</value>
    </property>
</configuration>

yarn-site.xml 文件

yarn-site.xml 文件包含 ResourceManager 和 NodeManager 的配置设置,如应用程序内存管理大小、程序和算法所需的操作等。

yarn-site.xml 核心配置:

<configuration>
	<!-- ResourceManager 的主机名或 IP 地址 -->
	<property>
	  <name>yarn.resourcemanager.hostname</name>
	  <value>hadoop02</value>
	</property>
	<!-- ResourceManager 的地址和端口,用于与客户端进行通信 -->
	<property>
	  <name>yarn.resourcemanager.address</name>
	  <value>hadoop02:8032</value>
	</property>
	<!-- ResourceManager 的调度器地址和端口。默认端口是 8030 -->
	<property>
	  <name>yarn.resourcemanager.scheduler.address</name>
	  <value>hadoop02:8030</value>
	</property>
	<!-- ResourceManager 提供 Web 页面的地址和端口。默认端口是 8088 -->
	<property>
	  <name>yarn.resourcemanager.webapp.address</name>
	  <value>hadoop02:8088</value>
	</property>
	<!-- NodeManager 存储本地数据的目录 -->
    <property>
	  <name>yarn.nodemanager.local-dirs</name>
	  <value>/var/local/hadoop/yarn.nodemanager.local</value>
	</property>
	<!-- NodeManager 存储日志文件的目录 -->
	<property>
	  <name>yarn.nodemanager.log-dirs</name>
	  <value>/var/local/hadoop/yarn.nodemanager.log</value>
	</property>
	<!-- 运行在 NodeManager 的辅助服务 -->
	<property>
	  <name>yarn.nodemanager.aux-services</name>
	  <value>mapreduce_shuffle</value>
	</property>
</configuration>

hadoop-env.sh 文件

etc/hadoop/hadoop-env.sh 文件用于设置 Hadoop 环境变量和其他属性。如 Java 主路径等。

# 设置 Java 安装根目录
export JAVA_HOME=/usr

说明:检查 Java 安装可执行文件的根目录:which java,例如:

# which java
/usr/bin/java

指定运行 HDFS 守护进程的用户环境变量配置:

export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root

注意:使用 root 用户运行 Hadoop 服务通常不是最佳实践,因为可能会带来安全性问题。在生产环境中配置专门的用户来运行 Hadoop 进程。

yarn-env.sh 文件

etc/hadoop/yarn-env.sh 文件是用来配置 YARN 环境的脚本文件。它允许您设置环境变量和其他属性,以控制 YARN 的行为。

指定 ResourceManagerNodeManager 进程的用户环境变量:

export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

workers 文件

etc/hadoop/workers 文件用于列出 Hadoop 集群中作为工作节点的机器的主机名或 IP 地址。每行一个主机名或 IP 地址。

localhost
hadoop01
hadoop02
hadoop03
hadoop04

说明:在所有节点复制 Hadoop 配置文件。

操作 Hadoop 集群

初始化 HDFS

通过 NameNode 初始化 HDFS(仅在主节点上),进入 Hadoop 主目录并格式化 NameNode。

hdfs namenode -format

注意:该命令仅在第一次执行。切勿后续重新格式化 Hadoop 文件系统,否则将丢失 HDFS 存储的所有数据。

启动节点

方式一:

在指定节点上以 hdfs 用户的身份启动 HDFS NameNode 守护进程:

hdfs --daemon start namenode

在指定节点上以 hdfs 用户的身份启动 DataNode 守护进程:

hdfs --daemon start datanode

在指定节点以 yarn 用户的身份启动 NodeManager 守护进程:

yarn --daemon start nodemanager

在指定节点以 yarn 用户的身份启动 ResourceManager 守护进程:

yarn --daemon start resourcemanager

若启动独立的 WebAppProxy 服务器。作为 yarn 在 WebAppProxy 服务器上运行。如果将多个服务器用于负载平衡,则应在每个服务器上运行它。

yarn --daemon start proxyserver

参考 Web 应用程序代理

在指定节点上启动 MapReduce History Server:

mapred --daemon start historyserver

方式二:

若配置了 SSH 免密远程登录,可以使用脚本启动停止相关进程。

启动所有守护进程(在主节点上):

$HADOOP_HOME/sbin/start-all.sh

示例:

[root@hadoop01 ~]# $HADOOP_HOME/sbin/start-all.sh
Starting namenodes on [hadoop01]
上一次登录:五 4月 26 18:37:26 CST 2024pts/0 上
Starting datanodes
上一次登录:五 4月 26 18:40:00 CST 2024pts/0 上
Starting secondary namenodes [hadoop01]
上一次登录:五 4月 26 18:40:02 CST 2024pts/0 上
Starting resourcemanager
上一次登录:五 4月 26 18:40:08 CST 2024pts/0 上
Starting nodemanagers
上一次登录:五 4月 26 18:40:15 CST 2024pts/0 上

启动所有 HDFS 进程:

$HADOOP_HOME/sbin/start-dfs.sh

启动所有 YARN 进程:

$HADOOP_HOME/sbin/start-yarn.sh

说明:通常在 Hadoop 集群的主节点上执行。主节点通常是 NameNode 和 ResourceManager 所在的节点。这两个命令用于启动 Hadoop 分布式文件系统(HDFS)和资源管理器(YARN)服务,这是 Hadoop 集群的核心组件。

检查节点状态

检查已启用的守护进程:

jps

关闭节点

方式一:

在指定的 ResourceManager 节点上停止 resourcemanager 进程:

yarn --daemon stop resourcemanager

说明:在节点上停止服务进程,将命令中的 start 替换成 stop

在指定节点上停止 historyserver 进程:

mapred --daemon stop historyserver

方式二:

使用如下程序脚本停止所有进程:

$HADOOP_HOME/sbin/stop-all.sh

示例:

[root@hadoop01 ~]# $HADOOP_HOME/sbin/stop-all.sh
Stopping namenodes on [hadoop01]
上一次登录:五 4月 26 18:40:17 CST 2024pts/0 上
Stopping datanodes
上一次登录:五 4月 26 18:42:09 CST 2024pts/0 上
Stopping secondary namenodes [hadoop01]
上一次登录:五 4月 26 18:42:10 CST 2024pts/0 上
Stopping nodemanagers
上一次登录:五 4月 26 18:42:13 CST 2024pts/0 上
hadoop01: WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
hadoop04: WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
hadoop02: WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
hadoop03: WARNING: nodemanager did not stop gracefully after 5 seconds: Trying to kill with kill -9
Stopping resourcemanager
上一次登录:五 4月 26 18:42:16 CST 2024pts/0 上

使用如下程序脚本停止所有 HDFS 进程:

$HADOOP_HOME/sbin/stop-hds.sh

使用如下程序脚本停止所有 YARN 进程:

$HADOOP_HOME/sbin/stop-yarn.sh

Web 界面访问

以下是 Hadoop 集群中常见守护进程的 Web 界面及其默认端口配置。每个守护进程都有一个 Web 界面用于监控和管理集群的状态。

Daemon Web Interface Notes
NameNode http://nn_host:port/ Default HTTP port is 9870.
ResourceManager http://rm_host:port/ Default HTTP port is 8088.
MapReduce JobHistory Server http://jhs_host:port/ Default HTTP port is 19888.

一旦 Hadoop 集群启动并运行,可以检查组件的 Web-UI。

NameNode 节点访问

浏览器访问 http://192.168.83.130:9870/dfshealth.html

在 NameNode 界面,可以查看活动节点的数量。 Pasted image 20240424123012.png

DataNode 节点信息显示页面: Pasted image 20240424123227.png

浏览 HDFS 存储情况: Pasted image 20240424123753.png

ResourceManager 节点访问

[[MapReduce 框架基础#ResourceManager 访问查询|ResourceManager 节点访问]]

MapReduce JobHistory Server 节点访问

[[MapReduce 框架基础#MapReduce 作业记录查询|MapReduce JobHistory Server 节点访问]]

参考

安装 Hadoop

Hadoop:设置单节点集群

Hadoop 集群设置

安装 Hadoop集群

问题

问题1. 启动集群节点报错:

hdfs --daemon start namenode
ERROR: Cannot set priority of namenode process 5081

解决:

  • 因为刚更新了配置,尝试 hdfs 格式化,发现节点配置文件格式有错误,定位修改即可。

问题2. 数据节点 datanode 启动后又自动退出,检查日志如 hadoop-root-datanode-hadoop01.log

ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering>

解决:可能的原因,NameNode 和 DataNode 集群 ID 不匹配:

  • hdfs-site.xml 中字段 dfs.namenode.name.dir 指定了 NameNode 节点存储数据块的目录;dfs.datanode.name.dir 指定了 DataNode 节点存储数据块的目录。
  • 确保 dfs.datanode.name.dir/current/VERSION 中的 clusterID 字段与$dfs.namenode.name.dir/current/VERSION 中的 clusterID 字段保持一致。
  • 或完全格式化 NameNode 节点,注意格式化 HDFS 系统存储的数据会全部丢失:
hdfs namenode -format

参考:https://stackoverflow.com/questions/33987253/initialization-failed-for-block-pool-registering-datanode-uuid-unassigned

问题3. 数据节点 datanode 启动失败,检查日志:

2024-04-22 08:17:59,220 WARN org.apache.hadoop.hdfs.server.common.Storage: Failed to add storage directory [DISK]file:/var/local/hadoop/data/datanode/first
org.apache.hadoop.hdfs.server.common.IncorrectVersionException: Unexpected version of storage directory /var/local/hadoop/data/datanode/first. Reported: -66. Expecting = -57.

解决:尝试删除 DataNode 数据库目录,如日志中的 /var/local/hadoop/data/datanode/**first** ,然后重新启动 DataNode 节点。

问题4. historyserver 服务启动失败,检查日志 logs/hadoop-root-historyserver-hadoop.log

Caused by: java.net.BindException: Port in use: hadoop4:19888
	at org.apache.hadoop.http.HttpServer2.constructBindException(HttpServer2.java:1369)
	at org.apache.hadoop.http.HttpServer2.bindForSinglePort(HttpServer2.java:1391)
	at org.apache.hadoop.http.HttpServer2.openListeners(HttpServer2.java:1454)
	at org.apache.hadoop.http.HttpServer2.start(HttpServer2.java:1300)
	at org.apache.hadoop.yarn.webapp.WebApps$Builder.start(WebApps.java:472)
	... 9 more
Caused by: java.io.IOException: Failed to bind to hadoop4:19888
	at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:349)
	at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:310)
	at org.apache.hadoop.http.HttpServer2.bindListener(HttpServer2.java:1356)
	at org.apache.hadoop.http.HttpServer2.bindForSinglePort(HttpServer2.java:1387)
	... 12 more
Caused by: java.net.SocketException: Unresolved address
	at sun.nio.ch.Net.translateToSocketException(Net.java:134)
	at sun.nio.ch.Net.translateException(Net.java:160)
	at sun.nio.ch.Net.translateException(Net.java:166)
	at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:87)
	at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:344)
	... 15 more
Caused by: java.nio.channels.UnresolvedAddressException
	at sun.nio.ch.Net.checkAddress(Net.java:104)
	at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:217)
	at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:85)
	... 16 more
2024-04-25 05:11:27,643 INFO org.apache.hadoop.service.AbstractService: Service org.apache.hadoop.mapreduce.v2.hs.JobHistoryServer failed in state STARTED
org.apache.hadoop.yarn.webapp.WebAppException: Error starting http server

分析解决:从日志看,绑定端口失败,首先,netstat 命令检查端口是否占用,若未占用,检查 mapred-site.xml 中关于端口的配置项是否正确。

本文由作者按照 CC BY 4.0 进行授权。