Hadoop

概念

是什么

分布式系统基础架构,主要解决海量数据的储存和分析计算

发行版本

  1. Apache:阿帕奇,免费,首发
  2. Cloudera:封装阿帕奇,集成了很多大数据框架,收费,21年合二为一,形成CDP
  3. Hortonworks:封装阿帕奇,集成了很多大数据框架,收费,21年合二为一,形成CDP

优势

高可靠性:底层维护多个数据副本

高拓展性:在集群间分配任务,可拓展数以千计的节点

高效:并行工作

高容错:自动将错误的任务

组成

  • 1.x:common(辅助工具)+HDFS(数据储存)+MapReduce(计算+资源调度)
  • 2.x:common+HDFS+MapReduce(计算)+yarn(资源调度)
  • 3.x:同2.x

HDFS架构

  1. NameNode:储存文件的元数据。如文件名,文件结构目录,文件属性,每个文件的块列表和块所在的DataNode等
  2. DataNode:储存文件块数据以及块数据的校验和
  3. Secondary NameNode(2nn):每隔一段时间对NameNode元数据备份

YARN架构

  1. ResourceManager(RM):管理整个集群
  2. NodeManager(NM):管理单个节点服务器
  3. APPlicationMaster(AM):管理单个任务运行
  4. Container:容器(相当于一台服务器)里面封装了任务运行需要的资源(内存,CPU,磁盘,网络等)
  5. client:客户端用户

MapReduce

Map阶段:并行处理输入的数据

Reduce阶段:对Map结果进行汇总

三者的运行关系

  1. client发布任务给RM,
  2. RM找一个NM开启一个container,
  3. container运行一个AM,
  4. AM向RM申请计算需要的资源,
  5. RM接收到之后开启需要的各NM的容器container,
  6. 各NM的容器container各运行Map阶段的Map Task,
  7. Map Task在各自的DataNode中查找,
  8. 各Map Task将结果返回NM的容器container的Reduce Task ,
  9. Reduce 阶段会将结果写入新的DataNode并且返回给NameNode,
  10. 2nn进行备份

生态

推荐系统案例

环境准备

模版虚拟机准备

  1. 安装VM,创建虚拟机

  2. 自定义模式

  3. 稍后安装操作系统

  4. 处理器2,内核2,内存4,磁盘50

  5. 设置cd镜像

  6. 启动,设置手动分区

  7. 添加/boot为1g,文件系统为ext4

  8. 添加swap为4g

  9. /为剩下系统盘

  10. 关闭KDUMP

  11. 配置VM的网络选择NAT模式和子网网段都为10

  12. 配置Windows设备中的VMnet8网卡的ip等也为10网段,网关为2

  13. 配置虚拟机网络

    修改BOOTPROTO=”static”

    再最后添加

    IPADDR=192.168.10.100

    GATEWAY=192.168.10.2

    DNS1=192.168.10.2

  14. 修改主机名称 vi /etc/hostname 为hadoop100

  15. 配置ip和主机名映射 vi /etc/hosts 添加

    1
    2
    3
    4
    5
    6
    7
    8
    9
    192.168.10.100 hadoop100
    192.168.10.101 hadoop101
    192.168.10.102 hadoop102
    192.168.10.103 hadoop103
    192.168.10.104 hadoop104
    192.168.10.105 hadoop105
    192.168.10.106 hadoop106
    192.168.10.107 hadoop107
    192.168.10.108 hadoop108
  16. reboot重启

  17. 在电脑C:\Windows\System32\drivers\etc中也找到hosts,添加

    1
    2
    3
    4
    5
    6
    7
    8
    9
    192.168.10.100 hadoop100
    192.168.10.101 hadoop101
    192.168.10.102 hadoop102
    192.168.10.103 hadoop103
    192.168.10.104 hadoop104
    192.168.10.105 hadoop105
    192.168.10.106 hadoop106
    192.168.10.107 hadoop107
    192.168.10.108 hadoop108
  18. 备份原有 yum 源配置

    1
    cp -r /etc/yum.repos.d /etc/yum.repos.d.bak
  19. 打开配置文件

    1
    2
    vi /etc/yum.repos.d/CentOS-Base.repo

  20. 替换为以下配置

    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
    [base]
    name=CentOS-7 - Base - aliyun
    baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/os/x86_64/
    gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-7

    [updates]
    name=CentOS-7 - Updates - aliyun
    baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/updates/x86_64/
    gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-7

    [extras]
    name=CentOS-7 - Extras - aliyun
    baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/extras/x86_64/
    gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-7

    [centosplus]
    name=CentOS-7 - Plus - aliyun
    baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/centosplus/x86_64/
    gpgcheck=1
    enabled=0
    gpgkey=https://mirrors.aliyun.com/centos-vault/RPM-GPG-KEY-CentOS-7

  21. 清理并重建 yum 缓存

    1
    2
    yum clean all
    yum makecache
  22. 安装以下软件

    1
    2
    3
    4
    yum install -y epel-release
    yum install -y vim
    yum install -y net-tools
    yum install -y rsync
  23. 关闭防火墙和自启动

    1
    2
    systemctl stop firewalld
    systemctl disable firewalld.service
  24. 配置用户权限

    1
    2
    3
    4
    vim /etc/sudoers

    在%wheel下面添加一行
    yzf522 ALL=(ALL) NOPASSWD:ALL
  25. 在/opt目录下创建 module software文件夹,并且修改所属主和组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mkdir /opt/module 
    mkdir /opt/software

    修改所有者和组均为yzf522
    chown yzf522:yzf522 /opt/module
    chown yzf522:yzf522 /opt/software

    查看
    cd /opt/
    ll
  26. reboot重启

