创建虚拟机(主机名hadoop100)

我这个内存配置太少了,后面启动个集群都要很久,电脑带得动的话记得多配一点内存。

image-20220608191641709

如果Linux安装的是最小系统版,还需要安装如下工具

  • net-tool:工具包集合,包含ifconfig等命令

    1
    yum install -y net-tools
  • vim:编辑器

    1
    yum install -y vim
  • rsync

    1
    yum install -y rsync

配置IP与映射

配置虚拟机,vmware,window10的ip

vmware

第一步:编辑—>虚拟网络编辑器

image-20220607205707581

第二步:nat设置

image-20220607205807622

window10

第一步:找到VMnet8右键属性image-20220607210440384

第二步:配置

image-20220607210822578

虚拟机

第一步:切换到root,执行 vim /etc/sysconfig/network-scripts/ifcfg-ens33

image-20220607211507787

第二步:修改添加配置信息

image-20220607212600765

第三步:执行 vim /etc/hostname 修改主机名称为hadoop100

第四步:执行 vim /etc/hosts 配置主机名称映射

image-20220608181710565

第五步:都配置完后执行reboot重启

查看能否ping通

image-20220607214205913

Xshell远程访问

image-20220608122426566

修改windows的主机映射文件(hosts)

  1. 进入 C:\Windows\System32\drivers\etc 修改 hosts 文件

  2. 添加如下内容

    image-20220608181531541

  3. 之后就可以用主机名远程登录虚拟机

    image-20220608130422112

虚拟机安装epel-release

Extra Packages for Enterprise Linux 是为 “红帽系” 的操作系统提供额外软件包,适用于 RHEL、CentOS 和 Scientific Linux。相当于是一个软件仓库,大多数 rpm 包在官方 repository 中是找不到的。

1
[root@hadoop100 ~]# yum install -y epel-release

关闭防火墙、关闭防火墙开机自启

1
2
systemctl stop firewalld
systemctl disable firewalld.service

企业开发中,通常单个服务器的防火墙会关闭。公司整体对外会设置防火墙。

配置hadoop100用户root权限

方便后期加sudo执行root权限的命令

1
[root@hadoop100 ~]# vim /etc/sudoers

添加图中那一行,并配置切换到最高权限时,无需输入密码。

image-20220608133746371

切换到username用户测试

1
2
3
4
5
[username@hadoop100 ~]$ cd /opt/
[username@hadoop100 opt]$ rm -rf rh/
rm: 无法删除"rh/": 权限不够
[username@hadoop100 opt]$ sudo rm -rf rh/
[username@hadoop100 opt]$

在/opt目录下创建文件夹,并修改所属主和所属组

用来保存软件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[username@hadoop100 opt]$ sudo mkdir module
[username@hadoop100 opt]$ ll
总用量 0
drwxr-xr-x. 2 root root 6 6月 8 13:44 module
[username@hadoop100 opt]$ sudo mkdir software
[username@hadoop100 opt]$ ll
总用量 0
drwxr-xr-x. 2 root root 6 6月 8 13:44 module
drwxr-xr-x. 2 root root 6 6月 8 13:45 software
# 设置module、software文件夹所属主和组均为username用户
[username@hadoop100 opt]$ sudo chown username:username module/ software/
[username@hadoop100 opt]$ ll
总用量 0
drwxr-xr-x. 2 username username 6 6月 8 13:44 module
drwxr-xr-x. 2 username username 6 6月 8 13:45 software

卸载虚拟机自带JDK

如果是最小化安装不需要执行这一步

切换到root执行

1
2
# 删除jdk
rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
1
2
# 查看是否删除,执行后没有显示jdk则删除成功
rpm -qa | grep -i java

重启虚拟机

reboot

克隆三台虚拟机

克隆前请先关机

步骤:右键虚拟机—>管理—>克隆—>选择克隆虚拟机中的当前状态—>选择创建完整克隆。

依次创建hadoop102、hadoop103、hadoop104

修改这三台虚拟机的ip和主机名(以hadoop102为例)

  • 执行vim /etc/sysconfig/network-scripts/ifcfg-ens33修改ip为192.168.10.102
  • 执行vim /etc/hostname修改主机名为hadoop102
  • 执行reboot重启

将hadoop以及jdk导入hadoop102

image-20220608192522647

JDK安装

