Day 25-Hadoop 3.3.6 从本地模式到完全分布式部署实战(上)

目录

  • Hadoop 3.3.6 从本地模式到完全分布式部署踩坑全复盘
    • 一、基础环境准备与本地模式搭建
      • 1.1 创建用户与安装包解压
      • 1.2 配置 JDK 环境变量
      • 1.3 Hadoop 基础配置
      • 1.4 本地模式运行 WordCount
    • 二、伪分布式 HDFS 部署
      • 2.1 核心配置文件修改
      • 2.2 SSH 免密登录配置
      • 2.3 格式化 NameNode 与启动集群
      • 2.4 WebUI 与 HDFS 操作验证
    • 三、完全分布式集群搭建
      • 3.1 前置准备
      • 3.2 NFS 共享目录配置
        • 服务端(server1)配置
        • 客户端(server2、server3)配置
      • 3.3 完全分布式配置修改
      • 3.4 启动集群与踩坑排查
      • 3.5 YARN 资源调度配置
  • 实操踩坑总结


Hadoop 3.3.6 从本地模式到完全分布式部署踩坑全复盘

这次从零开始搭建 Hadoop 3.3.6 集群,从单机本地模式一路踩坑到完全分布式,中间栽了好几个看似低级但特别影响进度的问题——文件名输错、免密漏配、NFS 挂载异常导致节点起不来。把完整部署流程和踩坑排查思路都整理出来,帮大家避开同款弯路。


一、基础环境准备与本地模式搭建

1.1 创建用户与安装包解压

首先创建专用的 hadoop 用户,把 JDK 和 Hadoop 安装包统一放到用户家目录,后续所有操作都用 hadoop 用户执行,避免权限混乱。

# root 用户下创建 hadoop 用户
useradd hadoop
# 把安装包移动到 hadoop 家目录
mv hadoop-3.3.6.tar.gz jdk-8u181-linux-x64.tar.gz /home/hadoop
# 切换到 hadoop 用户
su - hadoop

在这里插入图片描述

解压安装包的时候踩了第一个低级坑:JDK 文件名输错了两次,一直报 No such file or directory,一开始还以为安装包没传成功,回头 ls 核对才发现是文件名拼写不对。建议大家解压前先确认文件名,善用 Tab 键自动补全。

# 解压 Hadoop
tar -zxf hadoop-3.3.6.tar.gz
# 解压 JDK(注意核对文件名)
tar -zxf jdk-8u181-linux-x64.tar.gz

解压完成后给两个目录创建软链接,后续升级版本不用改一堆配置路径。

ln -s hadoop-3.3.6 hadoop
ln -s jdk1.8.0_181 jdk

在这里插入图片描述

1.2 配置 JDK 环境变量

编辑 hadoop 用户的 .bash_profile,把 JDK 的 bin 目录加入系统 PATH:

vim ~/.bash_profile

配置内容:

PATH=$PATH:$HOME/.local/bin:$HOME/bin:/home/hadoop/jdk/bin
export PATH

在这里插入图片描述
配置完成后 source ~/.bash_profile 生效,执行 java -version 能输出版本就说明 JDK 环境正常。

1.3 Hadoop 基础配置

进入 Hadoop 配置目录,先看一下所有默认配置文件,心里有个数。

cd /home/hadoop/hadoop/etc/hadoop
ls

在这里插入图片描述

第一步先修改 hadoop-env.sh,显式指定 JAVA_HOME 路径。这步是必做的,否则 Hadoop 启动时会找不到 Java 环境。

vim hadoop-env.sh

添加配置:

export JAVA_HOME=/home/hadoop/jdk

配置完成后回到 Hadoop 根目录,执行命令验证基础环境:

cd /home/hadoop/hadoop
./bin/hadoop

能正常输出命令帮助信息,就说明 Hadoop 基础环境已经通了。
在这里插入图片描述

1.4 本地模式运行 WordCount

本地模式是 Hadoop 的最简模式,不启动任何守护进程,直接在本地跑 MapReduce 任务,适合快速验证环境。
先创建输入目录,把配置文件里的 xml 文件拷进去当测试数据:

