前言
你将 get 到分布式计算引擎的核心思路,MapReduce 并行度解析
一、MapReduce 的核心思路
1.1 分布式计算引擎
下图描述的是 MapReduce 的几个核心阶段
一句话总结分布式处理的核心思路:分而治之 + 并行计算。之后的 Spark 和 Flink 都是基于它的思想所设计的。HDFS也可以一句话总结:分散存储 + 冗余存储。
复杂问题,单台计算搞不定,那么就发挥人多力量的优势:组建一个多服务器组成的集群来搞定分 布式并行计算。核心过程为:
- 第一阶段 Mapper(提取特征的过程):复杂大任务拆分成多个小任务并行执行计算
- 第二阶段 Reducer(执行逻辑的地方):把第一阶段的并行执行的小任务的执行结果进行汇总
但是单机任务转化成分布式计算任务本身就会遇到很多各式各样的问题。
- 数据存储的问题,首先需要搞定海量数据存储的问题。就是我们耳熟能详的 HDFS
- 运算逻辑至少要分为两个阶段,先并发计算(map),然后汇总(reduce)结果
- 这两个阶段的计算如何启动?如何协调?两个阶段必须保证先 map 后 reduce
- 运算程序到底怎么执行?数据找程序还是程序找数据?数据在集群的各个机器里面,但是执行任务的机器上不一定会存在数据,这时候该怎么处理?
- 如何分配两个阶段的多个运算任务?
- 如何管理任务的执行过程中间状态,如何容错?执行完的结果该怎么保存,如果执行任务时机器突然宕机了又怎么办?
- 如何监控和跟踪任务的执行?多个机器会得出计算后的结果,但是我们能不能将先执行完 第一阶段的任务的机器提前拉取到第二阶段?
- 出错如何处理?抛异常?重试?
针对上述问题,MapReduce 都已经帮我们实现好了,除了逻辑功能。
1.2 MapReduce 架构设计
它也是一个大型的责任链模式系统。而且它要保证,不管多复杂的数据种类,不管多复杂的计算类型,不管数据多大,存储在哪里,都应该能使用这个框架执行相关的任务计算。这也是作为框架的通用性!把分布式计算的整个流程都完成,然后制定规范,让用户只需要按照规范去编写对应的业务逻辑。
-
首先是数据源的对接问题,MapReduce 的数据读取组件为:
InputFormat + RecordReader
-
第一阶段:Mapper,针对原始数据进行改造,提取需要计算的数据(Value),并加上特征(Key)
-
中间阶段:把相同特征的 value 聚合到一起,执行一次第二阶段的逻辑汇总操作
<