同期文章:
HDFS知识体系(知其然,知其所以然) - 掘金 (juejin.cn)
YARN:分布式资源管理框架 - 掘金 (juejin.cn)
一、MapReduce是什么
根据官方官网:Hadoop Map/Reduce教程 (apache.org)
注:本文加入了自己的理解,与官网有部分不一致。且本人也只是在学习的路上,不是布道者,可先参阅官网,对照解读。
概述
Hadoop MapReduce 是一个易于使用的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群 上,并以一种可靠容错 的方式并行处理上TB级别的数据集。
MapReduce的核心思想就是分而治之 ,在有了HDFS能够存储海量数据后,海量数据的运算也是一个艰巨的挑战,这个时候的处理基调就和HDFS一脉相传。在一台机器上无法处理的大量数据就把他们的切成小块的,然后堆机器,凑成集群分布式并行地存储或处理。
一个Map/Reduce 作业(job) 通常会把输入的数据集切分为若干独立的数据块,由map任务(task) 以完全并行的方式处理它们。框架会对map的输出先进行排序,然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。该框架负责调度任务,监视它们并重新执行失败的任务。
通常,MapReduce 框架和HDFS分布式文件系统是运行在一组相同的节点上的,也就是说,计算节点和存储节点通常在一起。这种配置允许框架在那些已经存好数据的节点上高效地调度任务,这可以使整个集群的网络带宽被非常高效地利用。
MapReduce架构
MapReduce框架是典型的主从架构,由一个单独的master JobTracker 和每个集群节点一个slave TaskTracker共同组成。master负责调度构成一个作业的所有任务,这些任务分布在不同的slave上,master监控它们的执行,重新执行已经失败的任务。而slave仅负责执行由master指派的任务。
任务流程
- 应用程序至少应该指明输入/输出的位置(路径),并通过实现合适的接口或抽象类提供map和reduce函数。再加上其他作业的参数,就构成了作业配置(job configuration)。
- 然后,Hadoop的 job client 提交作业(jar包/可执行程序等)和配置信息给JobTracker,后者负责分发这些软件和配置信息给slave、调度任务并监控它们的执行,同时提供状态和诊断信息给job-client。
MapReduce的多样性
虽然Hadoop框架是用JavaTM实现的,但MapReduce应用程序则不一定要用 Java来写。例如:
- Hadoop Streaming是一种运行作业的实用工具,它允许用户创建和运行任何可执行程序 (例如:Shell工具)来做为mapper和reducer。
- Hadoop Pipes是一个与SWIG兼容的C++ API (没有基于JNITM技术),它也可用于实现Map/Reduce应用程序。
有一说一,官网放这么一段让人摸不着头脑,跟前后的逻辑性都不太强。我觉得贴出这些,主要是强调MapReduce更多的是一种分而治之的思想,不是一个程序组件,其他的语言框架也能够实现MapReduce。
插一句,Hadoop三大基础模块,HDFS和YARN的可替代性都不太强,就MapReduce出了一大堆替代品。目前用到原生MapReduce的项目少之又少,取而代之的是Spark、Flink、Storm。
二、MapReduce为什么出现
1. 大数据运算的困境
我们假设有这样一个任务:作为一家知名互联网公司,你们网站的流量很好,目前有一个存储了用户浏览网站日志数据的文件,文件大小达到了500GB。你们的任务很简单,就是要统计出每个用户的浏览次数。
按照惯有传统的处理方式,你会面临以下几个难题:
- 你的机器就算是性能最强的机器,他的单机处理能力也是有限的:500GB的数据量已经超过了单台普通机器的处理能力,如果你上性能最强的机器,倒也不是不行,但是性价比太低了。
- 容错性差:因为数据量过大,处理的时间跨度将会非常长,在这个期间如果处理程序或机器出错,整个任务将失败。
- 可扩展性差:如果日志数据量进一步增加,扩展能力受限,总不能一直提升机器性能,机器性能的发展速度是远远不及数据增长速度的。
2. MapReduce的解决方案:
-
集群分布式处理:可以利用数十、数百台服务器作为计算节点。
-
自动并行处理:根据数据量自动划分Map任务,可最大化利用集群资源。
-
容错机制:单个Map或Reduce任务出错可重新执行,不影响整体作业。
-
可扩展性:可轻松扩展更多节点来处理更大的数据量。
-
程序易用:只需要实现Map和Reduce函数即可,不需要关注底层分布式处理。
总结一下,MapReduce主要采用了分而治之的思想,通过分布式集群来提供处理大规模数据的计算能力和并行处理能力,并可以方便地扩展规模。同时还提供了容错、数据本地化等机制,很好地解决了传统方式无法有效处理大数据的困难。
3. MapReduce的优势
-
数据规模理论上无限大 传统的处理方式如用一个程序在单机上顺序处理,其数据处理规模受限于单机的计算资源。而mapreduce可以通过扩展更多的计算节点来处理更大规模的数据集,是面向大数据场景的。
-
并行计算 传统方法通常需要手动实现分布式并行逻辑。而mapreduce具有内置的分布式并行处理能力,自动将任务分解并调度到不同节点运行,程序员不需要关心并行细节。
-
容错能力 单机上程序运行错误会导致整个任务失败。而mapreduce中如果个别map或reduce节点失败,可以重新运行失败的任务,不会影响整体作业的执行。
三、MapReduce工作流程
mapreduce是一种用于大规模数据处理的编程模型,主要包括两个关键步骤:
map阶段:
- 将输入的数据集根据某种规则分割成独立的划分(splits)。
- 为每个划分分配一个map任务,该任务将输入数据集转换为一组键值对。
- Map函数将输入数据中的每一个记录进行转换,输出格式为<key, value>。
reduce阶段:
- 对map输出的键值对进行排序、合并。
- reduce函数接受map函数输出的键和该键关联的所有值,并输出reduce的结果。
MapReduce案例
用一个词频统计的简单示例,用伪代码和数据来解释mapreduce的工作流程:
假设我们有一组文本数据:
js
text1 = "hadoop mapreduce is great"
text2 = "hadoop is useful for big data"
text3 = "mapreduce simplifies distributed computing"
map阶段:
- 对每条输入文本数据,使用split将文本分割成单词
js
hadoop mapreduce is great hadoop is useful for big data mapreduce simplifies ......
- 对文本中的每个单词,分配map任务(计数为1),转换为键值对类型<key , value>。map的输出是:
js
("hadoop", 1)
("mapreduce", 1)
("is", 1)
("great", 1)
("hadoop", 1)
("is", 1)
("useful", 1)
...
具体代码案例如图所示:
reduce阶段:
- 对map输出的同一个key(单词)的键值对进行排序和合并。排序默认是快速排序和升序;合并就是将相同key值的归并在一起。
排序后结果:
js
("big", 1)
("computing", 1)
("data", 1)
("distributed ", 1)
("for", 1)
("great", 1)
("hadoop", 1)
("hadoop", 1)
("is", 1)
...
合并后结果:
js
("big", 1)
("computing", 1)
("data", 1)
("distributed ", 1)
("for", 1)
("great", 1)
("hadoop", 1, 1)
("is", 1, 1)
...
- 聚合操作,可以为加和、乘、链接等。词频统计采用的是加和。
聚合结果为:
js
("big", 1)
("computing", 1)
("data", 1)
("distributed ", 1)
("for", 1)
("great", 1)
("hadoop", 2)
("is", 2)
...
具体代码案例如图所示:
四、MapReduce的局限性
mapreduce通过分而治之的思想很好地解决了大规模数据集的分布式计算问题,因其扩展性和容错性,在日志处理、数据挖掘等大数据业务场景发挥了重要作用。
但是mapreduce也有一些局限性:
- 迭代计算能力有限:MapReduce主要用于大规模数据集的并行处理,但在处理需要迭代计算(如机器学习算法)的问题时,计算复杂性就会大幅度提升,影响其计算效率。
- 缺乏灵活性:MapReduce的编程模型相对固定,需要按照特定的步骤进行数据处理。这使得它在处理不同类型的任务时可能不够灵活,比如我们的大作业二次排序都得折腾半天,体验不太好。
- 不适合实时处理:MapReduce是一个批处理系统,它通常在大量数据上执行长时间的操作。对于实时数据处理和实时查询等需求,MapReduce可能就顶不上去了。
- 不适用于交互式分析:MapReduce不适合用于交互式分析,因为它的计算过程是批量式的,不能实时提供结果。
- 对于复杂任务的编码复杂性:对于一些复杂的任务,MapReduce的编程模型可能会变得非常复杂,需要大量的代码来实现。
针对于此,许多其他的计算模型也在不断发展,以弥补MapReduce的不足,例如Apache Hadoop中的其他组件,如Hadoop Streaming、Hive、Pig等,提供了更灵活的大数据处理能力。此外,还有其他的分布式计算框架如Spark、Flink等也提供了更高级的功能和更友好的编程接口。
总体来说,mapreduce通过其分而治之的架构,非常适合处理大规模数据集的统计、排序、搜索等问题,可以自动实现分布式并行计算,使得大数据的处理变得可行。但也需要注意它不擅长低延时和流式处理,且代码结构不够灵活。