mkdir input
cp etc/hadoop/*.xml input

在这里插入图片描述

这里又踩了个小坑:直接输 hadoop 命令报 command not found,才想起来只配了 JDK 的 PATH,没把 Hadoop 的 bin 目录加进去。临时用相对路径执行,后面再统一补环境变量。

# 错误示范:直接输 hadoop 找不到命令
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount input output

# 正确写法:用相对路径执行
./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount input output

任务跑完后查看输出目录,生成了结果文件和成功标记文件,说明本地模式运行正常。

ls output/

在这里插入图片描述

二、伪分布式 HDFS 部署

本地模式只能处理本地文件,接下来搭建伪分布式,单节点同时运行 NameNode、DataNode、SecondaryNameNode 三个进程,模拟完整的 HDFS 环境。

2.1 核心配置文件修改

修改 core-site.xml,指定 HDFS 的默认访问地址和端口:

vim core-site.xml
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

在这里插入图片描述

修改 hdfs-site.xml,因为只有一个节点,把副本数设为 1:

vim hdfs-site.xml
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

在这里插入图片描述

workers 文件默认是 localhost,伪分布式不用改。

2.2 SSH 免密登录配置

启动 HDFS 集群需要通过 SSH 远程拉起各节点进程,哪怕是本机也需要免密登录。先给 hadoop 用户设置密码,方便后续传公钥。

# root 用户下执行
passwd hadoop

在这里插入图片描述

切换回 hadoop 用户,生成 SSH 密钥对,全程回车默认即可:

ssh-keygen

把公钥写入本机的授权密钥文件,验证免密登录:

ssh-copy-id localhost
# 验证免密,不需要输密码就是成功
ssh localhost

在这里插入图片描述

2.3 格式化 NameNode 与启动集群

重点提醒:NameNode 格式化只能执行一次! 反复格式化会导致集群 ID 不一致,DataNode 无法注册。

cd /home/hadoop/hadoop
bin/hdfs namenode -format

在这里插入图片描述
在这里插入图片描述
格式化成功后,启动 HDFS 集群:

sbin/start-dfs.sh

启动完成后用 jps 查看进程,能看到 NameNode、DataNode、SecondaryNameNode 三个进程就说明伪分布式启动成功。
在这里插入图片描述

2.4 WebUI 与 HDFS 操作验证

在这里插入图片描述

浏览器访问 http://192.168.48.186:9870 打开 HDFS Web 管理界面,可以看到集群概览、总容量、节点数等信息。
在这里插入图片描述

在 HDFS 上创建用户目录,上传测试文件,跑一遍分布式 WordCount,验证读写功能正常:

# 创建目录
bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/hadoop
bin/hdfs dfs -mkdir input
# 上传文件
bin/hdfs dfs -put etc/hadoop/*.xml input
# 查看文件
bin/hdfs dfs -ls input

在这里插入图片描述

运行 MapReduce 任务,查看输出结果:

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount input output
bin/hdfs dfs -cat output/*

在这里插入图片描述

三、完全分布式集群搭建

伪分布式只是练手,生产环境都是多节点完全分布式。这次一共规划 4 台节点:

  • server1:NameNode + SecondaryNameNode
  • server2、server3:DataNode
  • 采用 NFS 共享 /home/hadoop 目录,配置和安装包只改一份,所有节点自动同步,省去挨个 scp 的麻烦。

3.1 前置准备

先停掉伪分布式集群,清理临时数据,避免和新集群冲突。

sbin/stop-dfs.sh
rm -rf /tmp/hadoop-hadoop

在这里插入图片描述

所有节点统一配置 hosts 主机名解析,保证节点之间可以通过主机名互通。

192.168.48.186 server1
192.168.48.187 server2
192.168.48.188 server3
192.168.48.189 server4

在这里插入图片描述

3.2 NFS 共享目录配置

服务端(server1)配置

server1 作为 NFS 服务端,安装 NFS 工具包:

yum install -y nfs-utils

编辑 /etc/exports 文件,配置共享目录,指定匿名用户的 UID/GID 和 hadoop 用户一致,避免权限问题。

/home/hadoop *(rw,sync,anonuid=1000,anongid=1000)

启动 NFS 服务并设置开机自启:

systemctl enable --now nfs
客户端(server2、server3)配置

两台 DataNode 节点同样安装 NFS 工具包:

yum install -y nfs-utils

先查看服务端的共享目录是否可访问:

showmount -e server1

在这里插入图片描述

在这里插入图片描述

把共享目录挂载到本地 /home/hadoop 路径:

mount 192.168.48.186:/home/hadoop /home/hadoop/

挂载完成后用 df -h 确认挂载成功。
在这里插入图片描述

关键检查: 挂载后一定要验证目录权限和用户 UID,确保 hadoop 用户能正常读写,否则后面启动进程会出现各种玄学权限报错。

ls -ld /home/hadoop
id hadoop

在这里插入图片描述

3.3 完全分布式配置修改

因为用了 NFS 共享目录,只需要在 server1 上修改配置,所有节点自动同步。

cd /home/hadoop/hadoop/etc/hadoop

修改 core-site.xml,把默认文件系统地址改成 server1 的实际 IP:

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://192.168.48.186:9000</value>
    </property>
</configuration>

在这里插入图片描述

修改 hdfs-site.xml,副本数调整为 2,对应两台 DataNode:

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
</configuration>

在这里插入图片描述

修改 workers 文件,删掉 localhost,加入两台 DataNode 的主机名:

server2
server3

3.4 启动集群与踩坑排查

配置完成后启动集群,server1 上的 NameNode 和 SecondaryNameNode 正常启动:

sbin/start-dfs.sh
jps

在这里插入图片描述

server2 的 DataNode 进程也正常:
在这里插入图片描述

但 server3 接连出了两个问题,卡了好一会儿,也是新手搭集群的高频踩坑点。
在这里插入图片描述

第一个报错:Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)
排查思路:很明显是 SSH 免密没配置。之前只配了 localhost 的免密,没给 server3 传公钥,NameNode 远程拉起进程的时候连不上。
解决方法:

ssh-copy-id server3

免密通了之后再启动,又报第二个错:bash: /home/hadoop/hadoop-3.3.6/bin/hdfs: No such file or directory
排查思路:一开始以为配置错了,登到 server3 上一看,NFS 共享目录压根没挂上!之前配置的时候只给 server2 做了挂载,漏了 server3,导致目录是空的。
解决方法:给 server3 重新挂载 NFS 共享目录,确认文件都能正常访问后再启动集群。

两个坑都踩完之后,两台 DataNode 全部正常上线。WebUI 里可以看到存活节点数为 2,总容量翻倍,块副本数正常。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.5 YARN 资源调度配置

光有 HDFS 还不够,跑 MapReduce 需要 YARN 资源调度框架。修改两个配置文件:

修改 mapred-site.xml,指定 MapReduce 运行在 YARN 上,并配置类路径:

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.application.classpath</name>
        <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
    </property>
</configuration>

在这里插入图片描述

修改 yarn-site.xml,配置 Shuffle 服务和环境变量白名单:

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
    </property>
</configuration>

在这里插入图片描述

如果想让 server1 也参与计算,可以自己挂载 NFS 共享,手动启动 DataNode 和 NodeManager 进程:

mount server1:/home/hadoop /home/hadoop
bin/hdfs --daemon start datanode
bin/yarn --daemon start nodemanager
jps

在这里插入图片描述
在这里插入图片描述


实操踩坑总结

这次从单机到分布式一路踩过来,总结几个新手最高频的坑,大家搭的时候可以提前避开:

  1. 文件名拼写错误:解压安装包时输错文件名是最低级但最容易犯的错,解压前先 ls 确认,多用 Tab 补全。
  2. 环境变量漏配:直接执行 hadoop 命令找不到,要么把 Hadoop 的 bin 目录加入 PATH,要么写全路径,别上来就怀疑安装包坏了。
  3. NameNode 重复格式化:格式化只能执行一次,出问题要先清空 /tmp 下的 hadoop 临时目录再重新格式化,否则集群 ID 不一致会导致 DataNode 无法注册。
  4. 免密登录遗漏:完全分布式下 NameNode 要能免密登录所有 DataNode,每台节点都要传公钥,不能漏。
  5. NFS 挂载与 UID 一致性:共享目录必须确认挂载成功,且各节点 hadoop 用户的 UID/GID 要保持一致,否则会出现各种隐蔽的权限问题。
  6. 配置文件路径:所有配置都在 etc/hadoop 目录下,别找错目录改了半天不生效。

整体来看 Hadoop 的部署逻辑并不复杂,麻烦的都是各种细节配置和权限问题。第一次搭不用追求一次成功,踩坑排查的过程反而能把原理理解得更透彻。

一、 核心标准详解1. 基础框架与第一代协议•ISO 15118-1:2019(通用信息与用例定义):整个系列的基石。它概述了标准的基础框架、术语定义,以及充电场景下的设备交互模式(涵盖直流/交流充电、安全性、支付等通用要求)。•BS EN ISO 15118-2:2016(网络和应用协议要求):第一代协议的核心。定义了消息格式、通信流程、状态机等技术要求,覆盖网络层至应用层协议(如 TLS 安全传输、EXI 高效编码格式),明确了 V2G 通信的交互细节。•BS EN ISO 15118-3:2016(物理层和数据链路层要求):定义了有线通信的底层规范。主要基于电力线载波通信(PLC,如 HomePlug Green PHY),规定了物理层与数据链路层的技术规范,确保车辆与充电桩之间在有线连接下的数据传输。2. 第一代协议的一致性测试•ISO 15118-4:2018(网络和应用层一致性测试):针对 -2 标准的测试规范。提供协议一致性与功能测试要求(包含正常用例和错误用例),验证车端(EV)和桩端(EVSE)在高层通信协议实现上的正确性。•ISO 15118-5:2018(物理层和数据链路层一致性测试):针对 -3 标准的测试规范。聚焦于底层 PLC 通信的实现,验证信号波形、链路建立(SLAC)、数据帧格式等是否符合规范。3. 无线通信扩展•ISO 15118-8:2020(无线通信物理层和数据链路层要求):定义了基于 IEEE 802.11n(Wi-Fi)的无线通信接口,作为有线 PLC 的替代方案,支持无线电力传输(WPT)和传导充电的高层通信(HLC)。•ISO 15118-9:2022(无线通信物理层和数据链路层一致性测试):针对 -8 标准的测试规范。验证无线连接管理(如 WPA2/WPA3 认证、网络发现与关联)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值