1.MapReduce 分布式计算框架
企业开发不用jiav代码,很复杂,很累赘,mr job基于磁盘运算,速度太慢
Map:映射(元素的个数)
hadoop001:
x --》(x,1) key,value 键值对
y --》(y,1)
z --》(z,1)
x --》(x,1)
hadoop002:
x --》(x,1)
z --》(z,1)
Reduce: 归约
x,2
y,1
z,1
**
2.MapReduce架构(重要)
**
当面试的时候问到,MapReduce 架构设计、Yarn架构设计、Yarn的工作流程、MapReduce job 提交到 Yarn的工作流程 (面试题为同一题),其实都是同一个问题。
on Yarn 运行在Yarn上
容器:container(Yarn的资源的抽象概念)
运行在 Yarn nodemanager节点机器上,是一个虚拟的概念,将内存和cpu(vcore)封装成最小的单元,运行我们计算的任务task。
vcore 虚拟core
YARN中目前的CPU被划分成虚拟CPU(CPU virtual Core),
这里的虚拟CPU是YARN自己引入的概念,
初衷是,考虑到不同节点的CPU性能可能不同,
每个CPU具有的计算能力也是不一样的,
比如某个物理CPU的计算能力可能是另外一个物理CPU的2倍,
这时候,你可以通过为第一个物理CPU多配置几个虚拟CPU弥补这种差异。
用户提交作业时,可以指定每个任务需要的虚拟CPU个数。
物理core
vcore: 虚拟内核
4core--》(生产1:2 默认,1:1)
处理并行度提高
3.task 运行计算任务在 container
Yarn:
job也叫 app也叫 application 也叫作业
ResourceManager:资源作业管理者
它有两个属下(Applications Manager 作业管理
Resource Scheduler 资源调度)
NodeManager:节点管理者
1.用户向yarn提交应用程序(job),其中包括application Master程序,启动application Master命令等
2.RM为该job分配了一个容器,并于对应的NM通信,要求它在这个容器中启动job的MR application Master程序
3.启动程序之后,applocation Master首先向ApplicationsManager注册,用户就可以直接在web界面上查看job的整个运行状态和日志
4.applicationMaster向Resource Scheduler采用轮询的方式通过RPC协议去申请和领取资源列表
5.一旦applicationMaster申请到资源后,便与对应的NM节点通信,要求启动任务
6.NM为任务task设置好运行环境(环境变量,jar),将任务的启动命令写在一个脚本文件中,并通过脚本文件【启动任务】
7.各个task通过RPC协议向applicationMaster汇报自己的状态和进度,以让applicationMaster随时掌握各个任务的运行状态,从而可以在任务运行时重新启动任务,则web界面可以实时查看job当前运行状态。
8.job运行完成后,applicationMaster向RM注销自己并关闭自己
一共分为两个阶段:
> 启动applicationMaster
> 由applicationMaster创建job,为它上去资源,并监控它的整个运行过程,知道运行完成
4.shuffle 洗牌
map--> shufle--> reduce
map task默认设置为3个,reduce task默认设为1个,所以结果只有一个文件
仔细看一下博客:http://blog.itpub.net/30089851/viewspace-2095837/
5.常用命令
[hadoop@hadoop002 bin]$ mapred --help
Usage: mapred [--config confdir] COMMAND
where COMMAND is one of:
pipes run a Pipes job
job manipulate MapReduce jobs
queue get information regarding JobQueues
classpath prints the class path needed for running
mapreduce subcommands
historyserver run job history servers as a standalone daemon
distcp <srcurl> <desturl> copy file or directories recursively
archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
archive-logs combine aggregated logs into hadoop archives
hsadmin job history server admin interface
Most commands print help when invoked w/o parameters.
[hadoop@hadoop002 bin]$ mapred job
Usage: CLI <command> <args>
[-submit <job-file>]
[-status <job-id>]
[-counter <job-id> <group-name> <counter-name>]
[-kill <job-id>]
[-set-priority <job-id> <priority>]. Valid values for priorities are: VERY_HIGH HIGH NORMAL LOW VERY_LOW
[-events <job-id> <from-event-#> <#-of-events>]
[-history [all] <jobHistoryFile|jobId> [-outfile <file>] [-format <human|json>]]
[-list [all]]
[-list-active-trackers]
[-list-blacklisted-trackers]
[-list-attempt-ids <job-id> <task-type> <task-state>]. Valid values for <task-type> are MAP REDUCE. Valid values for <task-state> are running, completed
[-kill-task <task-attempt-id>]
[-fail-task <task-attempt-id>]
[-logs <job-id> <task-attempt-id>]
Generic options supported are
-conf <configuration file> specify an application configuration file
-D <property=value> use value for given property
-fs <local|namenode:port> specify a namenode
-jt <local|resourcemanager:port> specify a ResourceManager
-files <comma separated list of files> specify comma separated files to be copied to the map reduce cluster
-libjars <comma separated list of jars> specify comma separated jar files to include in the classpath.
-archives <comma separated list of archives> specify comma separated archives to be unarchived on the compute machines.
The general command line syntax is
bin/hadoop command [genericOptions] [commandOptions]
[hadoop@hadoop002 bin]$ mapred job -list
19/02/23 21:39:34 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
19/02/23 21:39:35 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
Total jobs:1
JobId State StartTime UserName Queue Priority UsedContainers RsvdContainers UsedMem RsvdMem NeededMem AM info
job_1550323870337_1633 PREP 1550928758524 hadoop root.hadoop NORMAL 0 0 0M 0M 0M http://hadoop002:8088/proxy/application_1550323870337_1633/
[hadoop@hadoop002 bin]$ mapred job -kill job_1550323870337_1633
19/02/23 21:39:48 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
19/02/23 21:39:48 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
19/02/23 21:39:49 INFO impl.YarnClientImpl: Killed application application_1550323870337_1633
Killed job job_1550323870337_1633
[hadoop@hadoop002 bin]$
[hadoop@hadoop002 bin]$