Hadoop(四)生产集群搭建(一)
生产集群搭建
- Hadoop运行模式包括:本地模式、伪分布式模式以及完全分布式模式
本地模式(官方WorldCount)
- 单机运行,生产环境不用
- 数据存储在Linux本地
- 例子:使用 Hadoop 运行一个 MapReduce 程序来执行词频统计
1、在hadoop-3.1.3文件下面创建一个wcinput文件夹
[user@hadoop102 hadoop-3.1.3]$ mkdir wcinput
2、在wcinput文件下创建一个word.txt文件
[user@hadoop102 hadoop-3.1.3]$ cd wcinput
[user@hadoop102 wcinput]$ vim word.txt
3、编辑word.txt文件
SEVENTEEN RIGHT HERE!
SAY THE NAME!
- 保存退出:wq
4、回到Hadoop目录/opt/module/hadoop-3.1.3
5、执行程序
[user@hadoop102 hadoop-3.1.3]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput/ ./wcoutput
- bin/hadoop:这是调用 Hadoop 命令行工具的路径
- jar:这个命令用于运行 JAR 文件中的 Hadoop 作业
- share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar:这是包含 MapReduce 示例程序的 JAR 文件的路径
- wordcount:这是 MapReduce 作业的驱动类,它指定了作业要运行的 MapReduce 任务
- wcinput/:这是输入目录,它包含了要进行词频统计的文本文件
- ./wcoutput:这是输出目录,词频统计的结果将会被写入这个目录
注意:
- 输出目录不应该预先存在,如果输出目录已经存在,Hadoop会拒绝运行作业,因为它默认不允许覆盖已存在的数据,这是为了防止数据丢失
- 路径问题,在Hadoop中,路径通常是HDFS的路径,而不是本地文件系统的路径
6、查看结果
[user@hadoop102 wcoutput]$ ll
total 4
-rw-r--r--. 1 user user 48 Sep 11 00:51 part-r-00000
-rw-r--r--. 1 user user 0 Sep 11 00:51 _SUCCESS
[user@hadoop102 wcoutput]$ cat part-r-00000
HERE! 1
NAME! 1
RIGHT 1
SAY 1
SEVENTEEN 1
THE 1
- 在wcoutput文件夹下,有两个文件,其中_SUCCESS是一个特殊的文件,当作业运行成功后,Hadoop会自动创建这个文件,它的存在表示作业已经成功完成;part-r-00000是输出文件,r表示这个reduce阶段的输出,这个文件包含了词频统计的结果
伪分布式模式
- 单机运行,但是具备Hadoop集群的所有功能,一台服务器模拟一个分布式的环境,可以用来测试,生产环境不用
- 数据存储在HDFS
完全分布式集群(重点)
- 多台服务器组成分布式环境,生产环境使用
- 数据存储在HDFS,多台服务器工作
一、分析
- 准备3台客户机(关闭防火墙、静态IP、主机名称)—> 安装JDK —> 配置环境变量 —> 安装Hadoop —> 配置环境变量 —> 配置集群 —> 单点启动 —> 配置SSH —> 群起并测试集群
- 目前已准备好三台客户机,只有Hadoop102完成了安装配置JDK和Hadoop
二、编写集群分发脚本xsync
1、scp(secure copy)安全拷贝
(1)可以实现服务器与服务器之间的数据拷贝
scp -r $pdir/$fname $user@$host:$pdir/$fname
- scp:命令
- -r:递归
- $pdir/$fname:要拷贝的文件路径/名称
- $user@$host:$pdir/$fname:目的地用户@主机:目的地路径/名称
(2)实操
- 前提:在hadoop102、hadoop103、hadoop104都已经创建好的/opt/module、/opt/software两个目录,并且已经把这两个目录修改为user:user
- 在hadoop102上,将hadoop102中/opt/module/jdk1.8.0_212目录拷贝到hadoop103上
[user@hadoop102 module]$ scp -r jdk1.8.0_212/ user@hadoop103:/opt/module/
- 在hadoop103查看拷贝结果
[user@hadoop103 module]$ ll
total 0
drwxr-xr-x. 7 user user 245 Sep 11 01:53 jdk1.8.0_212
- 在hadoop103上,将hadoop102中/opt/module/hadoop-3.1.3目录拷贝到hadoop103上
[user@hadoop103 module]$ scp -r user@hadoop102:/opt/module/hadoop-3.1.3 ./
- 在hadoop103上操作,将hadoop102中/opt/module目录下所有目录拷贝到hadoop104上
[user@hadoop103 module]$ scp -r user@hadoop102:/opt/module/* user@hadoop104:/opt/module/
- 在hadoop104查看拷贝结果
[user@hadoop104 opt]$ cd /opt/module/
[user@hadoop104 module]$ ll
total 0
drwxr-xr-x. 11 user user 180 Sep 11 02:18 hadoop-3.1.3
drwxr-xr-x. 7 user user 245 Sep 11 02:18 jdk1.8.0_212
2、rsync远程同步工具
(1)主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点
(2)rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync 只对差异文件做更新。scp是把所有文件都复制过去
(3)语法
rsync -av $pdir/$fname $user@$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
- -a:归档拷贝
- -v:显示复制过程
(4)实操
- 删除hadoop103中/opt/module/hadoop-3.1.3/wcinput和wcoutput
[user@hadoop103 hadoop-3.1.3]$ rm -rf wcinput/ wcoutput/
[user@hadoop103 hadoop-3.1.3]$ ll
total 176
drwxr-xr-x. 2 user user 183 Sep 11 02:07 bin
drwxr-xr-x. 3 user user 20 Sep 11 02:07 etc
drwxr-xr-x. 2 user user 106 Sep 11 02:09 include
drwxr-xr-x. 3 user user 20 Sep 11 02:07 lib
drwxr-xr-x. 4 user user 288 Sep 11 02:07 libexec
-rw-rw-r--. 1 user user 147145 Sep 11 02:07 LICENSE.txt
-rw-rw-r--. 1 user user 21867 Sep 11 02:07 NOTICE.txt
-rw-rw-r--. 1 user user 1366 Sep 11 02:07 README.txt
drwxr-xr-x. 3 user user 4096 Sep 11 02:07 sbin
drwxr-xr-x. 4 user user 31 Sep 11 02:07 share
- 同步hadoop102中的/opt/module/hadoop-3.1.3到hadoop103
[user@hadoop102 module]$ rsync -av hadoop-3.1.3/ user@hadoop103:/opt/module/hadoop-3.1.3/
3、xsync集群分发脚本
(1)在rsync的基础上进行封装,实现循环复制文件到所有节点的相同目录下
(2)期望脚本:xsync 要同步的文件名称
,期望脚本在任何路径都能使用,脚本放在声明了全局环境变量的路径
(3)脚本实现
- 在home/user/bin目录下创建xsync文件
[user@hadoop102 bin]$ vim xsync
- 在文件中编写如下代码
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
- 修改脚本xsync具有执行权限
[user@hadoop102 bin]$ chmod 777 xsync
- 测试脚本
xsync bin/
此时在hadoop103、hadoop104中都有xsync脚本
(4)使用这个脚本同步配置环境变量
- 将脚本复制到/bin中,以便全局调用
[user@hadoop102 bin]$ sudo cp xsync /bin/
- 同步环境变量配置(root所有者)
[user@hadoop102 ~]$ sudo ./bin/xsync /etc/profile.d/my_env.sh
注意:如果用了sudo,那么xsync一定要给它的路径补全
- 让环境变量生效
[user@hadoop103 bin]$ source /etc/profile
[user@hadoop104 opt]$ source /etc/profile
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!