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
posted @   一年都在冬眠  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示