大数据课程————Hadoop

hadoop搭建

  1. 环境搭建:利用分发脚本在所有服务器上部署java和hadoop
  2. 组件部署:三个重要组件分别部署在三台服务器上,并修改配置文件
  3. 启动集群并测试功能:格式化后分别启动组件并上传文件,配置历史服务器和日志功能

服务器相关概念
类型:文件服务器、数据库服务器、WEB服务器
特点:高处理能力、高扩展性、高可靠性
服务器磁盘
机械硬盘:
SCSI接口硬盘,早期使用,已停售,1w转/min
SAS接口硬盘:提升,1.5w转/min
STAT硬盘:串口硬盘,主流硬盘带纠错、降噪功能,7200转/min
固态硬盘:
SSD硬盘:贵,性能高
交换机:
存储转发设备,交换式集线器,扩展端口功能、物理编址……
网卡:
以太网网卡,PCI总线接口服务器一般使用千兆网卡
机架:
存储服务器主机的机柜。通信使用交换机
IDC数据中心:
电信部门为企业做托管
Radi磁盘阵列:
独立磁盘冗余阵列,最新的Raid5,将校验的数据分布在所有磁盘上,基本满足大部分需求,主流用品
Hadoop
概念:分布式系统基础架构,主要解决海量数据的存储和分析计算,广义上指的是Hadoop生态圈
三大发行版本
Apache:基础版本(2006)
Cloudera:继承大数据框架,产品CDH(2008)
Hortonworks:文档较好,HDP(2011)
优势
高可靠性,底层多个数据副本,某计算单元故障不会丢失
高扩展性,集群间分配任务数据,动态扩展节点
高效性,Hadoop是并行工作,加快任务处理速度
搞容错性,自动将失败的任务重新分配
Hadoop 1.x、2.x和3.x
1.x:MapReduce(计算+资源调度);HDFS(数据存储);Common(辅助工具)
2.x:MapReduce(计算);Yarn(资源调度);HDFS(数据存储);Common(辅助工具)
3.x:在组成上和2代没有区别,有其他区别
HDFS架构
NameNode(nn):存储文件的元数据,如文件名、目录结构、文件属性,以及每个文件的块列表和块所在的DataNode
DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和
Secondary NameNode(2nn):每隔一段时间对nn元数据备份
YARN架构概述
另一种资源协调者,是Hadoop的资源管理器
Resourceanager(RM):整个集群资源(内存CPU等)的总管,存在多个客户端提交job让其运行
NodeManager(NM):单个节点服务器的资源老大,一个节点可有多个Container
ApplicationMaster(AM):单个任务运行的老大
Container:容器,相当于一台独立的服务器,封装了任务运行所需的内存CPU磁盘网络等
MapReduce架构
MapReduce将计算分为两个阶段:Map和Reduce,Map阶段是并行处理输入数据,Redce是对Map结果进行汇总
HDFS、YARN、MapReduce三者关系
HDFS是基础的架构,NameNode记录元数据,DataNode是存储单元,2nn负责备份数据。客户端向集群提交一个任务,YARN中的ResourceManager会寻找其中一个节点服务器的NodeManager,开启一个Container,将任务放在ApplicationMaster中运行,AM向RM申请运行资源,在节点中寻找到合适资源后开启资源,由AM开启MapTask,这就是Map阶段,每一个MapTask独立工作,检索后返回结果写入磁盘上,形成一个ReduceTask,NameNode再次进行记录操作
大数据生态体系
数据来源层:数据库(结构化)、文件日志(半结构化)、视频、PPT等(非结构化)
数据传输层:Sqoop数据传递、Flime日志收集、Kafka消息队列(也可整理结构化与非结构化)
数据存储层:HDFS文件存储(结构、非结构)、HBase(非结构)
资源管理层:YRAN资源管理
数据计算层:MapReduce(离线计算、Hive数据查询)、SparkCore(内存计算、SparkMlib数据挖掘、SparkSql数据查询、SparkStreaming、Flink实时计算)
任务调度:Oozie任务调度、Azkaban任务调度器
整个数据平台的调度者:Zookeeper
业务层:叶树模型、数据可视化、业务应用
案例:在电商购买推荐的商品:用户操作——Nginx埋点获取访问日志——产生数据存储至文件日志——Flume日志收集——Kafka进行缓冲——Flink云计算并返回结果至数据库——后台读取分析数据,并返回推荐页给用户

