MapReduce特点 易于编程(熟悉之后确实很简单,大多数是map和reduce两个部分。hive和pig让mapreduce更加简单) 良好的扩展性(简单的添加机器就可以实现) 高容错性(job中任务部分失败,可以重新执行) 适合PB级以上海量数据的离线处理 MapReduce不擅长 实时计算 像MySQL一样,在毫秒级或者秒级内返回结果(可以参考Spark或HBase,HBase随机读写性能好,统计不太好) 流式计算 MapReduce的输入数据集是静态的,不能动态变化 MapReduce自身的设计特点决定了数据源必须是静态的(可以考虑Storm) DAG计算 多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出(Tez) MapReduce编程模式 wordcount过程 MapReduce将作业的整个运行过程分为两个阶段 Map阶段和Reduce阶段 Map阶段由一定数量的Map Task组成 输入数据格式解析:InputFormat 输入数据处理:Mapper 数据分组:Partitioner Reduce阶段由一定数量的Reduce Task组成 数据远程拷贝 数据按照key排序 数据处理:Reducer 数据输出格式:OutputFormat 经典流程图,如果看懂这张图,那么你对MapReduce理解的已经不错了 默认TextInputFormat对文件切分,并处理每一个Split,提供RecordReader生成key/value TextInputFormat:Key是行在文件中的偏移量,value是行内容若行被截断,则读取下一个block的前几个字符 设计到的概念 Block HDFS中最小的数据存储单位默认是64MB Spit MapReduce中最小的计算单元默认与Block一一对应 Block与Split Split与Block是对应关系是任意的,可由用户控制 Map阶段 InputFormat(默认TextInputFormat) Mapper Combiner(local reducer) Partitioner Reduce阶段 Reducer OutputFormat(默认TextOutputFormat) Combiner Combiner可做看local reducer合并相同的key对应的value(wordcount例子)通常与Reducer逻辑一样好处 减少Map Task输出数据量(磁盘IO) 减少Reduce-Map网络传输数据量(网络IO) 结果可叠加 Sum(YES!),Average(NO!) Partitioner Partitioner决定了Map Task输出的每条数据交给哪个Reduce Task处理默认实现:hash(key) mod R R是Reduce Task数目 允许用户自定义,很多情况需自定义Partitioner 比如“hash(hostname(URL)) mod R”确保相同域名的网页交给同一个Reduce Task处理 MapReduce架构 Jobtracker • 管理所有作业 • 将作业分解成一系列任务 • 将任务指派给TaskTracker • 作业/任务监控、错误处理等 Tasktracker • 运行Map Task和Reduce Task • 与JobTracker交互,执行命令,并汇报任务状态 MapTask • Map引擎 • 解析每条数据记录,传递给用户编写的map() • 将map()输出数据写入本地磁盘(如果是map-only作业,则直接写入HDFS) ReduceTask • Reduce引擎 • 从Map Task上远程读取输入数据 • 对数据排序 • 将数据按照分组传递给用户编写的reduce() MapReduce容错性 JobTracker 单点故障,一旦出现故障,整个集群不可用 TaskTracker 周期性向JobTracker汇报心跳 一旦出现故障,上面所有任务将被调度到其他节点上 MapTask/ReduceTask 运行失败后,将被调度到其他节点上重新执行 MapReduce任务提交 |
mapreduce原理与学习道路
最新推荐文章于 2022-03-17 21:45:19 发布