Mapreduce

 

inputformat的两种功能:数据切分功能(data splits)、记录读取器(record reader),理论上来说,一个split和一个block的大小是一致的。

map是一个进程,把split中的数据读到内存,达到百分之80的时候,开始往磁盘上写数据(小数据,命名为spill.n),在读数据的同时,还会做一次sort,把相同key的数据排到一个区间,最后把很多个小份数据“归并排序”成一个大份数据。

paritition(shuffling):每一个map处理后产生的不同key和value,把key做hash给reduce这个过程叫做parttition。 

两个进程:jobtracker tasktracker

 

 

 

这个图是有6个map,2个reduce,8个进程。为什么mapreduce采用多进程的并发方式,而不是多线程的并发方式?首先这个多进程并发方式的模型, 每一个进程,每一个任务去占用资源去进行控制,因为这个进程空间是独享的,有什么优势呢?方便对每个任务进行资源的控制和调配,那选择进程,缺点是,进程相比线程来说,它会消耗更多的启动时间,也就是说进程的一个启动时间要比线程的时间慢好多, 因为这个因素,直接导致mapreduce不适合运行一些低延时类型的作业,所以之前说mapreduce有一个很大的缺点,就是时效性不高,所以mapreduce只适合做一些批量操作,适合一些高吞吐,离线的情况下。

 

hdfs:数据源存在这,数据源都是以file的方式表示的,当你提交了一个文件,这个文件会被切分成一些小的文件,hdfs是一个文件系统,那么就会有一个数据单位,这个数据单位就是block,默认是64M,默认备份3个,存在不同的机器上。    通过非java方式开发的代码,读取的数据都是fextfile明文类型的,这个类型的优点是可读性好,缺点是这种类型数据不压缩,浪费空间,会导致磁盘开销比较大。

 

 shuffle:包含很多环节,partion,sort,spill,meger,combiner,copy,memery,disk。  

 

posted @ 2017-10-21 16:53  hubophp  阅读(277)  评论(0)    收藏  举报