hadoop(服务器伪分布式搭建)

1. 报错 Windows 上写的脚本 拷贝到 Linux(比如 CentOS)系统时会出现。

bash: ./set_java_home.sh: /bin/bash^M: bad interpreter: No such file or directory

报错原因

^M 是 Windows 的换行符(\r\n)
Linux 使用的是 Unix 格式的换行符(\n)
所以你的脚本第一行的 #!/bin/bash 实际上变成了:
#!/bin/bash^M

解决方法把脚本转换为 Unix 格式

使用 dos2unix 命令

powershell 复制代码
dos2unix set_java_home.sh
##如果没有下面就是安装命令
yum install dos2unix -y

2. 解决centos里面多版本java,统中默认的 Java(通过 alternatives 指定的)自动同步到 JAVA_HOME,以保证一致性。

powershell 复制代码
#!/bin/bash

# 配置你的 Java 安装路径(按你提供的内容)
JAVA8_PATH="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64"
JAVA11_PATH="/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64"

# 参数校验
if [[ $1 == "8" ]]; then
  echo "🔄 正在切换到 Java 8..."
  sudo alternatives --set java $JAVA8_PATH/jre/bin/java
  sudo alternatives --set javac $JAVA8_PATH/bin/javac
  export JAVA_HOME=$JAVA8_PATH
elif [[ $1 == "11" ]]; then
  echo "🔄 正在切换到 Java 11..."
  sudo alternatives --set java $JAVA11_PATH/bin/java
  sudo alternatives --set javac $JAVA11_PATH/bin/javac
  export JAVA_HOME=$JAVA11_PATH
else
  echo "❌ 参数错误,请输入 8 或 11,例如:"
  echo "   source ./switch-java.sh 8"
  echo "   source ./switch-java.sh 11"
  return 1
fi

# 清理旧 PATH 中的 JAVA_HOME 相关路径
export PATH=$(echo "$PATH" | awk -v RS=: -v ORS=: '/java/ {next} {print}' | sed 's/:$//')

# 加入新 JAVA_HOME/bin
export PATH=$JAVA_HOME/bin:$PATH

# 显示结果
echo "✅ 已切换至 JAVA_HOME: $JAVA_HOME"
java -version
powershell 复制代码
##到对应位置运行这个脚本,前面加上source,就是全局运行,不加的话就是在一个进程里面运行,检查的时候可能检查不到
source switch-java.sh 8
source switch-java.sh 11
powershell 复制代码
##检查命令
echo $JAVA_HOME

下图是切换Java8的source scripts/switch-java.sh 8

下图是切换java11的source scripts/switch-java.sh 11

设置重新启动服务器,以后默认的环境变量中的java的版本

powershell 复制代码
vim ~/.bashrc
##添加
# 每次登录自动设置 Java 8 为默认(你自己上面脚本存放的位置)
source $HOME/scripts/switch-java.sh 8
或
# 每次登录自动设置 Java 11 为默认$HOME指的是根目录root
source $HOME/scripts/switch-java.sh 11
# 最后执行
source ~/.bashrc

Hadoop

安装教程
官网链接:https://hadoop.apache.org/releases.html
不同的安装包的区别

文件名 含义
source 源码包,需要你自己编译(不推荐初学者)
binary 官方编译好的二进制包(✅推荐)
binary-aarch64 针对 ARM 架构的电脑(如苹果 M1/M2、树莓派)
binary-lean 精简版本(一般不推荐)

推荐下载的安装包:Hadoop 3.3.6 binary
下载地址:https://downloads.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
下载完成后上传到服务器
我上传的目录是/usr/local

powershell 复制代码
cd /usr/local/
tar -zxvf hadoop-3.3.6.tar.gz
mv hadoop-3.3.6 hadoop

执行完上述命令后Hadoop 安装路径是 /usr/local/hadoop

配置环境变量配置文件

powershell 复制代码
vim ~/.bashrc
#把下面的内容写到配置文件里面
#我的java已经配置了,不需要配置java了如图
# Hadoop
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
powershell 复制代码
#让配置文件生效重新加载
source ~/.bashrc
#测试是否生效,如下图已经安装完成
hadoop version

hadoop理解

干嘛用的:

是为了解决"单机无法处理超大数据"的问题,通过"分布式存储(HDFS)+ 分布式计算(MapReduce)"来高效地处理海量数据。

用于存储和处理超大规模数据(TB、PB 级别)。
原理:

1.把大文件切成小块分布存储在多台机器上(HDFS)

