1:概念
1:Hadoop是什么
1:Hadoop是一个由apache基金会所开发的分布式系统基础架构。
2:主要解决:海量数据的存储和海量数据的分析计算问题。
2:Hadoop发展历史
3:Hadoop的三大发行版本
4:Hadoop的优势
1:高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。
2:高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点。
3:高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。
4:高容错性:能够自动将失败的任务重新分配。
5:Hadoop的组成
6:HDFS架构概述
Hadoop Distributed File System,简称HDFS,是一个分布式文件系统。
假设A老师有20T资料,自己存不下,分发给自己的学生A01,A02...
这时候有一个NameNode负责所有数据的存储情况和记录,管理数据都存储在什么位置,比如给A01,A02...多个DataNode管理具体存储数据的位置,比如A01的某个位置,A02的某个位置...万一NameNode不能用,整个系统会瘫痪,所以一般有一个2NN,来和NameNode进行辅助工作。
NameNode(nn):存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件块列表和块所在的DataNode。
DataNode(dn):在本地文件系统存储文件块数据,以及数据的校验和。
Secondary NameNode(2nn):每隔一段时间对NameNode元数据备份。
假设有一堆的武功秘籍书籍,有一个主目录,记录所有书籍,这个为NameNode
而在那一堆书籍中一本一本的,是DataNode
7:YARN架构概述
Yet Another Resource Negotiator简称YARN,另一种资料协调者,是Hadoop的资源管理器。
既然是集群,一般就不是单个客户端,基本上都是多个客户端。
集群上可以运行多个ApplicationMaster,每个NodeManager上可以有多个Container
1:ResouceManager(RM):整个集群资源(内存、CPU)的老大
2:NodeManager(NM):单个节点服务器资源老大
3:ApplicationMaster(AM):单个任务运行的老大
4:Container:容器,相当于一台独立的服务器,里面封装了任务运行所需要的资源,如内存、CPU、磁盘、网络等。
Client通过Job Submission--->ResourceManager--->NodeManager--->NodeManager里面有一个container--->Container里面还包含一个ApplicationMaster
8:MapReduce架构概述
MapReduce将计算过程分为两个阶段:Map和Reduce
1:Map阶段并行处理输入数据
2:Reduce阶段对Map结果进行汇总
假如说有一个待分析数据为100T,需要找到其中一个特定视频。
首先是可以通过Map阶段分发给100个服务器,并行检索自己有无这个视频。
然后通过Reduce阶段对于Map结果进行汇总,查看在哪个服务器上面。
9:HDFS、YARN、MapReduce三者关系
10:大数据技术生态体系
11:推荐系统案例
2:环境准备
1:模板虚拟机的准备
这个就看之前Linux的软件安装视频即可。
2:克隆
这个由于克隆之后根据视频无法正确修改IP和主机名搞了老半天。
自己最后IP的修改方式看的是vmware完整克隆(linux)_Allen技术小站-CSDN博客
主机名的修改方式看的是Linux虚拟机克隆(基于VMware)_DATANGguanjunhou的博客-CSDN博客。
3:安装jdk、Hadoop
这里面有一个 /etc/profile.d/my_env.sh文件,等会分布式的时候会被分发
同时,安装完之后记得$ source /etc/profile ,不然无法正常使用。
3:Hadoop生成集群搭建
1:本地模式
统计一个文件中各个单词的个数
指定的目标目录不能存在,例如wcoutput。
2:完全分布式集群(开发和面试的核心)
1:准备三台客户机(关闭防火墙,静态IP,主机名称)
2:安装jdk
3:配置环境变量
4:安装Hadoop
5:配置环境变量
6:配置集群
7:单点激动
8:配置ssh
9:群起并测试集群
1:scp:安全拷贝
1:scp定义
scp可以实现服务器与服务器之间的数据拷贝。
2:基本语法
scp -r $pdir/$fname $user@$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
3:案例实操
前提:在Hadoop102、Hadoop103、Hadoop104都已创建好的/opt/module、/opt/software两个目录。
1:在Hadoop102上,将Hadoop102中/opt/module/jdk1.8.0_212目录拷贝到Hadoop103上。
2:在Hadoop103上,将Hadoop102中/opt/module/hadoop-3.1.3目录拷贝到Hadoop103上。
3:在Hadoop103上,将Hadoop102中/opt/module目录下所有的目录拷贝到Hadoop104上。
2:rsync远程同步工具
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有的文件都复制过去。第一次对文件使用的话,用scp,之后对文件修改的话用rsync。
1:基本语法
rsync -av $pdir/$fname $user@$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称
选项参数
1:-a 归档拷贝
2:-v 显示复制过程
2:案例实操
1:删除hadoop103中/opt/module/hadoop-3.1.3/wcinput
2:同步Hadoop102中的/opt/module/hadoop-3.1.3到hadoop103中
3:xsync集群分发脚本
1:需求:循环复制文件到所有节点的相同目录下
2:需求分析
1:rsync命令原始拷贝
rsync -av /opt/module root@hadoop103:/opt/
2:期望脚本
xsync 要同步的文件名称
3:期望脚本在任何路径下都能使用(脚本放在声明了全局环境变量的路径)
3:脚本实现
1:在/hoem/xcq/bin目录下创建xsync文件
2: 分发脚本代码
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103
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
3:修改脚本执行权限
chmod +x xsync
4:测试脚本
xsync /home/xcq/bin
5:将脚本复制到/bin中,以便配置调用
sudo cp xsync /bin/
6:同步环境变量配置(所有者)
普通用户下sudo ./bin/xsync /etc/profile.d/my_env.sh
如果使用了sudo 将xsync路径补全
7:让环境变量生效
每台虚拟机都记得要$ source /etc/profile
4:ssh免密登录设置 (因为每次分发文件的时候还要输入其他虚拟机用户密码)
1:A服务器和B服务器进行免密
首先A服务器生成密钥对,有公钥和私钥,然后把公钥拷贝给B服务器指定的文件下去保存A的公钥,然后ssh访问B服务器(数据用私钥A加密),B服务器接收到数据后,去指定的文件下查看是否有与A的公钥,并解密数据,采用A公钥加密的数据返回给A,最后A服务器用私钥解密数据,这样就实现了通讯。
把A把公钥发给B,就等于允许B不用输入密码就可访问A。
2:配置Hadoop102无密登录Hadoop103
1:配置ssh,在Hadoop102的家目录使用ssh hadoop103输入yes即可访问,然后输入exit即可退出,这是hadoop102家目录里面有一个.ssh文件。
2:在Hadoop102的.ssh文件目录下,输入ssh-keygen -t rsa生成公钥和私钥。然后敲(三个回车),就会生成两个文件 id_rsa(私钥)、id_rsa.pub(公钥)
3:然后将Hadoop102上面的公钥拷贝到103上:
在.ssh文件目录下使用ssh-copy-id hadoop103即可。
4:测试的话就在Hadoop102上输入ssh hadoop103即可登录,不用密码。
5:如果使用ssh hadoop102,也需要使用ssh-copy-id hadoop102。
6:如果上面配置的时候所用的用户是A,你使用用户B登录的时候想要进行访问其他虚拟机,是不可以进行免密登录的,即每个用户都需要配置。
4:集群配置
1:集群部署
1:NameNode和SecondaryNameNode不要安装在一台服务器
2:ResourceManager很消耗内存,不要和NameNode,SecondaryNameNode配置在统一台机器上。
所以 Hadoop102 Hadoop103 Hadoop104
HDFS NameNode、DataNode DataNode SecondaryNameNode、DataNode
YARN NodeManager ResourceManager、NodeManager NodeManager
2:配置文件说明
1:默认配置文件
2:自定义配置文件
core-site.xml、hdfs-site.xml 、yarn-site.xml、mapred-site.xml,四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求进行修改配置。
3:配置集群(在Hadoop目录下)
1:配置 core-site.xml
fs.defaultFS
hdfs://hadoop102:8020
hadoop.tmp.dir
/opt/module/hadoop-3.1.3/data
hadoop.http.staticuser.user
atguigu
2:配置hdfs-site.xml
dfs.namenode.http-address
hadoop102:9870
dfs.namenode.secondary.http-address
hadoop104:9868
3:配置yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.hostname
hadoop103
yarn.nodemanager.env-whitelist
JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CO
NF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAP
RED_HOME
4:配置mapred-site.xml
mapreduce.framework.name
yarn
5:这只是在Hadoop102上对Hadoop文件进行的修改,因此还需要分发到Hadoop103、Hadoop104上面。
$ xsync /opt/module/hadoop3.1.3/etc/hadoop/
5:群起集群
通过下面命令进入到workers文件夹,把节点的主机名都加入进去。
$ vim /opt/module/hadoop3.1.3/etc/hadoop/workers
该workers文件中末尾不允许有空格,也不允许有空行。
hadoop102
hadoop103
hadoop104
然后通过xsync把文件进行分发一下,进行同步。
$ xsync workers
然后启动集群,如果是第一次启动,需要格式化NameNode.
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs namenode -format
启动hdfs
[atguigu@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh
启动完之后,输入jps查看所启动的内容是不是自己想要的,根据集群部署那块的3*4的表格。
然后再配置文件中设置的那个Hadoop102:9870可以通过浏览器进行访问。
然后再配置了ResourceManager的节点(Hadoop103)上启动yarn。
[atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh
启动完之后,再输入jps即可查看到ReourceManager、DataNode、NodeManager、jps。
然后在配置文件中设置的那个几点Hadoop103:8088可以通过浏览器访问。
6:集群基本测试
1:测试创建文件夹以及文件上传,再hdfs对应的web地址可以查看。
atguigu@hadoop102 ~]$ hadoop fs -mkdir /input
[atguigu@hadoop102 ~]$ hadoop fs -put $HADOOP_HOME/wcinput/word.txt /input
[atguigu@hadoop102 ~]$ hadoop fs -put /opt/software/jdk-8u212-linux-x64.tar.gz /
#像这个jdk是一个大文件,在浏览器上面只是一个链接,实际存储地方为DataNode,实际的存储地方
#在配置core-site.xml时,设置的Hadoop数据存储目录,此时应该在Hadoop文件夹下的data目录
2:执行wordcount程序,指定输入输出目录
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar
share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
7:集群错误使用补救措施
假如在Hadoop102上,把DataNode给kill掉,然后把三台机器上的Hadoop文件夹下的所有data文件全删除,该如何操作。
如果通过sbin/stop-yarn.sh和sbin/stop-dfs.sh把yarn和hdfs全停止,然后通过sbin/start-dfs.sh再开启hdfs发现NameNode没了。
如果格式化hdfs,能够重新生成data文件夹,但是里面的ID不一样,并且hdfs之前对应的网址也不能登录,并且NameNode还是没起来。
无论发生上面问题,都先杀死进程。终止yarn和hdfs,知道jps命令下只剩一个jps。
然后删除集群上的每个的虚拟机上面的data和logs文件夹。
然后在Hadoop102的Hadoop文件夹下,执行hdfs namenode -format进行格式化。
初始化完毕之后,然后开启hdfs即可。
原因就是有一个current对应的VERSION文件,里面的命名空间ID和集群ID都不一样。这些东西都是一对一的,因此不清理干净,是不能匹配的。
8:历史服务器配置
为了查看程序的历史运行情况,需要配置一下历史服务器。配置步骤如下
1:配置mapred-site.xml
Hadoop102和Hadoop103通讯使用的是10020那个,用户外部访问使用19888
mapreduce.jobhistory.address
hadoop102:10020
mapreduce.jobhistory.webapp.address
hadoop102:19888
2:分发配置
[atguigu@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
3:在Hadoop102上启动历史服务器
[atguigu@hadoop102 hadoop]$ mapred --daemon start historyserver
4:查看历史服务器是否启动
[atguigu@hadoop102 hadoop]$ jps
9:配置日志的聚集功能
日志聚集:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
好处:可以方便的查看到程序的运行详情,方便开发调试。
注意:开启日志聚集,需要重启NodeManager、ResourceManager和HistoryServer
配置步骤
1:配置yarn-site.xml
yarn.log-aggregation-enable
true
yarn.log.server.url
http://hadoop102:19888/jobhistory/logs
yarn.log-aggregation.retain-seconds
604800
2:分发配置
[atguigu@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/yarnsite.xml
3:关闭 NodeManager 、ResourceManager 和 HistoryServer
[atguigu@hadoop103 hadoop-3.1.3]$ sbin/stop-yarn.sh
[atguigu@hadoop103 hadoop-3.1.3]$ mapred --daemon stop
4:启动 NodeManager 、ResourceManage 和 HistoryServer
[atguigu@hadoop103 ~]$ start-yarn.sh
[atguigu@hadoop102 ~]$ mapred --daemon start historyserver
5:除 HDFS 上已经存在的输出文件
[atguigu@hadoop102 ~]$ hadoop fs -rm -r /output
6:执行 WordCount 程序
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
然后就可登录浏览器查看日志信息。
10:集群停止、启动方式总结
1:各个模块分开启动停止(配置ssh是前提)
1:整体启动停止HDFS
start-dfs.sh/stop-dfs.sh
2:整体启动停止YARN
start-yarn.sh/stop-yarn.sh
2:各个服务组件逐一启动停止
1:分别启动停止HDFS组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
2:启动停止YARN
yarn --daemon start/stop resourcemanager/nodemanager
11:编写Hadoop集群常用脚本
1:Hadoop集群启动停止脚本(包含 HDFS,Yarn,Historyserver):myhadoop.sh
[atguigu@hadoop102 ~]$ cd /home/atguigu/bin
[atguigu@hadoop102 bin]$ vim myhadoop.sh
#执行使用myhadoop.sh stop/start进行停止/启动
#!/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
[atguigu@hadoop102 bin]$ chmod +x myhadoop.sh
#赋予执行权限
2:看三台服务器 Java 进程脚本:jpsall
[atguigu@hadoop102 ~]$ cd /home/atguigu/bin
[atguigu@hadoop102 bin]$ vim jpsall
#直接查看各个虚拟机的jps命令,因为没有参数,直接输入jpsall即可运行
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done
[atguigu@hadoop102 bin]$ chmod +x jpsall
#赋予执行权限
3:分发/home/atguigu/bin 目录,保证自定义脚本在三台机器上都可以使用
[atguigu@hadoop102 ~]$ xsync /home/atguigu/bin/
#xsync的具体脚本在上面
12:常用面试题
1:端口号
2:常用配置文件
3.x--> core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml workers
2.x--> core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml slaves
13:集群时间同步
如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期 和公网时间进行校准; 如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差, 导致集群执行任务时间不同步。
要统一时间,因为加入设置具体时间执行任务,由于虚拟机各个时间不同,可能执行错误。
1:时间服务器配置(必须root用户)
1:查看所有节点ntpd服务状态和开机自启动状态
[atguigu@hadoop102 ~]$ sudo systemctl status ntpd
[atguigu@hadoop102 ~]$ sudo systemctl start ntpd
[atguigu@hadoop102 ~]$ sudo systemctl is-enabled ntpd
2:修改 hadoop102 的 ntp.conf 配置文件
[atguigu@hadoop102 ~]$ sudo vim /etc/ntp.conf
1:#Hosts on local network are less restricted
下面修改为和自己同网段的。
比如我的是192.168.10.xxx就修改为restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap
2:把以下全注释掉
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
3:添加(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
3:修改hadoop102 的/etc/sysconfig/ntpd 文件
[atguigu@hadoop102 ~]$ sudo vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
4:重新启动 ntpd 服务
[atguigu@hadoop102 ~]$ sudo systemctl start ntpd
5:设置 ntpd 服务开机启动
[atguigu@hadoop102 ~]$ sudo systemctl enable ntpd
2:其他机器配置
1:关闭所有节点上 ntp 服务和自启动
[atguigu@hadoop103 ~]$ sudo systemctl stop ntpd
[atguigu@hadoop103 ~]$ sudo systemctl disable ntpd
[atguigu@hadoop104 ~]$ sudo systemctl stop ntpd
[atguigu@hadoop104 ~]$ sudo systemctl disable ntpd
2:在其他机器配置 1 分钟与时间服务器同步一次
[atguigu@hadoop103 ~]$ sudo crontab -e
*/1 * * * * /usr/sbin/ntpdate hadoop102
3:修改任意机器时间
[atguigu@hadoop103 ~]$ sudo date -s "2021-9-11 11:11:11"
4:1 分钟后查看机器是否与时间服务器同步
[atguigu@hadoop103 ~]$ sudo date
14:常见错误及解决方案
1)防火墙没关闭、或者没有启动 YARN
INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
2)主机名称配置错误
3)IP 地址配置错误
4)ssh 没有配置好
5)root 用户和 atguigu 两个用户启动集群不统一
6)配置文件修改不细心
7)不识别主机名称
java.net.UnknownHostException: hadoop102: hadoop102
at
java.net.InetAddress.getLocalHost(InetAddress.java:1475)
at
org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(Job
Submitter.java:146)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)
at java.security.AccessController.doPrivileged(Native
Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
解决办法:
(1)在/etc/hosts 文件中添加 192.168.10.102 hadoop102
(2)主机名称不要起 hadoop hadoop000 等特殊名称
8)DataNode 和 NameNode 进程同时只能工作一个。
解决办法:在格式化之前,先删除
DataNode里面的信息(默认在/tmp,如果配
置了该目录,那就去你配置的目录下删除数
据)
9)执行命令不生效,粘贴 Word 中命令时,遇到-和长–没区分开。导致命令失效
解决办法:尽量不要粘贴 Word 中代码。
10)jps 发现进程已经没有,但是重新启动集群,提示进程已经开启。
原因是在 Linux 的根目录下/tmp 目录中存在启动的进程临时文件,将集群相关进程删
除掉,再重新启动集群。
11)jps 不生效
原因:全局变量 hadoop java 没有生效。解决办法:需要 source /etc/profile 文件。
12)8088 端口连接不上
[atguigu@hadoop102 桌面]$ cat /etc/hosts
注释掉如下代码
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 hadoop102