将jdk解压到module文件夹

1
[username@hadoop102 software]$ tar -zxvf jdk-8u231-linux-x64.tar.gz -C /opt/module/

进入profile.d目录中

1
cd /etc/profile.d/

创建my_env.sh文件来配置环境变量

1
[username@hadoop102 profile.d]$ sudo vim my_env.sh

内容如下:jdk1.8.0_231为jdk解压后生成的目录

1
2
3
# JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_231
export PATH=$PATH:$JAVA_HOME/bin

重新加载profile里头的文件并验证

1
2
3
4
5
6
[username@hadoop102 profile.d]$ source /etc/profile
[username@hadoop102 profile.d]$ java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
[username@hadoop102 profile.d]$

Hadoop安装

解压

1
2
3
4
5
6
[username@hadoop102 profile.d]$ cd /opt/software
[username@hadoop102 software]$ ll
总用量 519760
-rw-rw-r--. 1 username username 338075860 6月 8 19:25 hadoop-3.1.3.tar.gz
-rw-rw-r--. 1 username username 194151339 6月 8 19:24 jdk-8u231-linux-x64.tar.gz
[username@hadoop102 software]$ tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/

配置环境变量

1
[username@hadoop102 hadoop-3.1.3]$ sudo vim /etc/profile.d/my_env.sh

添加如下内容

1
2
3
4
# HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

重新加载

1
source /etc/profile

Hadoop运行模式

本地模式:单机运行

伪分布式模式:单机运行,但是具备Hadoop集群所有功能,一台服务器模拟分布式环境

完全分布式模式:多台服务器组成分布式环境。生产环境使用。

  1. 准备3台客户机(关闭防火墙、使用静态IP、配置主机名称)
  2. 安装JDK
  3. 配置环境变量
  4. 安装Hadoop
  5. 配置环境变量
  6. 配置集群
  7. 单点启动
  8. 配置ssh
  9. 群起并测试集群

本地运行模式案例(WordCount)

  1. 在hadoop-3.1.3文件下创建wcinput文件夹并在wcinput文件夹下创建word.txt文件

    1
    2
    3
    [username@hadoop102 hadoop-3.1.3]$ mkdir wcinput
    [username@hadoop102 hadoop-3.1.3]$ cd wcinput
    [username@hadoop102 wcinput]$ vim word.txt

    内容如下

    1
    2
    3
    4
    kk kk
    bobo
    scarf
    swj
  2. 回到Hadoop目录 /opt/module/hadoop-3.1.3 执行程序

    提示:对路径不熟可以边按tab查看边输入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [username@hadoop102 hadoop-3.1.3]$ bin/hadoop jar share/
    doc/ hadoop/
    [username@hadoop102 hadoop-3.1.3]$ bin/hadoop jar share/hadoop/
    client/ common/ hdfs/ mapreduce/ tools/ yarn/
    [username@hadoop102 hadoop-3.1.3]$ bin/hadoop jar share/hadoop/mapreduce/
    hadoop-mapreduce-client-app-3.1.3.jar hadoop-mapreduce-client-shuffle-3.1.3.jar
    hadoop-mapreduce-client-common-3.1.3.jar hadoop-mapreduce-client-uploader-3.1.3.jar
    hadoop-mapreduce-client-core-3.1.3.jar hadoop-mapreduce-examples-3.1.3.jar
    hadoop-mapreduce-client-hs-3.1.3.jar jdiff/
    hadoop-mapreduce-client-hs-plugins-3.1.3.jar lib/
    hadoop-mapreduce-client-jobclient-3.1.3.jar lib-examples/
    hadoop-mapreduce-client-jobclient-3.1.3-tests.jar sources/
    hadoop-mapreduce-client-nativetask-3.1.3.jar
    # wcinput/ 输入路径 ./wcoutput/ 输出路径且之前不能存在
    [username@hadoop102 hadoop-3.1.3]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput/ ./wcoutput/
  3. 结果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [username@hadoop102 hadoop-3.1.3]$ cd wcoutput
    [username@hadoop102 wcoutput]$ ll
    总用量 4
    -rw-r--r--. 1 username username 26 6月 8 21:02 part-r-00000
    -rw-r--r--. 1 username username 0 6月 8 21:02 _SUCCESS
    [username@hadoop102 wcoutput]$ cat part-r-00000
    bobo 1
    kk 2
    scarf 1
    swj 1

