Deployment of Hadoop
Download of hadoop
cd /export/software
wget -P /export/software/ https://repo.huaweicloud.com/apache/hadoop/common/hadoop-3.4.0/hadoop-3.4.0.tar.gz
Decompress the compressed package
tar -zxvf /export/software/hadoop-3.4.0.tar.gz -C /export/servers/
cd /export/servers
mv /export/servers/hadoop-3.4.0 /export/servers/hadoop
Configuration of hadoop
Modify hadoop configuration file
cd /export/servers/hadoop/etc/hadoop
Modify hadoop-env.sh
sudo vim /export/servers/hadoop/etc/hadoop/hadoop-env.sh
add the following
export JAVA_HOME=/export/servers/jdk
Modify core-site.xml file
sudo vim /export/servers/hadoop/etc/hadoop/core-site.xml
Add the following configurations to the<configuration> tab (strictly indented, at the same level as the original configuration)
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
<description>HDFS默认文件系统URI</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/export/servers/hadoop/tmp</value>
<description>Hadoop临时目录</description>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
<description>ZooKeeper仲裁地址,用于自动故障转移</description>
</property>
<!-- IO配置优化 -->
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
<description>读写缓冲区大小</description>
</property>Modify hdfs-site.xml file
sudo vim /export/servers/hadoop/etc/hadoop/hdfs-site.xml
Add the following configurations to the<configuration> tab (strictly indented, at the same level as the original configuration)
<!-- ========== 基本HDFS配置 ========== -->
<property>
<name>dfs.replication</name>
<value>3</value>
<description>数据块副本数量,建议与DataNode数量匹配</description>
</property>
<!-- ========== 存储目录配置 ========== -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///export/data/hadoop/hdfs/name</value>
<description>NameNode元数据存储目录</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///export/data/hadoop/hdfs/data</value>
<description>DataNode数据块存储目录</description>
</property>
<!-- ========== HA 高可用配置 ========== -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
<description>HDFS命名服务逻辑名称</description>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2,nn3</value>
<description>NameNode逻辑标识列表</description>
</property>
<!-- NameNode RPC地址配置 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop02:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn3</name>
<value>hadoop03:8020</value>
</property>
<!-- NameNode HTTP地址配置 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>0.0.0.0:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>0.0.0.0:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn3</name>
<value>0.0.0.0:9870</value>
</property>
<!-- JournalNode集群配置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/mycluster</value>
<description>JournalNode仲裁地址,用于NameNode元数据同步</description>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/export/servers/hadoop/journalnode</value>
<description>JournalNode编辑日志存储目录</description>
</property>
<!-- 故障转移配置 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
<description>故障转移代理提供者类</description>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
<description>启用自动故障转移</description>
</property>
<!-- 故障防护配置 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<description>故障防护方法,防止脑裂</description>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadooper/.ssh/id_rsa</value>
<description>SSH防护使用的私钥文件</description>
</property>
<!-- ========== 性能优化配置 ========== -->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
<description>HDFS块大小,默认128MB</description>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
<description>NameNode处理线程数</description>
</property>
<!-- ========== Web UI 安全配置 ========== -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
<description>启用WebHDFS REST API</description>
</property>Modify mapred-site.xml file
sudo cp /export/servers/hadoop/etc/hadoop/mapred-site.xml /export/servers/hadoop/etc/hadoop/mapred-site.xml.template
sudo vim /export/servers/hadoop/etc/hadoop/mapred-site.xml
Add the following configurations to the<configuration> tab (strictly indented, at the same level as the original configuration)
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
Modify yarn-site.xml file
sudo vim /export/servers/hadoop/etc/hadoop/yarn-site.xml
Add the following configurations to the<configuration> tab (strictly indented, at the same level as the original configuration)
<!-- ========== ResourceManager 核心配置 ========== -->
<!-- 指定ResourceManager运行的主机 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
<description>ResourceManager运行的主机名,通常设置为主节点</description>
</property>
<!-- ResourceManager Web UI地址,设置为0.0.0.0允许外部访问 -->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>0.0.0.0:8088</value>
<description>ResourceManager的Web界面地址,用于监控和管理集群</description>
</property>
<!-- ResourceManager对客户端服务的地址 -->
<property>
<name>yarn.resourcemanager.address</name>
<value>0.0.0.0:8032</value>
<description>客户端提交应用程序和查询应用程序状态的RPC地址</description>
</property>
<!-- ResourceManager调度器地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>0.0.0.0:8030</value>
<description>ApplicationMaster与调度器通信以请求资源的地址</description>
</property>
<!-- ResourceManager资源追踪器地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>0.0.0.0:8031</value>
<description>NodeManager向ResourceManager注册和发送心跳的地址</description>
</property>
<!-- ========== NodeManager 核心配置 ========== -->
<!-- NodeManager的辅助服务,必须设置为mapreduce_shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>NodeManager的辅助服务列表,mapreduce_shuffle是MapReduce必需的</description>
</property>
<!-- 指定shuffle处理的类 -->
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
<description>shuffle服务的实现类</description>
</property>
<!-- ========== 资源管理配置 ========== -->
<!-- NodeManager可用的物理内存资源 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
<description>NodeManager可分配给容器的物理内存总量(MB)</description>
</property>
<!-- NodeManager可用的CPU核心数 -->
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
<description>NodeManager可分配给容器的虚拟CPU核心数</description>
</property>
<!-- 单个容器可申请的最小内存 -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
<description>调度器分配给每个容器请求的最小内存(MB)</description>
</property>
<!-- 单个容器可申请的最大内存 -->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
<description>调度器分配给每个容器请求的最大内存(MB)</description>
</property>
<!-- ========== 日志聚合配置 ========== -->
<!-- 启用日志聚合功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
<description>是否启用日志聚合,启用后容器日志会汇总到HDFS</description>
</property>
<!-- 日志在HDFS中的保留时间 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>2592000</value>
<description>聚合日志在HDFS中的保留时间(秒),默认30天</description>
</property>
<!-- ========== NodeManager Web UI配置 ========== -->
<!-- NodeManager Web UI地址 -->
<property>
<name>yarn.nodemanager.webapp.address</name>
<value>0.0.0.0:8042</value>
<description>NodeManager的Web界面地址</description>
</property>
<!-- 远程日志目录 -->
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/tmp/logs</value>
<description>应用程序日志在HDFS中的存储目录</description>
</property>Modify workers file
sudo vim /export/servers/hadoop/etc/hadoop/workers
Change to the following
hadoop01
hadoop02
hadoop03
Distribution of hadoop
Configure hadoop environment variables
Configure three server hadoop system environment variables separately
sudo bash -c 'cat >> /etc/profile << "EOF"
export HADOOP_HOME=/export/servers/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
EOF'
ssh hadoop02 "sudo tee -a /etc/profile << 'EOF'
export HADOOP_HOME=/export/servers/hadoop
export PATH=\$PATH:/export/servers/hadoop/bin:/export/servers/hadoop/sbin
EOF"
ssh hadoop03 "sudo tee -a /etc/profile << 'EOF'
export HADOOP_HOME=/export/servers/hadoop
export PATH=\$PATH:/export/servers/hadoop/bin:/export/servers/hadoop/sbin
EOF"Distribute hadoop profiles
scp -r /export/servers/hadoop hadoop02:/tmp/
ssh hadoop02 "sudo cp -r /tmp/hadoop/ /export/servers/ && sudo rm -rf /tmp/hadoop"
scp -r /export/servers/hadoop hadoop03:/tmp/
ssh hadoop03 "sudo cp -r /tmp/hadoop/ /export/servers/ && sudo rm -rf /tmp/hadoop"
Verify that hadoop was successfully installed
source /etc/profile
hadoop version
ssh hadoop02 "bash -c 'source /etc/profile && hadoop version'"
ssh hadoop03 "bash -c 'source /etc/profile && hadoop version'"
Operation of hadoop
Changes to hadoop running environment variables
sudo bash -c 'cat >> /etc/profile << EOF
# Hadoop环境变量配置
# 配置HDFS相关进程的运行用户
export HDFS_NAMENODE_USER=hadooper
export HDFS_DATANODE_USER=hadooper
export HDFS_SECONDARYNAMENODE_USER=hadooper
# 配置YARN相关进程的运行用户
export YARN_RESOURCEMANAGER_USER=hadooper
export YARN_NODEMANAGER_USER=hadooper
EOF'
ssh hadoop02 "sudo bash -c 'cat >> /etc/profile << \"EOF\"
# Hadoop环境变量配置
# 配置HDFS相关进程的运行用户
export HDFS_NAMENODE_USER=hadooper
export HDFS_DATANODE_USER=hadooper
export HDFS_SECONDARYNAMENODE_USER=hadooper
# 配置YARN相关进程的运行用户
export YARN_RESOURCEMANAGER_USER=hadooper
export YARN_NODEMANAGER_USER=hadooper
EOF'"
ssh hadoop03 "sudo bash -c 'cat >> /etc/profile << \"EOF\"
# Hadoop环境变量配置
# 配置HDFS相关进程的运行用户
export HDFS_NAMENODE_USER=hadooper
export HDFS_DATANODE_USER=hadooper
export HDFS_SECONDARYNAMENODE_USER=hadooper
# 配置YARN相关进程的运行用户
export YARN_RESOURCEMANAGER_USER=hadooper
export YARN_NODEMANAGER_USER=hadooper
EOF'"Reload environment variables
source /etc/profile
ssh hadoop02 "bash -c 'source /etc/profile'"
ssh hadoop03 "bash -c 'source /etc/profile'"
The final environment variable configuration is as follows

