hadoop 集群常用命令(学习笔记) —— 筑梦之路

概念介绍

#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 结果进行汇总

各组件和对应服务名

组件名服务名进程名
NameNodehadoop-hdfs-namenodeNameNode
DataNodehadoop-hdfs-datanodeDataNode
ResourceManagerhadoop-yarn-resourcemanagerResourceManager
NodeManagerhadoop-yarn-nodemanagerNodeManager
JobHistoryhadoop-mapreduce-historyserverJobHistoryServer
JournalNodehadoop-hdfs-journalnodeJournalNode
zkfchadoop-hdfs-zfkcDFSZKFailoverController

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值