2.把任务拆成小任务并行处理,最后汇总结果(MapReduce)
核心组件与原理图解

Hadoop 核心原理组件解释

组件 功能
HDFS 分布式文件系统,把大文件切成块存到多台机器,每块默认保存 3 份(容错)
MapReduce 分布式计算框架,把任务拆成 map → shuffle → reduce,分布式并行处理
YARN 资源调度框架,决定哪些机器执行哪些任务
NameNode HDFS 中的"总目录",保存文件结构、块位置(元数据)
DataNode 实际存储数据块的节点
ResourceManager 管理所有节点资源,分配任务
NodeManager 每个节点的"本地资源控制器",接收任务并执行

应用场景:分布式存储和海量数据计算,用在"大数据"场景下。

场景 描述
日志分析 网站、APP、大型平台的用户访问日志分析(TB 级)
数据仓库(Hive) 用 SQL 处理海量结构化数据
ETL 处理(+Sqoop) 数据抽取(从 MySQL 导入)、转换、加载
搜索引擎爬虫 把抓取网页分布式处理、存储
图像视频处理 多节点同时处理图片/视频数据(如压缩、转码)
机器学习预处理 对大规模训练数据进行 MapReduce 处理
互联网企业分析系统 淘宝、百度、腾讯、头条等早期都用了 Hadoop 搭建离线数据处理平台

Hadoop优势

优势 说明
高可扩展 加机器就能扩容(线性扩展)
高容错 自动备份副本,节点宕了也不会丢数据
大规模处理 支持 TB/PB 级别数据处理
高性价比 可用普通商用服务器构建分布式平台
开源生态丰富 Hive、Spark、HBase、Flink 都能集成 Hadoop 存储

不适合的地方

不适合场景 说明
实时计算(ms 级) Hadoop 是离线批处理,延迟分钟级
小数据场景 启动 MapReduce 比处理本身还慢
高频低延迟系统 比如金融交易系统、秒杀系统,不适合 Hadoop
高并发 OLTP Hadoop 不支持事务处理和高并发读写操作

运行模式

模式 是否需要配置 XML 是否需要创建 tmp、namenode、datanode 等目录 是否需要启动服务
1. 本地模式(Local Mode) ❌ 不需要 ❌ 不需要 ❌ 不需要
2. 伪分布式模式 ✅ 需要 ✅ 必须创建 ✅ 启动 HDFS/YARN
3. 真分布式模式 ✅ 需要 ✅ 必须创建(不同节点) ✅ 启动多节点服务

hadoop部署伪分布式

第一步创建 Hadoop 所需的工作目录

powershell 复制代码
mkdir -p /usr/local/hadoop/tmp
mkdir -p /usr/local/hadoop/hdfs/namenode
mkdir -p /usr/local/hadoop/hdfs/datanode
目录 作用
/usr/local/hadoop/tmp Hadoop 运行时的临时文件目录(如锁文件、缓存)
/usr/local/hadoop/hdfs/namenode 存储 NameNode 元数据(如文件目录结构、块位置)
/usr/local/hadoop/hdfs/datanode 存储 DataNode 的实际数据块(HDFS 文件数据)

NameNode 认为 /usr/local/hadoop/hdfs/namenode 是它的持久存储位置。
DataNode 把数据块写入 /usr/local/hadoop/hdfs/datanode。
tmp 用来缓存、写日志、写运行时中间文件。

第 2 步:编辑配置文件
配置文件路径:/usr/local/hadoop/etc/hadoop/
2.1. core-site.xml

powershell 复制代码
vim /usr/local/hadoop/etc/hadoop/core-site.xml

内容:需要外部访问配置hdfs://主机名称:9000

xml 复制代码
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://主机名称(或者是你的ip注意要和下面的文件中的保持一致):9000</value>
  </property>

  <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoop/tmp</value>
  </property>
</configuration>

2.2 hdfs-site.xml

powershell 复制代码
vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml

内容:

xml 复制代码
<configuration>

  <!-- 设置副本数为1(伪分布式) -->
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>

  <!-- NameNode 存储目录 -->
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/usr/local/hadoop/hdfs/namenode</value>
  </property>

  <!-- DataNode 存储目录 -->
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/usr/local/hadoop/hdfs/datanode</value>
  </property>

  <!-- DataNode 注册使用公网IP(重要) -->
  <property>
    <name>dfs.datanode.hostname</name>
    <value>你自己的主机名称或者是ip</value>
  </property>

  <!-- DataNode 与客户端通信使用 hostname(IP) -->
  <property>
    <name>dfs.datanode.use.datanode.hostname</name>
    <value>true</value>
  </property>

  <!-- 客户端使用 hostname(IP) 访问 DataNode -->
  <property>
    <name>dfs.client.use.datanode.hostname</name>
    <value>true</value>
  </property>

  <!-- 开放 NameNode RPC(绑定到所有网卡) -->
  <property>
    <name>dfs.namenode.rpc-bind-host</name>
    <value>0.0.0.0</value>
  </property>

  <!-- 可选:关闭主机名校验,允许 IP 注册 -->
  <property>
    <name>dfs.namenode.reject-unresolved-datanode-hostname</name>
    <value>false</value>
  </property>

</configuration>

2.3 mapred-site.xml

powershell 复制代码
vim /usr/local/hadoop/etc/hadoop/mapred-site.xml

内容:

xml 复制代码
<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

2.4 yarn-site.xml

powershell 复制代码
vim /usr/local/hadoop/etc/hadoop/yarn-site.xml

内容:

xml 复制代码
<configuration>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
</configuration>

第三步配置免密登录

powershell 复制代码
ssh-keygen -t rsa        # 全部回车
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
ssh localhost            # 确保不需要输入密码

第四步:格式化 HDFS(只做一次)

powershell 复制代码
hdfs namenode -format
#后面如果再需要格式化需要关闭这两个
stop-dfs.sh
stop-yarn.sh

第五步:启动命令

powershell 复制代码
#停止命令
stop-dfs.sh
#启动命令
start-dfs.sh
start-yarn.sh
#jps用于列出当前系统中所有的HotSpot Java虚拟机进程
jps                             # 查看服务是否正常

## 报错
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
#你在用 root 用户执行 start-dfs.sh 命令
#Hadoop 默认不允许你用 root 来启动 HDFS 守护进程(安全考虑)

## 下面是解决方法 以及其他命令
#创建用户
useradd hadoop
passwd hadoop
#把Hadoop 安装目录权限改给 hadoop 用户:
chown -R hadoop:hadoop /usr/local/hadoop
#给hadoop用户赋予sudo权限(centos7)
usermod -aG wheel hadoop
#其他关于防火墙的命令可选
sudo firewall-cmd --permanent --add-port=9000/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports
#切换用户
su - hadoop
vim ~/.bashrc #编辑,不同用户不同的环境变量文件
#切换完用户后从新配置java和hadoop的环境变量(如下图)
#我Java的环境变量是一个脚本文件(Java8 和java11需要切换),根据自己的需求配置
#保存后再执行(让配置文件生效)
source ~/.bashrc
#验证是否生效
echo $JAVA_HOME
echo $HADOOP_HOME
which hadoop


总总结:hadoop是什么,是用来处理海量数据的,然后有两大核心模块,一个就是,分布式文件HDFS(Hadoop Distributed File System),里面有两种节点NameNode和DataNode ,HDFS会把一个大文件分成块(block默认大小是128MB)每个块会有多个副本存在不同的服务器上(默认3个),具体的内容存在DataNode里面,而NameNode相当于DataNode的目录。

hadoop操作上传,下载,读取文件的命令

powershell 复制代码
#查看HDFS的根目录
hdfs dfs -ls /
# 创建用户目录
hdfs dfs -mkdir -p /user/hadoop
# 创建临时目录(某些程序可能会用到)
hdfs dfs -mkdir /tmp
# 设置临时目录权限为 777(某些程序依赖)
hdfs dfs -chmod -R 777 /tmp

上传文件
hdfs dfs -put /本地路径/文件名 /HDFS目标路径
#列子
hdfs dfs -put /home/hadoop/files/剑来01.mp4 /user/hadoop/
#查看是否上传成功
hdfs dfs -ls /user/hadoop/
powershell 复制代码
# 查看文件块和位置
hdfs fsck /user/hadoop/剑来01.mp4 -files -blocks -locations
输出:
Status: HEALTHY
# ✅ 文件健康,未缺块、未损坏

Number of data-nodes:	1
# 📦 当前集群中只有1个 DataNode(单节点伪分布式)

Number of racks:	1
# 📶 当前仅配置了1个机架(Rack)

Total dirs:	0
# 📁 总共目录数量为0(因为只检查了一个文件)

Total symlinks:	0
# 🔗 符号链接数量为0(HDFS中很少使用符号链接)

