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 资源。
- 启动 sshd 服务;若没有,自行安装。
$ systemctl start sshd
- 在主节点上创建 SSH 密钥。
$ ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
说明:
- 该命令会生成一个 RSA 密钥对,包括一个私钥和一个公钥。私钥用于对数据进行签名或解密,而公钥用于验证签名或加密数据。
-P ""
:实现 SSH 免密登录。-f ~/.ssh/id_rsa
:生成的授权密钥保存至id_rsa
文件。
- 将生成的 SSH 密钥复制到主节点的授权密钥中。
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
- 将主节点的 SSH 密钥复制到从节点的授权密钥。
$ ssh-copy-id -i ~/.ssh/id_rsa.pub user@remotehost
- 验证 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
- 下载 Hadoop(可执行的二进制发布包)
wget https://archive.apache.org/dist/hadoop/core/hadoop-3.3.6/hadoop-3.3.6.tar.gz
- 提取 Hadoop tar 文件到指定目录
/opt
tar -zxf hadoop-3.3.6.tar.gz -C /opt
- 编辑
/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 本地库路径。
- 验证 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 的行为。
指定 ResourceManager
和 NodeManager
进程的用户环境变量:
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 界面,可以查看活动节点的数量。
DataNode 节点信息显示页面:
浏览 HDFS 存储情况:
ResourceManager 节点访问
[[MapReduce 框架基础#ResourceManager 访问查询|ResourceManager 节点访问]]
MapReduce JobHistory Server 节点访问
[[MapReduce 框架基础#MapReduce 作业记录查询|MapReduce JobHistory Server 节点访问]]
参考
问题
问题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
问题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
中关于端口的配置项是否正确。