概念介绍
#HDFS 概述
Hadoop Distributed File System,简称HDFS,是一个分布式文件系统。
(1)NameNode(nn):存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等。
(2)DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和。
(3)Secondary NameNode(2nn):每隔一段时间对NameNode元数据备份。
#YARN 概述
Yet Another Resource Negotiator 简称YARN ,另一种资源协调者,是Hadoop 的资源管理器。
ResourceManager(RM):整个集群资源(内存、CPU等)的管理者 NodeManager(NM):单个节点服务器资源的管理者。ApplicationMaster(AM):单个任务运行的管理者。Container:容器,相当于一台独立的服务器,里面封装了任务运行所需要的资源,如内存、CPU、磁盘、网络等。
#MapReduce 概述
MapReduce 将计算过程分为两个阶段:Map 和 Reduce
(1)Map 阶段并行处理输入数据
(2)Reduce 阶段对Map 结果进行汇总
各组件和对应服务名
组件名 | 服务名 | 进程名 |
---|---|---|
NameNode | hadoop-hdfs-namenode | NameNode |
DataNode | hadoop-hdfs-datanode | DataNode |
ResourceManager | hadoop-yarn-resourcemanager | ResourceManager |
NodeManager | hadoop-yarn-nodemanager | NodeManager |
JobHistory | hadoop-mapreduce-historyserver | JobHistoryServer |
JournalNode | hadoop-hdfs-journalnode | JournalNode |
zkfc | hadoop-hdfs-zfkc | DFSZKFailoverController |
hadoop服务启停流程
#启动过程
1、启动所有zookeeper
2、启动所有的JournalNode
3、启动两台NameNode及zkfc ,
---这里可以通过查看namenode的web页面,查看两台机器的状态
---一台为active ,另一台为standby
4、启动所有的DataNode
5、启动两台ResourceManager ,这里可以通过查看resourceManager的web页面
6、启动所有的NodeManager
7、启动JobHistory
-------------------------------------------------------------------------------
# 关闭过程
1、停止JobHistory
2、停止所有的NodeManager
3、停止两台ResourceManager
4、停止所有的DataNode
5、停止两台NameNode及ZKFC
6、停止所有的JournalNode
7、停止所有的zookeeper
整合为脚本
#启停脚步包含hdfs、yarn、historyserver
#!/bin/bash
#启停脚本
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop101 "/opt/module/hadoop-3.3.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop102 "/opt/module/hadoop-3.3.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop103 "/opt/module/hadoop-3.3.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop103 "/opt/module/hadoop-3.3.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop102 "/opt/module/hadoop-3.3.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop101 "/opt/module/hadoop-3.3.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
启停验证
>web端查看HDFS的NameNode
http://hadoop101:9870
>web端查看yarn的ResourceManager
http://hadoop102:8088
>历史服务器地址
http://hadoop103:19888/jobhisto
hadoop服务单独启停
#命令启动hdfs ---namenode节点上执行
cd /opt/module/hadoop-3.3.3/sbin/
./start-dfs.sh
#命令停止hdfs ---namenode节点上执行
cd /opt/module/hadoop-3.3.3/sbin/
./stop-dfs.sh
#验证
web端查看HDFS的NameNode
http://hadoop101:9870
yarn启停
#在resourcemanager节点上执行,先启动hdfs,再启动yarn
cd /opt/module/hadoop-3.3.3/sbin/
./start-yarn.sh
#yarn停止---在resourcemanager节点上执行
cd /opt/module/hadoop-3.3.3/sbin/
./stop-yarn.sh
#验证
web端查看yarn的ResourceManager
http://hadoop102:8088
# 启动hdfs、yarn
cd /opt/module/hadoop-3.3.3/sbin/
./start-all.sh
#停止hdfs、yarn
cd /opt/module/hadoop-3.3.3/sbin/
./stop-all.sh
单独启停某个服务进程
# hdfs --daemon start 单独启动⼀个进程
hdfs --daemon start namenode # 只开启NameNode
hdfs --daemon start datanode # 只开启DataNode
hdfs --daemon start secondarynamenode # 只开启SecondaryNameNode
# hdfs --daemon stop 单独停⽌⼀个进程
hdfs --daemon stop namenode # 只停⽌NameNode
hdfs --daemon stop datanode # 只停⽌DataNode
hdfs --daemon stop secondarynamenode # 只停⽌SecondaryNameNode
# hdfs --workers --daemon start 启动所有的指定进程
hdfs --workers --daemon start namenode
hdfs --workers --daemon start datanode # 开启所有节点上的DataNode
hdfs --workers --daemon start secondarynamenode
# hdfs --workers --daemon stop 停止所有的指定进程
hdfs --workers --daemon stop namenode
hdfs --workers --daemon stop datanode # 停⽌所有节点上的DataNode
hdfs --workers --daemon stop secondarynamenode
常用命令
# 修改hdfs文件的备份数
hdfs dfs -setrep -R 副本数 dir
备注:dfs.replication 这个参数其实只在文件被写入dfs时起作用
虽然更改了配置文件,但是不会改变之前写入的文件的备份数
# 检查hdfs block健康状态
hdfs fsck /
# 删除坏的block块
hdfs fsck / -delete 坏块路径(hdfs上的文件路径)
---
若出现坏块,即报告中Missing Blocks有值,
尝试重启hdfs服务 ./stop-dfs.sh ./start-dfs.sh
重启后观察(重启时间较长,10-20分钟之后再去查看)是否还有坏块
若重启HDFS服务不能修复,可通过手动检查坏块并删除坏块
hdfs fsck / --扫描坏块
hdfs fsck -delete 坏块地址
#扫描坏块后查看,坏块地址为”:MISSING“之前的地址
再重新检查坏块情况和坏块告警情况
---
启动负载均衡
datanode之间出现数据存储大小不均衡时,比如磁盘损坏或者新增加,需要做负载均衡。
尽量不要在namenode节点使用
cd /opt/module/hadoop-3.3.3/sbin/
./start-balancer.sh -t 10%
datanode存储使用率/集群总存储使用率>10%就触发负载均衡
格式化文件系统
注意:格式化namenode后集群的数据会全部丢失,格式化之前需做好数据备份工作
1、格式化之前,首先需删除Hadoop系统日志,默认路径为${HADOOP_HOME}/logs。
2、然后删除主节点目录以及数据节点目录,默认路径分别为${hadoop.tmp.dir}/dfs/name
和${hadoop.tmp.dir}/dfs/data。hadoop.tmp.dir默认值是/tmp/hadoop-${user.name},
可以在core-site.xml配置文件中的hadoop.tmp.dir属性设置。而上面的主节点目录和数据节点目录也可以在hdfs-site.xml配置文件中的dfs.namenode.name.dir和dfs.namenode.data.dir属性中设置。(在dfs/name/current目录下的VERSION文件中记录集群的版本信息,其中clusterID是集群版本标识,每次format都会生成不同的ID。在dfs/data/current目录下的VERSION文件中记录datanode的版本相关信息,其中clusterID标识它是属于哪个集群的,namenode 和 datanode的这两个值一致时,才会认为是同一个集群。格式化后,namenode的clusterID会改变,但datanode节点目录dfs/data/current如果在格式化时仍存在,则datanode的clusterID不会变化。这种情况下,启动集群,datanode进程虽然也会启动,但与namenode确认clusterID后,发现不一致,就会自动退出了。)
格式化NameNode,命令为hdfs namenode -format。
3、格式化NameNode,命令为hdfs namenode -format。
----------------------------------------------------------------------
升级、回滚、持久化、checkpoint
#分发新的hdfs版本之后,namenode应以upgrade 选项启动
hdfs namenode -upgrade
#将namenode回滚到前一版本,这个选项要在停止集群,分发老的hdfs版本之后执行
hdfs namenode -rollback
#finalize 会删除文件系统的前一状态。最近的升级会被持久化,rollback选项将不再可用,升级终结操作之后,它会停掉namenode,分发老的hdfs版本后使用
hdfs namenode -finalize
#从检查点目录装载镜像并保存到当前检查点目录,检查点目录由
fs.checkpoint.dir 指定
hdfs namenode importCheckpoint
hdfs 系统检查
#移动受损文件到/lost+found
hdfs fsck <path> -move
#删除受损文件
hdfs fsck <path> -delete
#打印出写打开的文件
hdfs fsck <path> -openforwrite
#打印出正被检查的文件
hdfs fsck <path> -files
#打印出块信息报告
hdfs fsck <path> -blocks
#打印出每个块的位置信息
hdfs fsck <path> -locations
#打印出datanode的网络拓扑结构
hdfs fsck <path> -racks
yarn常用命令
在集群部署中,yarn的各个组件是和hadoop集群中的其他组件进行同一部署的。
yarn中的容器(动态资源分配单位)代表了cpu、内存、磁盘、网络等计算资源,
可限定每个应用程序使用的资源量
yarn 组件
ResourceManager
处理客户端请求、启动、监控ApplicationMaster、
监控NodeManager、资源分配与调度
ApplicationMaster
为应用程序申请资源,并分配给内部任务、任务的调度
监控与容错
NodeManager
单个节点上的资源管理、处理ResourceManager的命令、
处理来自ApplicationMaster 的命令
yarn工作流程
在yarn中执行1个MapReduce程序,从提交到完成需要经历8个步骤
①用户编写客户端应用程序, 向YARN提交应用程序,提交的内容包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。
②YARN 中的ResourceManager负责接收和处理来自客户端的请求。接到客户端应用程序请求后,ResourceManager里面的调度器会为应用程序分配一个容器。同时, ResourceManager的应用程序管理器会与该容器所在NodeManager 通信,为该应用程序在该容器中启动一个ApplicationMaster。
③ApplicationMaster 被创建后会首先向ResourceManager 注册,从而使得用户可以通过ResourceManager来直接查看应用程序的运行状态。接下来的步骤4~7是具体的应用程序执行步骤。
④ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请资源。
⑤ResourceManager 以“容器”的形式向提出申请的ApplicationMaster 分配资源,一旦ApplicationMaster申请到资源后,就会与该容器所在的NodeManager 进行通信,要求它启动任务。
⑥当ApplicationMaster要求容器启动任务时,它会为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)然后将任务启动命令写到一个脚本中, 最后通过在容器中运行该脚本来启动任务。
⑦各个任务通过某个RPC 协议向ApplicationMaster汇报自己的状态和进度,让ApplicationMaster可以随时掌握各 个任务的运行状态,从而可以在任务失败时重新启动任务。
⑧应用程序运行完成后,ApplicationMaster向ResourceManager的应用程序管理器注销并关闭自己,若ApplicationMaster因故失败,ResourceManager中的应用程序管理器会监测到失败的情形,然后将其重新启动,直到所有的任务执行完毕。
yarn调度算法
三种调度算法
#1、先进先出 (FIFO Scheduler)
优点:简单易懂
缺点:不支持多队列,生产环境很少使用
#2、容量调度器(capacity scheduler)
Capacity Scheduler是Yahoo开发的多用户调度器。
特点:
(1)多队列:每个队列配置一定资源量,每个队列采用FIFO调度策略
(2)容量保证:管理员可为队列设置资源最低保证和资源使用上限
(3)灵活性:如果一个队列资源有余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列
(4)多租户:支持多用户共享集群和多应用程序同时运行。
为了防止同一个用户的作业独占队列中的资源,**该调度器会对同一用户提交的作业所占资源量进行限定。
1、队列资源分配
从root开始,使用深度优先算法,优先选择“资源占用率最低”的队列分配资源
2、作业资源分配
默认按照提交作业的优先级和提交时间顺序分配资源
3、容器资源分配
按照容器的优先级 分配资源
按照优先级相同,按照数据的本地性原则 :
(1)任务和数据在同一节点
(2)任务和数据在同一机架
(3)任务和数据不在同一节点,也不在同一机架
3、公平调度器(Fair Scheduler)
Fair Scheduler 是 Facebook开发的多用户调度器
同队列所有任务共享资源,在时间尺度上获得公平的资源
与容量调度器相同点:
(1) 多队列:支持
(2)容量保证:管理员可为队列设置资源最低保证和资源使用上限
(3)灵活性:如果一个队列资源有余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列
(4)多租户:支持多用户共享集群和多应用程序同时运行。
为了防止同一个用户的作业独占队列中的资源,**该调度器会对同一用户提交的作业所占资源量进行限定。
与容量调度器不同点:
(1) 核心调度策略不同
容量调度器:优先选择 资源利用率低的队列
公平调度器:优先选择对资源的缺额比较大的
(2)每个队列可以单独设置资源分配方式
容量调度器:FIFO、DRF
公平调度器:FIFO、FAIR、DRF
#分配方式
(1)FIFO策略
公平调度器每个队列资源分配策略如果选择FIFO的话,此时公平调度器相当于上面讲过的容量调度器。
(2)Fair策略
公平的策略(默认)是一种基于最大最小公平算法实现的资源多路复用方式,默认情况下,每个队列内部采用该方式分配资源。这意味着,如果一个队列中有两个应用程序同时运行,则每个应用程序可得到1/2的资源;如果三个应用程序同时运行,则每个应用程序可得到1/3的资源。
具体资源分配流程和容量调度器一致;(1)选择队列 (2)选择作业 (3)选择容器。此三步,每一步都是按照公平策略分配资源
实际最小资源份额:mindshare = Min(资源需求量,配置的最小资源)
是否饥饿:isNeedy = 资源使用量 < mindshare(实际最小资源份额)
资源分配比:minShareRatio = 资源使用量 / Max (minshare,1) 资
源使用权重比:useToWeightRatio = 资源使用量 / 权重
DRF策略
DRF(Doninant Resouree Fairmess),我们之前说的资源,都是单一标准,例如只考虑内存(也是Yarn默认的情况)。但是很多时候我们资源有很多种,例如内存,CPU,网络带宽等,这样我们很难衡量两个应用应该分配的资源比例。
DRF调度:假设集群一共有100 CPU和10T内存,而应用A需要(2CPU,300GB),应用B需要(6 CPU,100GB )。则两个应用分别需要A(2%CPU,3%内存)和B(6%CPU,1%内存)的资源,这就意味着A是内存主导的,B是CPU主导的,针对这种情况,我们可以选择DRF策略对不同应用进行不同资源(CPU和内存)的一个不同比例的限制。
yarn常用命令和核心参数
yarn application查看任务
#列出所有的application
yarn application -list
#根据application状态过滤
yarn application -list -appStates XXX(XXX - ALL、NEW、NEW_SAVING、SUBMITTED、ACCEPTED、RUNNING、FINISHED、FAILED、KILLED)
#杀死程序
yarn application -kill application-id
yarn logs查看日志
#查询application日志
yarn logs -applicationId <ApplicationId>
#查询container 日志
yarn logs -applicationId <ApplicationId> -containerId <ContainerId>
yarn applicationattempt查看尝试运行的任务
#列出所有Application尝试的列表
yarn applicationattempt -list <ApplicationId>
#打印ApplicationAttemp状态
yarn applicationattempt -status <ApplicationAttemptId>
yarn container查看容器
#列出所有Container
yarn container -list <ApplicationAttemptId>
#打印Container状态
yarn container -status <ContainerId>
备注:只有在任务跑的途中才能看到container的状态
yarn node查看节点状态
#列出所有节点
yarn node -list -all
yarn rmadmin更新配置
#加载队列配置
yarn rmadmin -refreshQueues
yarn queue查看队列
#打印队列信息
yarn queue -status <QueueName>
#yarn核心参数配置
1、ResourceManager相关
#配置调度器,默认容量
yarn.resourcemanager.scheduler.class
#ResourceManager处理器请求的线程数量,默认50
yarn.resourcemanager.scheduler.clinent.thread-count
2、NodeManager相关
#是否让yarn自己检测硬件进行配置,默认false
yarn.nodemanager.resource.detect-hardware-capabilities
#是否将虚拟核数当做cpu核数,默认false
yarn.nodemanager.resource.count-logical-processors-as-cores
#虚拟核数和物理核数乘数,默认为1.0
yarn.nodemanager.resource.pcores-vcores-multiplier
#NodeManager使用内存,默认8G
yarn.nodemanager.resource.memory-mb
#NodeManager 为系统保留多少内存
yarn.nodemanager.resource.system-reserved-memory-mb
备注:改参数和上个参数有一定的关系
#NodeManager 使用cpu核数,默认8个
yarn.nodemanager.resource.cpu-vcores
#是否开启物理内存检查限制container,默认打开
yarn.nodemanager.pmem-check-enabled
#是否开启虚拟内存检查限制container,默认打开
yarn.nodemanager.vmem-check-enabled
#虚拟内存和真实物理内存的比率,默认2.1
yarn.nodemanager.vmem-pmem-ratio
3、Container相关
#容器最小内存,默认1G
yarn.scheduler.minimum-allocation-mb
#容器最大内存,默认8G
yarn.scheduler.maximum-allocation-mb
#容器最小CPU核数,默认1个
yarn.scheduler.minimum-allocation-vcores
#容器最大CPU核数,默认4个
yarn.scheduler.maximum-allocation-vcores
按照上边的参数进行配置下我们的yarn-site.xml文件
#设置参考意见
container:内存和cpu的虚拟概念
内存cpu资源预留20%给系统
一个计算任务至少需要1core 。
core越多,计算的并发就越多
内存:计算时所需的空间oom-killer机制
cpu:决定并发任务
cloudera公司经过生产实践,推荐1个container的vcore最好不要超过5,就设置4个
4.3、mapreduce常用命令
4.3.1、mapreduce相关参数
资源相关参数以下参数是在用户自己的 MapReduce 应用程序中配置就可以生效:
mapreduce.map.memory.mb:一个MapTask可使用的资源上限(单位:MB),默认为1024。如果MapTask实际使用的资源量超过该值,则会被强制杀死。
mapreduce.reduce.memory.mb:一个ReduceTask可使用的资源上限(单位:MB),默认为1024。如果ReduceTask实际使用的资源量超过该值,则会被强制杀死。
mapreduce.map.cpu.vcores:每个MapTask可使用的最多cpu core数目,默认值: 1
mapreduce.reduce.cpu.vcores:每个ReduceTask可使用的最多cpu core数目,默认值: 1
mapreduce.map.java.opts: MapTask的JVM参数,你可以在此配置默认的java heap size等参数, 比如:"-Xmx2048m -verbose:gc -Xloggc:/tmp/@taskid@.gc",默认值是:""
mapreduce.reduce.java.opts: ReduceTask的JVM参数,你可以在此配置默认的java heap size等参数
以下参数应该在yarn启动之前就配置在服务器的配置文件中才能生效:yarn.scheduler.minimum-allocation-mb=1024 给应用程序container分配的最小内存
yarn.scheduler.maximum-allocation-mb=8192 给应用程序container分配的最大内存
yarn.scheduler.minimum-allocation-vcores=1 yarn.scheduler.maximum-allocation-vcores=32 yarn.nodemanager.resource.memory-mb=8192 mapreduce.task.io.sort.mb=256 (HDFSv3.0) shuffle的环形缓冲区大小,默认256m mapreduce.map.sort.spill.percent=0.8 环形缓冲区溢出的阈值,默认80% MapReduce程序进行flush操作的阀值,默认0.80。mapreduce.reduce.shuffle.parallelcopies MapReduce程序reducer copy数据的线程数,默认10 (HDFSv3.0)。mapreduce.reduce.shuffle.input.buffer.percent reduce复制map数据的时候指定的内存堆大小百分比,默认为0.70 适当的增加该值可以减少map数据的磁盘溢出,能够提高系统能。mapreduce.reduce.shuffle.merge.percentreduce reduce进行shuffle的时候,用于启动合并输出和磁盘溢写的过程的阀值,默认为0.66。如果允许,适当增大其比例能够减少磁盘溢写次数,提高系统性能。同mapreduce.reduce.shuffle.input.buffer.percent一起使用 mapreduce.task.timeout mr程序的task执行情况汇报过期时间,默认600000(10分钟) 设置为0表示不进行该值的判断。
容错相关参数mapreduce.map.maxattempts=4 每个MapTask最大重试次数,一旦重试参数超过该值,则认为MapTask运行失败 mapreduce.reduce.maxattempts=4:每个ReduceTask最大重试次数,一旦重试参数超过该值,则认为MapTask运行失败 mapreduce.task.timeout=600000:Task超时时间,经常需要设置的一个参数,该参数表达的意思为:如果一个task在一定时间内没有任何进入,即不会读取新的数据,也没有输出数据,则认为该task处于block状态,可能是卡住了,也许永远会卡住,为了防止因为用户程序永远block住不退出,则强制设置了一个该超时时间(单位毫秒),老版本默认是300000。如果你的程序对每条输入数据的处理时间过长(比如会访问数据库,通过网络拉取数据等),建议将该参数调大
=====================================================================================
mapreduce常用命令
#执行jar包程序
hdfs jar file.jar
#杀死正在执行的jar包程序
hdfs job -kill job_202222xxxx
#提交作业
hdfs job -submit <job-file>
#打印map和reduce完成百分比和所有计数器
hdfs job -status <job-id>
#打印计数器的值
hdfs job -counter <job-id> <group-name> <counter-name>
#杀死指定作业
hdfs job -kill <job-id>
#打印给定范围内jobtracker接收到的事件细节
hdfs job -events <job-id> <from-event-#><#-of-events>
#打印作业的细节、失败及被杀死原因的细节。
更多的关于一个作业的细节比如成功的任务,做过的任务尝试等信息可以通过
all选项查看。
hdfs job -history [all] <jobOutputDir>
hdfs job -history <jobOutputDir>
#显示所有的作业。-list 只显示将要完成的作业
hdfs job -list [all]
#杀死任务,被杀死的任务不会不利于失败尝试
hdfs job -kill -task <task-id>
#使任务失败。被失败的任务会对失败尝试不利
hdfs job -fail -task <task-id>