编写集群分发脚本xsync

scp(secure copy)安全拷贝

  1. 定义:实现服务器与服务器之间的数据拷贝

  2. 基本语法:

    1
    2
    scp       -r      $pdir/$fname  			   $user@$host:$pdir/$fname
    命令 递归 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
  3. 实操:

    前提在这三台服务器上都已经创建了/opt/module/opt/software 并且所属都为username:username(之前克隆时就解决了)

    将hadoop102中的jdk以及hadoop分发到Hadoop103以及hadoop104

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 在hadoop102中将jdk发给hadoop103
    [username@hadoop102 module]$ scp -r jdk1.8.0_231/ username@hadoop103:/opt/module/
    # 在hadoop103中拉取hadoop102中的hadoop
    [username@hadoop103 module]$ scp -r username@hadoop102:/opt/module/hadoop-3.1.3/ ./
    # 在hadoop103中将hadoop102的jdk拷贝到hadoop104中
    [username@hadoop103 module]$ scp -r username@hadoop102:/opt/module/jdk1.8.0_231/ username@hadoop104:/opt/module/
    # 之后给hadoop104传hadoop自选

    ## 可见scp使用不局限于哪台服务器

rsync远程同步工具

rsync主要用于备份与镜像。具有速度快、避免复制相同内容和支持符号链接的优点。

1)rsync与scp区别:用rsync做文件复制要比scp的速度快,rsync只对差异文件做更新,scp是把所有文件都复制过去

2)基本语法

1
2
rsync	-av		$pdir/$fname		$user@$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称

选项参数

选项 功能
-a 归档拷贝
-v 显示复制过程

3)实操

删除hadoop103中的wcinput以及wcoutput文件夹

1
[username@hadoop103 hadoop-3.1.3]$ rm -rf wcinput/ wcoutput/

将hadoop102中的hadoop-3.1.3整个目录同步到hadoop103对应目录中

1
[username@hadoop102 module]$ rsync -av hadoop-3.1.3/ username@hadoop103:/opt/module/hadoop-3.1.3/

xsync集群分发脚本

1)需求:循环复制文件到所有节点的相同目录下

2)编写代码:

在hadoop102家目录下的bin文件夹中创建xsync文件

1
2
3
4
[username@hadoop102 ~]$ cd /home/username
[username@hadoop102 ~]$ mkdir bin
[username@hadoop102 ~]$ cd bin
[username@hadoop102 bin]$ vim xsync

文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash

#1.判断参数个数
# 如果参数小于1,退出
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi

#2.遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
echo ======================= $host =======================
#3.遍历所有目录,挨个发送
# $@表示所有需要分发的文件 eg: xsync a.txt xsync b.txt
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可执行权限

1
[username@hadoop102 bin]$ chmod 777 xsync

3)实操

如果xsync不能使用,执行以下代码

1
[hadoop@hadoop102 bin]$ sudo cp xsync /bin

分发当前bin目录

1
xsync bin/

效果:

image-20220608231159386

分发环境变量

1
2
# 需要root权限,所以加上sudo,相当于代替root执行,所以得加上绝对路径./bin/xsync
[username@hadoop102 ~]$ sudo ./bin/xsync /etc/profile.d/my_env.sh

之后在hadoop103、hadoop104中执行

1
source /etc/profile

ssh免密登录

查看家目录的文件(包含隐藏文件),如果之前没有使用过ssh命令则不会有.ssh

1
[username@hadoop102 ~]$ ls -al

image-20220608233228732

进入.ssh文件夹执行ssh-keygen -t rsa回车三次生成公私钥

image-20220608233433925

ll查看

image-20220608233633618

将公钥拷贝到hadoop103和hadoop104

1
2
[username@hadoop102 .ssh]$ ssh-copy-id hadoop103
[username@hadoop102 .ssh]$ ssh-copy-id hadoop104

之后hadoop102就可免密登录hadoop103和hadoop104

1
2
[username@hadoop102 .ssh]$ ssh hadoop103
[username@hadoop102 .ssh]$ ssh hadoop104

但是不能免密访问自己,所以还得将公钥发给自己

1
[username@hadoop102 .ssh]$ ssh-copy-id hadoop102