前置工作:
VM虚拟机、linux初始化、XShell远程等
磁盘分区:/boot分1G,/swap分4G,/分45G,装好之后给虚拟机创建初始快照
设置固定IP网关DNS:
vi /etc/sysconfig/network-scripts/ifcfg-ens33
将DHCP改成static
末尾添加
IPADDR=192.168.200.10x
GATWAT=192.169.200.2
NDS1=192.168.200.2
vi /etc/hosts 末尾添加:
192.168.200.100 hadoop100
192.168.200.101 hadoop101
192.168.200.102 hadoop102
192.168.200.103 hadoop103
192.168.200.104 hadoop104
192.168.200.105 hadoop105
-———————————–虚拟机快照由此结束————————————-
虚拟机基础工具:
yum install -y epel-release安装应用商店
yum install -y net-tools安装工具包
yum install -y vim 安装vim
添加部署java和hadoop
tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module解压java
tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/解压hadoop
前往/etc/profile.d新建my_env.sh脚本,脚本中加入java、hadoop环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
export
JAVA_HOME=/opt/module/jdk1.8.0_212
export
PATH=
$PATH
:
$JAVA_HOME
/bin
#HADOOP_HOME
export
HADOOP_HOME=/opt/module/hadoop-3.1.3
export
PATH=
$PATH
:
$HADOOP_HOME
/bin
export
PATH=
$PATH
:
$HADOOP_HOME
/sbin

添加后source /etc/profile即可
hadoop文件分析
hadoop/bin目录中存储和HDFS、Yran、Mapred相关执行文件
hadoop/etc/hadoop目录中存储的xx-site.xml、workers相关
hadoop/sbin目录中一些集群功能开关相关脚本
hadoop/lib/native目录中存储的本地动态链接库,压缩功能会需要
hadoop运行模式

  • Local (Standalone) Mode linux本地存储模式,一般测试用,企业不会用
  • Pseudo-Distributed Mode 伪分布式模式,数据存储在HDFS上
  • Fully-Distributed Mode 完全分布式模式,公司一般使用的

scp拷贝文件至其他服务器,首次迁移使用
基本语法:
scp:命令,实现服务器与服务器之间的拷贝
-r :递归
pdir/pdir/fname:源文件地址路径/名称
user@user@host:pdir/pdir/fname:目的地用户@主机:目的地路径/名称
例如:
scp -r ./jdk1.7/ root@hadoop103:/opt/module(将102本地推送至103),或
scp -r root@hadoop103:/opt/module/jdk1.7/ ./module(将远端102拉取至103)
rsync同步文件至其他服务器,速度较快,修改文件后使用
基本语法:
rsync:命令,实现服务器与服务器之间的文件同步
-av:归档拷贝并显示复制过程
例如:
rsync -av hadoop-3.1.3/ root@hadoop103:/opt/module/hadoop-3.1.3/ 将本地hadoop文件同步至103上
注意:需要双方同时安装了rsync才可以执行操作
利用rsync实现同步分发 格式:xsync xxx,即可分发至所有指定服务器
注意:想要全局使用xsync必须满足以下条件:

  1. 文件为可执行文件,即授权777
  2. 将xsync上层路径添加至全局环境变量中,即/etc/profile,但这个文件千万不能乱改,否则出了cd其他命令都会失效,补救方法如下:
  3.  1. 初始化path:export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin
    
    1. 使用vi重新修改PATH,将错误的地方改掉:/bin/vi /etc/profile ,并重新source /etc/profile

脚本代码:

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
57
58
59
60
61
62
63
64
65
66
67
#!/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

该脚本缺陷:ssh时需要重复验证密码,不能一次到位,相当麻烦。因此需要使用ssh免登录
ssh免密登录
普通情况下通过ssh其他服务器需要输入目标服务器密码,但也可以通过密钥来实现免密登录(注:未主动使用ssh命令的机器没有.ssh文件)

  1. 在当前用户下的.ssh/下输入ssh-keygen -t rsa注册密钥,则在.ssh/下生成id_rsa私钥和id_rsa.pub公钥,还有一个存放目标节点的公钥集合文件known_hosts
  2. 输入ssh-copy-id xxxx将公钥拷贝至目标服务器,首次需要输入密码,以后即可无密访问。若想访问服务器本身,也许这样操作
  • 被无密访问过的服务器会在.ssh/生成一个authorized_keys文件,存放允许访问它的服务器;而known_hosts存放着它能够无密访问的其他服务器
  • 主动无密访问其他节点的服务器才会有密钥

注意:防火墙关闭(centOS7):
查看防火墙状态: systemctl status firewalld
永久关闭防火墙: systemctl disable firewalld
重启防火墙: systemctl enable firewalld
关闭防火墙开机自启: systemctl disable firewalld.service
集群部署规划
原则:NameNode、SecondaryNameNode和ResourceManager很耗内存,不要安装在同一个台机器上

