07_尚硅谷_Hadoop_入门_课程介绍
08_尚硅谷_Hadoop_入门_Hadoop是什么
分布式系统:数据由多台服务器帮他来存储,那就是分布式系统 ,每台服务器负责存储一部分,多台服务器共同完成某一项任务。
Hadoop是一个框架
大数据解决的是海量数据的采集、存储和计算三件事。一个hadoop框架就解决了两件事(解决海量数据的存储和计算)
09_尚硅谷_Hadoop_入门_Hadoop发展历史
Hadoop创始人叫Doug Cutting
全文搜索框架现在是Elasticsearch
10_尚硅谷_Hadoop_入门_Hadoop三大发行版本
11_尚硅谷_Hadoop_入门_Hadoop优势
高可靠性:存在备份
高扩展性:其它3台服务器在正常运行集群的情况下,我动态的增加2台服务器,也可动态删除服务器
并行计算:多人干活比一个人干活快,并行计算
高容错性:将失败的任务迁移到其它正常的服务器上
双十一一来,动态的增加服务器,双十一一过动态撤掉服务器,中间不用停掉服务器来增加或撤掉,动态化
12_尚硅谷_Hadoop_入门_Hadoop1.x2.x3.x区别
Hadoop负责海量数据的存储(HDFS)和计算(MapReduce)(大数据负责数据的采集、存储和计算),
Hadoop1.x:Mapreduce既负责计算又负责资源调度
Hadoop2…x:Mapreduce负责计算,Yarn负责资源调度(管理CPU和内存)
13_尚硅谷_Hadoop_入门_HDFS概述
HDFS主要解决海量数据存储问题
NameNode:记录每一个组件存储数据的位置(相当于书本的目录)
DataNode:具体来存储数据的位置,数据到底存在哪(相当于书本具体的内容页)
2NN(Secondary NameNode):对数据进行备份的。万一NameNode挂了,2NN还有一部分原始数据(相当于秘书,但并不是保存全部数据,只是一部分数据)
14_尚硅谷_Hadoop_入门_YARN概述
YARN主要管理CPU和内存,也就是资源管理器
客户端可以有多个
集群上可以运行多个ApplicationMaster
每个NodeManager上可以有多个Container
15_尚硅谷_Hadoop_入门_MapReduce概述
MapReduce:主要负责海量数据的计算(包含处理和汇总)
Hadoop主要解决:海量数据的存储(HDFS)、海量数据的计算(MapReduce)
这么多的数据,需要找到2015年5月份的数据:采用MapReduce。Reduce是最后还需要对结果进行汇总
16_尚硅谷_Hadoop_入门_HDFS&YARN&MR关系
HDFS包含:
DataNode:负责数据实实在在的存储
NameNode:告诉别人我这个数据存储在哪个节点上,存储的什么信息。相当于一个账本
SecondaryNameNode:秘书。如果NameNode挂了,2NN会备份一部分数据,可以恢复NameNode一部分工作。
YARN:负责整个集群资源的管理。包含:
ResourceManager
NodeManager
ApplicationMaster
Container
MapReduce包含:
Map:并行处理输入数据
Reduce:对Map结果进行汇总
17_尚硅谷_Hadoop_入门_大数据技术生态体系
18_尚硅谷_Hadoop_入门_VMware安装
19_尚硅谷_Hadoop_入门_Centos7.5软硬件安装
点击新建虚拟机
本电脑8核CPU
Ctrl+Alt:进行虚拟机鼠标内外切换
20_尚硅谷_Hadoop_入门_IP和主机名称配置
21_尚硅谷_Hadoop_入门_Xshell远程访问工具
Xshell远程访问工具安装包
链接:https://pan.baidu.com/s/1XFqMgXfsi4BXTC3GMyVh5w?pwd=efgg
提取码:efgg
使用Xshell软件进行文件传输
22_尚硅谷_Hadoop_入门_模板虚拟机准备完成
23_尚硅谷_Hadoop_入门_克隆三台虚拟机
shutdown now :关机
修改网络
注意这里使用的是root账号,在root账号下更改网络配置
1.修改克隆虚拟机的静态 IP:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
2.修改主机名称:
vim /etc/hostname
3.重启:
reboot
4.显示网络:
ifconfig
5.查看连接网络的状态
ping www.baidu.com
连接不上就改为IP地址
24_尚硅谷_Hadoop_入门_JDK安装
sudo rm -rf rh/
将jdk-8u212-linux-x64.tar.gz压缩包解压缩(注意:后面的那个C是大写的)
tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module
25_尚硅谷_Hadoop_入门_Hadoop安装
修改hadoop环境
sudo vim /etc/profile.d/my_env.sh
这3个命令要有印象,后面要用到,重点学习
26_尚硅谷_Hadoop_入门_本地运行模式
hadoop运行模式包括:本地模式、伪分布式模式、完全分布式模式
本地模式:单机运行,只是用来演示一下官方案例
伪分布式模式:也是单机运行,但是具备Hadoop集群的所有功能,一台服务器模拟一个分布式的环境。个别缺钱的公司来测试,生产环境不用。
完全分布式模式:多台服务器组成分布式环境。生产环境使用。
后续我们所有写的这个MapReduce程序,它必须指定对应的输入路径和输出路径,而且输出路径还不能存在。如果存在直接抛异常。
在执行命令时,这个输出路径不能存在的
27_尚硅谷_Hadoop_入门_scp&rsync命令讲解
scp实现服务器与服务器之间文件的拷贝,scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。linux的scp命令可以在linux服务器之间复制文件和目录
host没改名,默认是IP地址,@后面输入103的IP地址就可以了
1.在hadoop102上,将hadoop102中 /opt/module/jdk1.8.0_212 目录拷贝到hadoop103上(推)
scp -r /opt/module/jdk1.8.0_212 atguigu@hadoop103:/opt/module
2.在hadoop103上,将hadoop102中 /opt/module/hadoop-3.1.3 目录拷贝到hadoop103上(拉)
scp -r atguigu@hadoop102:/opt/module/hadoop-3.1.3 /opt/module
3.在hadoop上操作,将hadoop102中 /opt/module目录下所有目录拷贝到hadoop104上
scp -r atguigu@hadoop102:/opt/module/* atguigu@hadoop104:/opt/module
推: (将hadoop102上的数据拷贝到hadoop103上)
scp -r jdk1.8.0_212 atguigu@hadoop103 /opt/module
拉: 从hadoop103上拉取hadoop102的数据
从hadoop102中拉取目标路径/opt/module.hadoop-3.1.3下的hadoop-3.1.3到当前目录
scp -r atguigu@hadoop102:/opt/module.hadoop-3.1.3 ./
思考:站到hadoop103上,如何将hadoop102的数据拷贝到hadoop104上?
scp -r atguigu@hadoop102:/opt/module/* atguigu@hadoop104:/opt/module
rsync是直接只更改你变化的数据,其他的内容不变,rsync的性能比scp的性能更好一些rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。 rsync是一个功能非常强大的工具
第一次同步等同于拷贝
如何将hadoop102上的hadoop同步到hadoop103上?
rsync -av /opt/module/hadoop-3.1.3/ atguigu@hadoop103:/opt/module/hadoop-3.1.3
28_尚硅谷_Hadoop_入门_xsync分发脚本
创建文件
touch a.txt
执行之后,hadoop103和hadoop104都可以同步bin文件夹
如果希望分发一下环境变量(/etc/profile.d/my_env.sh)可以使用xsync /etc/profile.d/my_env.sh吗?
分发环境变量
sudo ./bin/xsync /etc/profile.d/my_env.sh
29_尚硅谷_Hadoop_入门_ssh免密登录
你把公钥发给谁,相当于对方默认接收了你的请求,允许它无密访问你
查看到所有的隐藏文件
ls -al
hadoop102的公钥拷贝到目标主机上
将公钥拷贝到hadoop104上
ssh-copy-id hadoop104
30_尚硅谷_Hadoop_入门_集群配置
hadoop包括HDFS(NameNode、2NN[相当于NameNode的秘书])、YARN(包括NodeManager、ResourceManager)、MapReduce、common
(1)核心配置文件----配置core-site.xml
<!-- 指定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>
(2)HDFS配置文件—配置hdfs-site.xml
<!-- 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>
(3)YARN配置文件—yarn-site.xml
<!-- 指定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>
(4) MapReduce配置文件—mapred-site.xm
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
将hadoop102中 的hadoop文件夹下配置的上述内容同步到hadoop103和hadoop104中。使用xsync快捷配置方法
31_尚硅谷_Hadoop_入门_群起集群并测试
这里不能是root用户,应该是atguigu用户
启动HDFS
注意:
我这里出现了问题:bash: jps: 未找到命令… 最后解决的是java的全局环境变量没有分发到hadoop102和hadoop103(具体解决方案可查看《sync分发脚本》这节后半段,笔记这节也记的有),但是我是一个一个复制进去的。
web端查看HDFS的NameNode
http://192.168.10.102:9870/
web端查看YARM的ResourceManager
http://192.168.10.103:8088/
启动YARN
如果出现不能预览和下载,需要在主机下的hosts文件下配置映射,而且在core-site.xml中增加配置信息,具体操作内容链接
启动HDFS
start-dfs.sh
在根目录下创建wcinput文件夹
hadoop fs -mkdir /wcinput
将本地文件wcinput中的word.txt上传到HDFS网页的根目录下的wcinput文件夹中
hadoop fs -put wcinput/word.txt /wcinput
将本地的jdk上传到HDFS的根目录下
hadoop fs -put /opt/software/jdk-8u212-linux-x64.tar.gz /
那么HDFS网页版上的本地文件在哪里存的呢?
这里要弄两次,因为这里jdk是分开存储的(单个是128g)
HDFS网页版内容的存储路径
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-860317985-192.168.10.102-1660488334357/current/finalized/subdir0/subdir0
hadoop具有高可用,任何一个数据的服务器挂了之后,它还有两份的副本帮我们存储。这三台数据存储的一模一样
如果再来第四台机器它会怎么存储呢?
答:那它也是选择任意三台服务器进行存储,有一台是没有留存数据的。它说三份就是3份
hadoop集群实现wordcount计算
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput3
这里的wordcount是指jar包里面examples其中的一个,专门用来计数的。因为上传数据不涉及到yarn,而yarn是资源的调度,只有你有mapreduce这种计算任务的时候我才会执行
在运行结果中出现了Container killed on request. Exit code is 143
最后在配置中添加了代码就出现内容了,具体详见参考解决方案链接
需要提前执行stop-dfs.sh和stop-yarn.sh。将集群关闭(配置文件在hadoop目录下)
1、首先在yarn-site.xml中添加下面内容
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>22528</value>
<discription>每个节点可用内存,单位MB</discription>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1500</value>
<discription>单个任务可申请最少内存,默认1024MB</discription>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>16384</value>
<discription>单个任务可申请最大内存,默认8192MB</discription>
</property>
2、再在mapred-site.xml中添加下面内容:
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
</property>
------------------------------------------------------------------------
<property>
<name>mapreduce.map.memory.mb</name>
<value>1500</value>
<description>每个Map任务的物理内存限制</description>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>3000</value>
<description>每个Reduce任务的物理内存限制</description>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx1200m</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx2600m</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
3、覆盖集群中的这两个文件,重启yarn再启动mapreduce任务,成功运行。
32_尚硅谷_Hadoop_入门_集群崩溃处理办法
像上面这样,遇到困难该如何处理?
(1)先杀死进程
(2)删除每个集群上的data和logs
(3)格式化
(4)初始化完毕之后启动集群
打扫干净屋子再请客,先停掉进程,删除历史数据,之后再启动(停集群、删数据、格式化、重start)
33_尚硅谷_Hadoop_入门_历史服务器配置
当前mapred-site.xml中的内容
<configuration>
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 针对p31按步骤操作却得不到wordcount的输出结果的问题,在评论区找的 -->
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.3</value>
</property>
<!--mapreduce运行中发现有任务被kill掉,多半是因为内存分配不足造成,所有需要修改内存配置。 -->
<property>
<name>mapreduce.map.memory.mb</name>
<value>1500</value>
<description>每个Map任务的物理内存限制</description>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>3000</value>
<description>每个Reduce任务的物理内存限制</description>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx1200m</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx2600m</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!--配置历史服务器。为了查看程序的历史运行情况,需要配置一下历史服务器 -->
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
</configuration>
重新启动一下yarn才能加载新配置的配置文件
34_尚硅谷_Hadoop_入门_日志聚集功能配置
yarn-site.xml目前的所有内容:
<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>
<!--mapreduce运行中发现有任务被kill掉,多半是因为内存分配不足造成,所有需要修改内存配置。来自CSDN -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>22528</value>
<discription>每个节点可用内存,单位MB</discription>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1500</value>
<discription>单个任务可申请最少内存,默认1024MB</discription>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>16384</value>
<discription>单个任务可申请最大内存,默认8192MB</discription>
</property>
<!-- 开启日志聚集功能,可以方便的查看到程序的运行详情,方便开发调试 -->
<!-- 开启日志聚集功能 -->
<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>604800</value>
</property>
</configuration>
启动历史服务器
mapred --daemon start historyserver
停止历史服务器
mapred --daemon stop historyserver
没有日志内容没关系,再后面执行的任务它就有了。
再执行这个
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output2
如果这里面抛出异常的话,更方便我们去定位异常信息
35_尚硅谷_Hadoop_入门_两个常用脚本
启动历史服务器
mapred --daemon start historyserver
停止历史服务器
mapred --daemon stop historyserver
目前来说需要启动HDFS、YARN,还需要启动历史服务器,需要启动好几下,而且尤其这个YARN还需要在hadoop103上去启动,如果不在hadoop103上启动,很容易导致错误。可以编写hadoop集群启停脚本。
#!/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
大家有没有发现,我每次打jps的时候,都的去每台服务器上去查看一下,那如果有100台服务器呢?我是不是要查看100次呢?是不是非常效率低下啊,那能不能写个脚本,我一下查看所有服务器的运行情况呢?
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo =============== $host ===============
ssh $host jps
done
36_尚硅谷_Hadoop_入门_两道面试题
37_尚硅谷_Hadoop_入门_集群时间同步
影响机器性能,直接跳过
38_尚硅谷_Hadoop_入门_常见问题总结
在core-site.xml中增加下面这一段代码,使具有操作HDFS网页权限的功能
<!-- 配置HDFS网页登录使用的静态用户为atguigu -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>atguigu</value>
</property>
配置完成后,分发给hadoop103和hadoop104。然后重启集群。