hadoop103、hadoop104做相同操作后即可实现集群服务器之间免密登录,但是仅限于配置的用户之间,如果切换到root则不能免密,想免密就得再配置。现在进行xsync分发就不必再输入密码

image-20220608235454163

集群配置

1)集群部署规划

NameNodeSecondaryNameNode 不要配置在同一台服务器

ResourceManager 很耗内存,不要和 NameNodeSeconddaryNameNode 配置在同一台服务器上

hadoop102 Hadoop103 Hadoop104
HDFS NameNode、DataNode DataNode SecondaryNameNode、DataNode
YARN NodeManager ResourceManager、NodeManager NodeManager

2)配置文件说明

默认配置文件:

默认文件 文件存放在Hadoop的jar包中
core-default.xml hadoop-common-3.1.3.jar/core-default.xml
hdfs-default.xml hadoop-hdfs-3.1.3.jar/hdfs-default.xml
yarn-default.xml hadoop-yarn-common-3.1.3.jar/yarn-default.xml
mapred-default.xml hadoop-mapreduce-client-core-3.1.3.jar/mapred-default.xml

自定义配置文件:

core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml 四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改。

3)配置集群

配置core-site.xml

1
2
[username@hadoop102 ~]$ cd $HADOOP_HOME/etc/hadoop
[username@hadoop102 hadoop]$ vim core-site.xml

内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<configuration>
<!--指定NameNode的地址-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<!--指定hadoop数据的存储目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!--配置HDFS网页登录使用的静态用户为username-->
<property>
<name>hadoop.http.staticuser.user</name>
<value>username</value>
</property>
</configuration>

配置hdfs-site.xml

1
[username@hadoop102 hadoop]$ vim hdfs-site.xml

内容:

1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
<!--nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<!--2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>

配置yarn-site.xml

1
[username@hadoop102 hadoop]$ vim yarn-site.xml

内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<configuration>
<!--指定MR走shuffle-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--指定ResourceManager地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</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_MAPRED_HOME</value>
</property>
</configuration>

配置mapred-site.xml

1
[username@hadoop102 hadoop]$ vim mapred-site.xml

内容:

1
2
3
4
5
6
7
<configuration>
<!--指定MapReduce程序运行在Yarn上-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

分发配置文件

1
2
[username@hadoop102 hadoop]$ cd ..
[username@hadoop102 etc]$ xsync hadoop/

群起集群并测试

  1. 配置workers

    1
    [username@hadoop102 ~]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/workers

    内容:

    不允许有空行,结尾不能有空格。

    1
    2
    3
    hadoop102
    hadoop103
    hadoop104

    同步所有节点配置文件

    1
    2
    [username@hadoop102 ~]$ cd /opt/module/hadoop-3.1.3/etc/hadoop/
    [username@hadoop102 hadoop]$ xsync workers
  2. 启动集群

    如果集群是第一次启动,需要在 hadoop102 节点格式化 NameNode(格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找不到以往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停止 namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化。)

    格式化集群:成功的话会在hadoop-3.1.3目录下生成data和logs目录

    1
    2
    [username@hadoop102 hadoop]$ cd /opt/module/hadoop-3.1.3
    [username@hadoop102 hadoop-3.1.3]$ hdfs namenode -format

    启动集群:

    1
    [username@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh

    之后可通过jps命令查看启动情况

    访问hadoop102:9870

    image-20220609012736770

  3. 在配置了ResourceManager的节点(hadoop103)启动Yarn

    1
    2
    [username@hadoop103 ~]$ cd $HADOOP_HOME
    [username@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh

    访问hadoop103:8088

    image-20220609014327049

  4. 集群的基本测试

    上传文件到集群

    上传小文件

    1
    2
    [username@hadoop102 ~]$ hadoop fs -mkdir /input
    [username@hadoop102 ~]$ hadoop fs -put $HADOOP_HOME/wcinput/word.txt /input

    效果

    image-20220609114955837

    上传大文件

    1
    [username@hadoop102 ~]$ hadoop fs -put /opt/software/jdk-8u231-linux-x64.tar.gz /

    效果

    image-20220609121049468

    文件的存储路径:

    1
    $HADOOP_HOME/data/dfs/data/current/BP-1767647801-192.168.10.102-1654708206348/current/finalized/subdir0/subdir0

    image-20220609122157168

    运行wordcount案例

    1
    [username@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /ouput

    image-20220609123220125