| hadoop102 | hadoop103 | hadoop104
—|—|—|—
HDFS | NameNodeDataNode | DataNode | SecondaryNameNodeDataNode
YARN | NodeManager | ResourceManagerNodeManager | NodeManager
默认配置文件:官网下载,存放在Hadoop的jar包中
自定义配置文件:$HADOOP_HOME/etc/hadoop位置下的core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml文件
根据自己需要,参照默认配置文件,将自定义配置文件修改
配置集群

  • 核心配置文件core-site.xml

    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
    57
    58
    59
    60
    61
    62
    63
    <!-- 指定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网页登录使用的静态用户为root -->
    <
    property
    >
    <
    name
    >
    hadoop.http.staticuser.user
    </
    name
    >
    <
    value
    >
    root
    </
    value
    >
    </
    property
    >
  • HDFS配置文件 hdfs-site.xml

    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
    <!-- 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配置文件yarn-site.xml

    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
    57
    58
    59
    60
    61
    62
    63
    <!-- 指定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
    >
  • MapReduce配置文件 mapred-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <!-- 指定MapReduce程序运行在Yarn上 -->
    <
    property
    >
    <
    name
    >
    mapreduce.framework.name
    </
    name
    >
    <
    value
    >
    yarn
    </
    value
    >
    </
    property
    >
  • $HADOOP_HOME/etc/hadoop/woekers中的localhost改成

    1
    2
    3
    hadoop102
    hadoop103
    hadoop104
  • 使用分发脚本xsync将当前改动分发至所有服务器

启动集群
首次启动集群需要使用hdfs namenode -format进行格式化,注意格式化必须停止所有进程(stop-all.sh)并删除所有机器的data和logs目录,再进行格式化

  • 启动HDFS:sbin/start-dfs.sh

此处教程是用子用户操作的,而我这边直接用在root下操作,所以有些地方需要修改
针对root用户的问题,在start-dfs.sh,stop-dfs.sh中分别添加
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
使用jps查看当前java相关的进程:
7281 Jps
6948 DataNode
6812 NameNode
浏览器输入hadoop102:9870 查看HDFS上存储的数据信息

  • 在配置了ResourceManager的服务器中启动YARN:sbin/start-yarn.sh

同样针对root用户,在start-yarn.sh和stop-yarn.sh中添加

1
2
3
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

用jps查看yarn节点中的进程
2609 DataNode
3089 NodeManager
3420 Jps
2958 ResourceManager
浏览器中输入hadoop103:8088 查看YARN运行的job信息
集群基本测试

  • 上传文件到集群

​ hadoop fs -mkdir /input 在/目录下创建一个input文件夹
​ hadoop fs -put $HADOOP_HOME/wcinput/word.txt /input 将word.txt上传到/input下

  • 查看HDFS文件存储路径

​ 不太清楚是什么原因,教程中的文件在102、103和104中都各自存了一份,而我的文件却只有在104是完整的,103是不完整的,102就压根没有这个文件夹。在103和104中,在104确实是能够cat出来看到源文件的上传的文件分成多个文件块存储在一起,文本文件可直接cat查看,gz压缩包则需要使用cat输出重定向至当前文件夹,然后才可正常解压:cat xxx>> xxx.tar.gz
问题:web端尝试删除上传的文件时,出现“Permission denied: user=dr.who, access=READ_EXECUTE, inode=“/user”:root:supergroup:drwx-wx-wx”。这样的话直接在core-site.xml中添加以下配置即可

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
<!-- 当前用户全设置成root -->
<
property
>
<
name
>
hadoop.http.staticuser.user
</
name
>
<
value
>
root
</
value
>
</
property
>
<!-- 不开启权限检查 -->
<
property
>
<
name
>
dfs.permissions.enabled
</
name
>
<
value
>
false
</
value
>
</
property
>

问题警告:

  1. 存储位置会跳来跳去,不是固定是3等份!!!!但是删除后又好了,原因不明,新问题是元数据重新压缩后解压出现错误,原因不明
  2. 有出现过上传的文件只在102中有,103和104找不到的情况,还有web页面打不开(已解决,防火墙的问题,关闭后需要重启)。

  • 运行hadoop自带的hadoop-mapreduce-examples.jar来测试,将文件上传后预览

hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput
注意:
此处的wordcount是类似结果的变量(但在HDFS内没看到这个名字)
这里填写的是输入输出地址,即/wcinput 和 /wcoutput。其中wcinput需要已存在于HDFS上,而wxoutput不能提前创建,否则会报错 。这个逻辑很奇怪,后面再看看什么原因,并且由于我分配的内存过小,在计算时有杀掉一些其他进程,导致无法预览,这个现在也不看,评论区有加内存的博客地址,需要的话随时去看
集群崩溃处理办法
先停止yarn和hdfs,再将所有集群节点的$HADOOP_HOME下的/data和/logs文件夹删除,最后重新格式化HDFS即可
sbin/stop-yarn.sh
sbin/stop-dfs.sh
rm -rf data/ logs/
hdfs namenode -format
注意:DataNode版本号相关,没听懂,与数据版本相关
配置历史服务器与日志聚集功能
历史服务器配置成功后,在程序运行完成后的yarn前端页面可查看其历史运行情况
日志功能配置成功后,可在历史运行情况页面打开logs,方便分析运行情况
在mapred-site.xml中添加以下参数后,分发至各个节点:

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
<!-- 历史服务器端地址 -->
<
property
>
<
name
>
mapreduce.jobhistory.address
</
name
>
<
value
>
hadoop102:10020
</
value
>
</
property
>
<!-- 历史服务器web端地址 -->
<
property
>
<
name
>
mapreduce.jobhistory.webapp.address
</
name
>
<
value
>
hadoop102:19888
</
value
>
</
property
>

在yarn-site.xml中添加以下参数后,分发至各个节点:

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
57
58
59
60
61
62
<!-- 开启日志聚集功能 -->
<
property
>
<
name
>
yarn.log-aggregation-enable
</
name
>
<
value
>
true
</
value
>
</
property
>
<!-- 设置日志聚集服务器地址 -->
<
property
>
<
name
>
yarn.log.server.url
</
name
>
<
value
>
http://hadoop102:19888/jobhistory/logs
</
value
>
</
property
>
<!-- 设置日志保留时间为7天 -->
<
property
>
<
name
>
yarn.log-aggregation.retain-seconds
</
name
>
<
value
>
</
value
>
</
property
>

开启历史服务器和日志聚集功能之前,先将HDFS和YARN重启一遍,再在102中启动。启动后即可在jps中查看历史服务器进程,日志聚集不会产生进程,会从下次任务开始生成日志:
$HADOOP_HOME/bin/mapred –daemon start historyserver
HDFS/YARN的两种开关方式

  • 整体开关:start/stop-dfs.sd;start/stop-yarn.sh
  • 单节点开关:hdfs –daemon start/stop namenode/datanode/secondarynamenode;yarn ==daemon start/stop resourcemanager/nodemanager

hadoop集群常用脚本

  • 集群组件开关脚本:统一开关HDFS、YARN、historyserver、logs

    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
    #!/bin/bash
    if
    [
    $#
    -lt 1 ]
    then
    echo
    "No Args Input..."
    exit
    ;
    fi
    case
    $1
    in
    "start"
    )
    echo
    " =================== 启动 hadoop集群 ==================="
    echo
    " --------------- 启动 hdfs ---------------"
    ssh hadoop102
    "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
    echo
    " --------------- 启动 yarn ---------------"
    ssh hadoop103
    "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
    echo
    " --------------- 启动 historyserver ---------------"
    ssh hadoop102
    "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
    ;;
    "stop"
    )
    echo
    " =================== 关闭 hadoop集群 ==================="
    echo
    " --------------- 关闭 historyserver ---------------"
    ssh hadoop102
    "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
    echo
    " --------------- 关闭 yarn ---------------"
    ssh hadoop103
    "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
    echo
    " --------------- 关闭 hdfs ---------------"
    ssh hadoop102
    "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
    ;;
    *)
    echo
    "Input Args Error..."
    ;;
    esac
  • 统一查看集群服务器状态

分发到各节点上之后,就可在任意一台节点查看各节点进程情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
for
host
in
hadoop102 hadoop103 hadoop104
do
echo
===============
$host
===============
ssh
$host
jps
done

hadoop常见端口号

端口名称 Hadoop2.x Hadoop3.x
NameNode内部通信端口 8020 / 9000 8020 / 9000/9820
NameNode HTTP UI 50070 9870
MapReduce查看执行任务端口 8088 8088
历史服务器通信端口 19888 19888
常用配置文件
hadoop3.x:core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml workers
hadoop2.x:core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml slaves

大数据课程————Hadoop
https://zhouyinglin.top/2022/08/06/大数据课程————Hadoop/
作者
小周
发布于
2022年8月6日
许可协议