Launched hadoop for the first time
Create necessary folders
sudo mkdir -p /export/servers/hadoop/logs
sudo chown -R hadooper /export/servers/hadoop/
sudo chmod -R 755 /export/servers/hadoop/
sudo mkdir -p /export/data/hadoop/
sudo chown -R hadooper /export/data/hadoop/
sudo chmod -R 755 /export/data/hadoop/
ssh hadoop02 "sudo mkdir -p /export/servers/hadoop/logs && sudo chown -R hadooper /export/servers/hadoop/ && sudo chmod -R 755 /export/servers/hadoop/ && sudo mkdir -p /export/data/hadoop/ && sudo chown -R hadooper /export/data/hadoop/ && sudo chmod -R 755 /export/data/hadoop/"
ssh hadoop03 "sudo mkdir -p /export/servers/hadoop/logs && sudo chown -R hadooper /export/servers/hadoop/ && sudo chmod -R 755 /export/servers/hadoop/ && sudo mkdir -p /export/data/hadoop/ && sudo chown -R hadooper /export/data/hadoop/ && sudo chmod -R 755 /export/data/hadoop/"
Launch ZooKeeper
$ZOOKEEPER_HOME/bin/zkServer.sh start
ssh hadoop02 "bash -c 'source /etc/profile && $ZOOKEEPER_HOME/bin/zkServer.sh start'"
ssh hadoop03 "bash -c 'source /etc/profile && $ZOOKEEPER_HOME/bin/zkServer.sh start'"
Launch journalnode
hdfs --daemon start journalnode
ssh hadoop02 "bash -c 'source /etc/profile && hdfs --daemon start journalnode'"
ssh hadoop03 "bash -c 'source /etc/profile && hdfs --daemon start journalnode'"
This step needs to be run on server hadoop01 if and only if the file system is initialized before starting hadoop for the first time
hdfs namenode -format
This code can only be operated when the hdfs cluster is started for the first time!
Start namenode
hdfs namenode -initializeSharedEdits
hdfs --daemon start namenode
ssh hadoop02 "bash -c 'source /etc/profile && hdfs namenode -bootstrapStandby'"
ssh hadoop03 "bash -c 'source /etc/profile && hdfs namenode -bootstrapStandby'"
Execute the run script
cd /export/servers/hadoop/sbin
bash /export/servers/hadoop/sbin/start-all.sh
Launch ZKFC
hdfs zkfc -formatZK
hdfs --daemon start zkfc
ssh hadoop02 "bash -c 'source /etc/profile && hdfs --daemon start zkfc'"
ssh hadoop03 "bash -c 'source /etc/profile && hdfs --daemon start zkfc'"
Launch JobHistory
mapred --daemon start historyserver
ssh hadoop02 "bash -c 'source /etc/profile && mapred --daemon start historyserver'"
ssh hadoop03 "bash -c 'source /etc/profile && mapred --daemon start historyserver'"
Verify that each part started successfully
jps
ssh hadoop02 "bash -c 'source /etc/profile && jps'"
ssh hadoop03 "bash -c 'source /etc/profile && jps'"

