通常来讲,计算节点和存储节点是同一个,即mapreduce框架和hadoop分布式文件系统运行在相同的节点集群,使得任务调度更加高效,网络带宽更聚合。
mapreduce框架包括一个单一的ResourceManager,每个集群节点一个NodeManager,每个应用一个MRAppMaster节点。
客户应用设置输入和输出位置=》提供实现map和reduce方法=》haddoop 任务客户端提交任务,同时向ResourceManager提交配置。
ResourceManager负责将提交的任务配置项从节点分发,调度任务,监控任务,向客户端提供任务状态及诊断信息。
mapreduce 框架以 k-v 形式操作数据,输入输出处理;
将输入的k-v 键值对映射转换到中间 k-v 键值对,转换为单独的任务,中间类型和输入类型可以不同,一个输入键值对可能映射转换为0个或多个输出键值对。
map结果并不直接存储磁盘,会利用缓存做一些与排序处理,调用combiner,压缩,按key分区,排序等,尽量减少结果的大小。map完成后通知task,reduce进行处理。
结果写入到hdfs中,归并处理为小批量结果
哈希分区是默认的分区类型:HashPartitioner is the default Partitioner.
提交任务,跟踪处理,访问任务报告,日志获取mapreduce集群状态。
job提交过程:
public interface InputSplit extends Writable {
long getLength() throws IOException;//split 大小,支持根据size排序
String[] getLocations() throws IOException;//获取存储该分片的数据所在节点位置信息
}
通常一个split对应一个block,使得map可以在存储由当前数据的节点上运行当本地任务,不需要通过网络跨节点调度任务。
大小配置: mapred.min.split.size, mapred.max.split.size, block.size
获取文件在hdfs上的路径及block信息,根据splitsize对文件进行切分,默认splitsize = blocksize = 64m
将InputSplit 拆分为k-v 键值对。
CombineFileInputFormat:将若干个InputSplit打包,避免过多的map任务(split数目决定了map任务数),
OutputFormat:验证输出配置;写输出文件。
DistributedCache 是mapreduce提供的一项机制,用于缓存应用需要的文件(文本,压缩包,jar等)
应用通过url(hdfs://url)配置需要缓存的文件;DistributedCache嘉定需要缓存的文件都已经在FileSystem中。
在从节点执行任务之前,mapreduce会将需要的文件拷贝到相应节点,
DistributedCache会跟踪相应文件的更改时间戳,缓存的文件在任务运行期间不可以被应用或者外部更改。
DistributedCache可以被用作文件分发。运行jar,配置等
mapreduce.job.cache.file=file1,file2
mapreduce.job.cache.archive=
private:本地私有文件;针对相应的job使用;public:公共全局文件夹,被所有任务共享使用。