hadoop(服务器伪分布式搭建)_binary-lean
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 命令
dos2unix set_java_home.sh##如果没有下面就是安装命令yum install dos2unix -y
2. 解决centos里面多版本java,统中默认的 Java(通过 alternatives 指定的)自动同步到 JAVA_HOME,以保证一致性。
#!/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_PATHelif [[ $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_PATHelse echo \"❌ 参数错误,请输入 8 或 11,例如:\" echo \" source ./switch-java.sh 8\" echo \" source ./switch-java.sh 11\" return 1fi# 清理旧 PATH 中的 JAVA_HOME 相关路径export PATH=$(echo \"$PATH\" | awk -v RS=: -v ORS=: \'/java/ {next} {print}\' | sed \'s/:$//\')# 加入新 JAVA_HOME/binexport PATH=$JAVA_HOME/bin:$PATH# 显示结果echo \"✅ 已切换至 JAVA_HOME: $JAVA_HOME\"java -version
##到对应位置运行这个脚本,前面加上source,就是全局运行,不加的话就是在一个进程里面运行,检查的时候可能检查不到source switch-java.sh 8source switch-java.sh 11
##检查命令echo $JAVA_HOME
下图是切换Java8的source scripts/switch-java.sh 8
下图是切换java11的source scripts/switch-java.sh 11
设置重新启动服务器,以后默认的环境变量中的java的版本
vim ~/.bashrc##添加# 每次登录自动设置 Java 8 为默认(你自己上面脚本存放的位置)source $HOME/scripts/switch-java.sh 8或# 每次登录自动设置 Java 11 为默认$HOME指的是根目录rootsource $HOME/scripts/switch-java.sh 11# 最后执行source ~/.bashrc
Hadoop
安装教程
官网链接:https://hadoop.apache.org/releases.html
不同的安装包的区别
推荐下载的安装包:Hadoop 3.3.6 binary
下载地址:https://downloads.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
下载完成后上传到服务器
我上传的目录是/usr/local
cd /usr/local/tar -zxvf hadoop-3.3.6.tar.gzmv hadoop-3.3.6 hadoop
执行完上述命令后Hadoop 安装路径是 /usr/local/hadoop
配置环境变量配置文件
vim ~/.bashrc#把下面的内容写到配置文件里面#我的java已经配置了,不需要配置java了如图# Hadoopexport HADOOP_HOME=/usr/local/hadoopexport PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#让配置文件生效重新加载source ~/.bashrc#测试是否生效,如下图已经安装完成hadoop version
hadoop理解
干嘛用的:
是为了解决“单机无法处理超大数据”的问题,通过“分布式存储(HDFS)+ 分布式计算(MapReduce)”来高效地处理海量数据。
用于存储和处理超大规模数据(TB、PB 级别)。
原理:
1.把大文件切成小块分布存储在多台机器上(HDFS)
2.把任务拆成小任务并行处理,最后汇总结果(MapReduce)
核心组件与原理图解
Hadoop 核心原理组件解释
应用场景:分布式存储和海量数据计算,用在“大数据”场景下。
Hadoop优势
不适合的地方
运行模式
hadoop部署伪分布式
第一步创建 Hadoop 所需的工作目录
mkdir -p /usr/local/hadoop/tmpmkdir -p /usr/local/hadoop/hdfs/namenodemkdir -p /usr/local/hadoop/hdfs/datanode
/usr/local/hadoop/tmp
/usr/local/hadoop/hdfs/namenode
/usr/local/hadoop/hdfs/datanode
NameNode 认为 /usr/local/hadoop/hdfs/namenode 是它的持久存储位置。
DataNode 把数据块写入 /usr/local/hadoop/hdfs/datanode。
tmp 用来缓存、写日志、写运行时中间文件。
第 2 步:编辑配置文件
配置文件路径:/usr/local/hadoop/etc/hadoop/
2.1. core-site.xml
vim /usr/local/hadoop/etc/hadoop/core-site.xml
内容:需要外部访问配置hdfs://主机名称:9000
<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
vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
内容:
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/hdfs/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/hdfs/datanode</value> </property> <property> <name>dfs.datanode.hostname</name> <value>你自己的主机名称或者是ip</value> </property> <property> <name>dfs.datanode.use.datanode.hostname</name> <value>true</value> </property> <property> <name>dfs.client.use.datanode.hostname</name> <value>true</value> </property> <property> <name>dfs.namenode.rpc-bind-host</name> <value>0.0.0.0</value> </property> <property> <name>dfs.namenode.reject-unresolved-datanode-hostname</name> <value>false</value> </property></configuration>
2.3 mapred-site.xml
vim /usr/local/hadoop/etc/hadoop/mapred-site.xml
内容:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property></configuration>
2.4 yarn-site.xml
vim /usr/local/hadoop/etc/hadoop/yarn-site.xml
内容:
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property></configuration>
第三步配置免密登录
ssh-keygen -t rsa # 全部回车cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keysssh localhost # 确保不需要输入密码
第四步:格式化 HDFS(只做一次)
hdfs namenode -format#后面如果再需要格式化需要关闭这两个stop-dfs.shstop-yarn.sh
第五步:启动命令
#停止命令stop-dfs.sh#启动命令start-dfs.shstart-yarn.sh#jps用于列出当前系统中所有的HotSpot Java虚拟机进程jps # 查看服务是否正常## 报错ERROR: Attempting to operate on hdfs namenode as rootERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.#你在用 root 用户执行 start-dfs.sh 命令#Hadoop 默认不允许你用 root 来启动 HDFS 守护进程(安全考虑)## 下面是解决方法 以及其他命令#创建用户useradd hadooppasswd hadoop#把Hadoop 安装目录权限改给 hadoop 用户:chown -R hadoop:hadoop /usr/local/hadoop#给hadoop用户赋予sudo权限(centos7)usermod -aG wheel hadoop#其他关于防火墙的命令可选sudo firewall-cmd --permanent --add-port=9000/tcpsudo firewall-cmd --reloadsudo firewall-cmd --list-ports#切换用户su - hadoopvim ~/.bashrc #编辑,不同用户不同的环境变量文件#切换完用户后从新配置java和hadoop的环境变量(如下图)#我Java的环境变量是一个脚本文件(Java8 和java11需要切换),根据自己的需求配置#保存后再执行(让配置文件生效)source ~/.bashrc#验证是否生效echo $JAVA_HOMEecho $HADOOP_HOMEwhich hadoop
总总结:hadoop是什么,是用来处理海量数据的,然后有两大核心模块,一个就是,分布式文件HDFS(Hadoop Distributed File System),里面有两种节点NameNode和DataNode ,HDFS会把一个大文件分成块(block默认大小是128MB)每个块会有多个副本存在不同的服务器上(默认3个),具体的内容存在DataNode里面,而NameNode相当于DataNode的目录。
hadoop操作上传,下载,读取文件的命令
#查看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/
# 查看文件块和位置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
9870
9864
8088
hadoop安全模式
重新启动的时候会进入到安全模式
# 查看安全模式状态hdfs dfsadmin -safemode get#强制退出安全模式hdfs dfsadmin -safemode leave# 输出示例:# Safe mode is ON# 或# Safe mode is OFF