克隆

完整克隆Hadoop102,103,104

各修改ip和主机名

安装JDK

在hadoop102安装,cd进入/opt/software
将软件用xftp传入,并且解压到/opt/module/

1
tar -zxvf OpenJDK8U-jdk_x64_linux_hotspot_8u504b01.tar.gz -C /opt/module/

添加环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
#cd 到环境变量目录
cd /etc/profile.d

#创建一个环境变量文件
sudo vim my_env.sh

添加内容
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_202
export PATH=$PATH:$JAVA_HOME/bin

执行加载环境变量
source /etc/profile

安装Hadoop

同样安装好之后配置环境变量

1
2
3
4
5
6
7
8
#HADOOP_HAME
export HADOOP_HAME=/opt/module/hadoop-3.3.0
export PATH=$PATH:$HADOOP_HAME/bin

export PATH=$PATH:$HADOOP_HAME/sbin

执行加载环境变量
source /etc/profile

Hadoop集群搭建

本地模式

数据储存中Linux本地,测试偶尔用一下

在hadoop文件夹里面创建一个文件夹wcinput

在wcinput中创建一个文件word.txt

里面写一些名称

现在要统计名称出现次数

1
2
3
4
5
6
#创建完成之后回到hadoop的文件夹
执行 名为examples的jar命令 计算模式为wordcount,输入地址为wcinput/ ,输出地址为./wcoutput


hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount wcinput/ ./wcoutput

打开wcoutput文件夹,有2个文件,一个是标记(0内存),一个是计算结果(有内存)

注意:输出地址是不能存在的,不然报错

完全分布式集群

SCP完全安全拷贝

是完全增量拷贝,会拷贝一整份,用途广泛,可以推,可以拉,可以当中间机,推拉其他主机

推的语法:scp -r /opt/module/hadoop-3.3.0/ yzf522@hadoop103:/opt/module/

解析:scp 递归文件 源文件地址 目标地用户@主机:目的地地址

拉的语法:scp -r yzf522@hadoop102:/opt/module/hadoop-3.3.0/ /opt/module/

解析:scp 递归文件 出发地用户@主机:文件地址 目的地地址

中间语法:scp -r yzf522@hadoop102:/opt/module/hadoop-3.3.0/ yzf522@hadoop103:/opt/module/

解析:scp 递归文件 出发地用户@主机:文件地址 目标地用户@主机:目的地地址

实验:

1.在102将jdk推到103

1
scp -r /opt/module/jdk8u504-b01/ yzf522@hadoop103:/opt/module/

2.在103将hadoop从102拉过来

1
scp -r yzf522@hadoop102:/opt/module/hadoop-3.3.0  /opt/module/

3.在103,将102的2个文件推到104