Subsequent activation and shutdown of hadoop
Launch ZooKeeper
$ZOOKEEPER_HOME/bin/zkServer.sh start
ssh hadoop02 "bash -c 'source /etc/profile && $ZOOKEEPER_HOME/bin/zkServer.sh start'"
ssh hadoop03 "bash -c 'source /etc/profile && $ZOOKEEPER_HOME/bin/zkServer.sh start'"
Launch hadoop
bash /export/servers/hadoop/sbin/start-all.sh
Launch JobHistory
mapred --daemon start historyserver
ssh hadoop02 "bash -c 'source /etc/profile && mapred --daemon start historyserver'"
ssh hadoop03 "bash -c 'source /etc/profile && mapred --daemon start historyserver'"

Close JobHistory
mapred --daemon stop historyserver
ssh hadoop02 "bash -c 'source /etc/profile && mapred --daemon stop historyserver'"
ssh hadoop03 "bash -c 'source /etc/profile && mapred --daemon stop historyserver'"
Shut down hadoop
bash /export/servers/hadoop/sbin/stop-all.sh
Close ZooKeeper
$ZOOKEEPER_HOME/bin/zkServer.sh stop
ssh hadoop02 "bash -c 'source /etc/profile && $ZOOKEEPER_HOME/bin/zkServer.sh stop'"
ssh hadoop03 "bash -c 'source /etc/profile && $ZOOKEEPER_HOME/bin/zkServer.sh stop'"

test
The browser accesses the following URLs (IP needs to be replaced)
DataNode Information
http://10.1.100.20:9864
http://10.1.100.21:9864
http://10.1.100.22:9864

NodeManager information
http://10.1.100.20:8042
http://10.1.100.21:8042
http://10.1.100.22:8042

Namenode information
http://10.1.100.20:9870/

Nodes of the cluster
http://10.1.100.20:8088/

JobHistory
http://10.1.100.20:19888/jobhistory/
http://10.1.100.21:19888/jobhistory/
http://10.1.100.22:19888/jobhistory/

Successful access and content means successful launch
If you enjoyed this, leave a comment~