hive框架主要是针对mapreduce进行封装的。
Hadoop MapReduce MapReduce核心思想初认识
mapreduce里面的map阶段,需要把文件分开
一个文件200MB,分成两个 128MB和72MB
这个不是分块,这个专业术语叫做切片
为什么切片生成以后是以128MB来切的呢?
因为切片和块有关系。
切的每一片都会分一个MapTask
如果两个文件切片成了三份,map阶段就会有三个Maptask,三个task互不干扰,并发执行。
每个maptask操作每个切片的时候,按行读取,先要将切片文件进行切割。碰到重复的数据,不管前面有没有出现,不会叠加,而是重复的记录出来就行。
map阶段处理完了,因为要求a-p,q-z分成不同的文件,所以每个maptask读完分配给自己的切片之后,需要进行分区写出去。
分区是根据需求来的,分了多少个区就需要多少个ReduceTask
分区的时候可以理解为有两个文件,但实际上是只有一个文件。
这个文件有两块,一块放的都是a-p,另一块q-z
每一块存的内容都是 单词 1 这样的形式。
接下来到了Reduce阶段。
因为在map阶段是有多个maptask的。每个task都有分区1和分区2.所以reduce需要把每个maptask的分区1汇总到reducetask1 把所有maptask的分区2汇总到reducetask2.然后每个reducetask互不相干,并发执行。对那些hadoop 1 hadoop 1 进行汇总成hadoop 2
reducetask处理的输入数据就是每个maptask处理的输出数据。
整个mapreduce中只有一个map阶段,一个reduce阶段。
我们前面分map阶段:根据将文件逻辑分片,每一片是一个maptask,根据业务(a-p,q-z放在不同文件)实现分区,每个区就是后面的每个reducetask.
对于一些非常复杂的任务中,需要编写多个mapreduce程序,先处理一部分任务。
每个mapreduce程序只能有一个map阶段,一个reduce阶段,但是每个阶段可以有多个task.
MRAppMaster:
当时讲Yarn的时候,有:
resourceManager
nodemanager
applicationMaster(接口)
真正在运行一个mapreduce程序的时候,会启动一个
AppMaster,真正启动的对象是MRMaster
所以可以理解为MRAppMaster是applicationMaster具体的实现类。监控整个mr程序的运行。
一个MR程序提交到Yarn上去执行
Yarn可以运行很多个MR程序,为每个MR启动一个MRAppMaster
因为涉及到序列化的问题,hadoop认为java里面的序列化非常的笨重,所以自己指定了数据类型来对应java里面的数据类型,Text-String,
IntWritable-int等等。所以写mr程序需要进行类型住哪换
驱动类来驱动Mapper和Reducer
这个job就可以理解为一个MR程序。