1
scp -r yzf522@hadoop102:/opt/module/* yzf522@hadoop104:/opt/module/

rsync增量同步工具

rsync是一个同步工具,不是拷贝整个文件,关于地址部分和scp相同

语法:rsync -av /opt/module/hadoop-3.3.0/ yzf522@hadoop103:/opt/module/

解析:rsync a归档拷贝 v显示拷贝内容 源文件地址 目标地用户@主机:目的地地址

实验:

1.删除103hadoop内的wc2个文件夹

2.在102将Hadoop同步到103,以恢复wc

1
rsync -av /opt/module/hadoop-3.3.0/ yzf522@hadoop103:/opt/module/hadoop-3.3.0/

xsync集群

这是集成封装rsync的命令,可以简化输入一大串代码进行同步

原理:循环复制文件到所有节点的相同目录下

在102的yzf522家目录下 添加一个a.txt文件和一个bin目录,进入bin创建一个xsync文件

1
2
3
4
5
cd /home/yzf522
touch a.txt
mkdir bin
cd 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/bin/bash
# ==============================================
# 脚本功能:将本地文件/目录,批量同步到集群所有节点
# 使用方法:xsync 要同步的文件1 [文件2 文件3 ...]
# 适用集群:hadoop102、hadoop103、hadoop104
# ==============================================

# 1. 参数校验:判断用户有没有传入要同步的文件
# $# = 传入脚本的参数个数
# -lt = less than 小于
if [ $# -lt 1 ]
then
echo "错误:请传入要同步的文件路径!"
echo "用法:xsync 文件名/目录名"
# 退出脚本,状态码1表示异常退出
exit 1
fi

# 2. 遍历集群中所有主机,逐个同步
# 把你集群所有主机名列在这里,有多少台加多少台
for host in hadoop102 hadoop103 hadoop104
do
echo "=================== 正在同步到 $host ==================="

# 3. 遍历用户传入的每一个文件/目录,挨个同步
# $@ = 所有传入的参数,也就是所有要同步的文件路径
for file in $@
do
# 4. 判断当前文件/目录在本地是否存在
# -e = exist 判断文件/目录是否存在
if [ -e $file ]
then
# 5. 获取文件所在目录的绝对路径
# dirname $file:取出文件的父目录路径
# cd -P:如果是软链接,切换到真实物理路径
# pwd:打印当前绝对路径
pdir=$(cd -P $(dirname $file); pwd)

# 6. 获取文件/目录本身的名称(不带路径)
fname=$(basename $file)

# 7. 在远程主机上,先创建对应的目录(不存在才创建,存在也不报错)
# mkdir -p:递归创建目录,父目录不存在自动创建
ssh $host "mkdir -p $pdir"

# 8. 使用rsync同步文件到远程主机对应目录
# -a:归档模式,保留权限、时间等所有属性
# -v:显示同步过程详情
rsync -av $pdir/$fname $host:$pdir
else
# 文件不存在时的提示
echo "警告:文件/目录【$file】不存在,跳过同步!"
fi
done
done

添加可执行权限 ,ll会发现变绿

1
chmod 777 xsync

同步bin目录

1
2
cd
xsync bin/

将前面的环境变量也同步,由于需要root权限,但是xsync在yzf522下,没有配置全局环境,root权限找不到xsync的地址,所以加上xsync的详细地址

1
2
sudo ./bin/xsync /etc/profile.d/my_env.sh 

103和104执行

1
source  /etc/profile

ssh无密码登录配置

两台服务器之间会各自生成一对公钥和私钥,将公钥相互保存在授权的文件夹之后,即可免密通信,102将信息通过A私钥加密发送给103,103用A公钥将102需要的信息用A公钥加密发回102,102要通过A私钥才能解密获取到

在102执行进入ssh文件夹,创建秘钥对,按3下回车即可

1
2
3
4
5
6
7
8
ll -al
cd .ssh/
ssh-keygen -t rsa

#将公钥复制到别的主机的授权文件夹,包括自己
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104

分别在103和104是同样执行

在102上同步a.txt测试效果

1
xsync a.txt

配置集群

注意:

NameNode和secondaryNameNode不要安装在同一个服务器上

resourcemanager也很消耗内存,不要NameNode和secondaryNameNode配置在一台服务器

配置安排:

Hadoop102 Hadoop103 Hadoop104
HDFS NameNode
DataNode
DataNode SecondaryNameNode
DataNode
YARN NodeManager ResourceManager
NodeManager
NodeManager

配置文件说明:

Hadoop配置文件分为2类:默认配置文件和自定义配置文件。只有用户需要修改某一默认配置值的时候,才需要修改自定义配置文件,更改相应属性值

默认配置文件:

要获取的默认文件 存放在Hadoop的jar包中的位置
core-default.xml hadoop-common-3.1.3.jar/core-default.xml
bdfs-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四个配置文件存放在

/opt/module/hadoop-3.3.0/etc/hadoop 这个路径上,用户可以根据项目需求重新进行修改配置。

执行:

1
2
3
cd /opt/module/hadoop-3.3.0/etc/hadoop 

#找到自定义配置文件:core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml

配置core-site.xml:

1
vim core-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#在<configuration>
#中间添加下面内容
#</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.3.0/data</value>
</property>

配置hdfs-site.xml:

1
vim hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
<!-- 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>

配置yarn-site.xml:

1
vim yarn-site.xml
1
2
3
4
5
6
7
8
9
10
<!-- 指定 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>

配置mapred-site.xml:

1
vim mapred-site.xml
1
2
3
4
5
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

同步到103104

1
xsync hadoop/

启动集群

同样在Hadoop的etc中,编辑workers文件,删除localhost,添加集群节点名称,有多少节点就添加多少,不可以出现空格和空行
然后同步

1
2
3
4
5
6
7
vim workers

hadoop102
hadoop103
hadoop104

xsync workers

初始化集群(第一次启动的才需要)

1
hdfs namenode -format

获取id

常见错误以及解决方案