Replicated Blocks:
 Total size:	2655188930 B
 # 📄 文件总大小约 2.65GB

 Total files:	1
 # 📁 本次检查的文件数量

 Total blocks (validated):	20 (avg. block size 132759446 B)
 # 📦 文件被切分为20个块,每个块平均约132MB(符合HDFS默认128MB)

 Minimally replicated blocks:	20 (100.0 %)
 # ✅ 所有块至少有1个副本,符合设定的副本数

 Over-replicated blocks:	0 (0.0 %)
 # 📈 没有副本数量超出配置的块

 Under-replicated blocks:	0 (0.0 %)
 # 📉 没有副本数量不足的块

 Mis-replicated blocks:	0 (0.0 %)
 # ⚠️ 块没有分布不合理(如所有副本都集中在同一节点)的问题

 Default replication factor:	1
 # 🔁 当前系统默认副本数为1(单节点无法设置更高)

 Average block replication:	1.0
 # 📊 所有块平均有1个副本

 Missing blocks:	0
 # ❌ 没有缺失的块

 Corrupt blocks:	0
 # ❌ 没有损坏的块

 Missing replicas:	0 (0.0 %)
 # ❌ 所有副本都存在,没有副本缺失

 Blocks queued for replication:	0
 # 📋 没有等待复制的块(说明副本充足)

Erasure Coded Block Groups:
 Total size:	0 B
 Total files:	0
 Total block groups (validated):	0
 Minimally erasure-coded block groups:	0
 Over-erasure-coded block groups:	0
 # ✳️ 未使用 Erasure Coding(纠删码),这是一种高级存储方式,用于节省空间,当前未启用


# 查看集群副本默认配置
hdfs getconf -confKey dfs.replication
# 输出文件大小
hdfs dfs -du -h /user/hadoop/
#下载
hdfs dfs -get /user/hadoop/剑来01.mp4 ./
#预览内容
#查看文件的开头
hdfs dfs -cat /user/hadoop/data1.txt | head
#查看结尾(日志)
hdfs dfs -tail /user/hadoop/log.txt
#查看前几行
hdfs dfs -cat /user/hadoop/data2.csv | head -n 5
#过滤
hdfs dfs -ls /user/hadoop/ | grep '\.csv'
#查找
hdfs dfs -find / -name "*.csv"
#查找特定名字
hdfs dfs -find / -name "data2025-*.txt"
#删除
hdfs dfs -rm /user/hadoop/剑来01.mp4
#用 hdfs dfs -ls 查看上传了哪些文件
#用 -cat、-tail、head 查看内容判断是不是你要的
#用 -du -h 看大小,或 grep / find 辅助筛选

Hadoop端口介绍

端口 类型 服务 用法 是否浏览器能访问
9000 RPC通信端口 NameNode Hadoop 命令通信(如 put、get、ls) ❌ 不行,后台服务端口
9870 Web UI NameNode Web 浏览 HDFS 目录、查看块位置 ✅ 可以
9864 Web UI DataNode Web 查看 DataNode 状态和数据块 ✅ 可以
8088 Web UI YARN ResourceManager 查看作业运行状态 ✅ 可以

hadoop安全模式

重新启动的时候会进入到安全模式

powershell 复制代码
# 查看安全模式状态
hdfs dfsadmin -safemode get
#强制退出安全模式
hdfs dfsadmin -safemode leave
# 输出示例:
# Safe mode is ON
# 或
# Safe mode is OFF
相关推荐
山猪打不过家猪3 小时前
(一)Eshop(异常处理中间件)
分布式
大母猴啃编程6 小时前
Linux权限
linux·运维·服务器
szial6 小时前
Hive 向量化执行引擎 Vectorized Execution 常见 NPE 报错分析及解决
hive·hadoop
无级程序员6 小时前
hive分区表临时加载日批数据文件
数据仓库·hive·hadoop
为什么要内卷,摆烂不香吗6 小时前
LVS部署DR模式集群
服务器·数据库·lvs
cpsvps8 小时前
香港服务器SSH安全加固方案与密钥认证实践
服务器·安全·ssh
运维开发王义杰9 小时前
告别手动迁移:使用 PowerShell 一键导出 IIS 配置,让服务器迁移更轻松
运维·服务器·windows
阿巴~阿巴~9 小时前
深入理解Linux文件操作:stdin/stdout/stderr与C语言文件函数全解析
linux·运维·服务器
阿巴~阿巴~9 小时前
深度解析Linux文件I/O三级缓冲体系:用户缓冲区→标准I/O→内核页缓存
linux·运维·服务器
tan77º9 小时前
【Linux网络编程】应用层协议 - HTTP
linux·服务器·网络·c++·http·https·tcp