大数据 T2 分布式计算与MapReduce(Hadoop实现)

97 阅读5分钟

专栏 大数据 数据处理原理
如果对你有帮助求个赞或者关注,谢谢谢谢。

T1 大数据简介中,提到计算能力可以通过横向或者纵向扩展来增加,纵向增加简单,但是单个机器总是有极限,因此之后讨论的都是横向扩展,即分布式计算。

分布式计算可能出现的问题

接下来以一个统计一本书的例子进行说明

  1. 传统单机计算
    • 文章按顺序读取,遇到一个空格,counter加一。

image.png

  1. 两台电脑计算

    • 一半给一台电脑,另一半给另一台电脑,每台电脑计算过程不变。然后再进行汇总
    • 相比于1,发现多了一步汇总步骤

image.png

通过这个简单例子我们就能发现,分布式计算并不能达到线性的计算性能增长。 这个例子是最简单的,两个电脑计算是相对独立的,只需要最后将答案合在一起就好。但即使在这个例子中也存在一些问题,

Q:如果一台电脑计算的更快,已经计算完了,另一半才算一半怎么办?

A: 等着

Q 两个电脑都算完了,怎么汇总结果?

A:通过网络。如果结果更加复杂,比如计算结果是比较长的文字信息,并且是下一步计算的中间值,这就要求较大的带宽。因此网络很可能就会是计算瓶颈。

Q: 在哪里汇总?

A: 可以电脑A将结果发送给B,然后B将两个结果相加然后输出。也可以有一个计算机专门负责最后的结果处理与合并

更复杂一点的系统

加入一个Master节点,专门负责分发任务和接收和输出结果。 Machine表示不同的计算机,slot表示每个计算机可以同时进行多少任务。storage中存放需要处理的数据

image.png

计算过程

这个过程仍然十分简洁,Master收到了来自用户(User)的任务(比如计算这本书的单词数)。然后将任务进行切分并且分配到不同的计算机,等他们计算完成之后,返回一个结果。Master等到所有计算机完成这个任务后,汇总并且输出。

有什么问题吗?

之后将每个计算单元称为节点(节点不一定指的是一个计算机,多核CPU,也可能成为多个节点)。

  1. Node failure
    有一个机器在计算过程中失去联系了(网络断开或者机器故障)

image.png

解决方法:Master将分给这个节点的任务分给另一个节点。

  • 如果刚分给另一个节点,这个节点又上线了呢?取消刚刚分配任务?
  1. Master failure

计算过程中Master节点down了。

image.png

本地先保存结果,Master上线了之后再给它结果。

  • 一直不上线呢?另一个Master Node当做备用?那如何管理这两个Master?套娃问题。

这么简单的分布式系统就有这么多问题,实际中会更多。后面会介绍一些解决方法。

MapReduce

前面介绍了,分布式系统有几个主要的挑战:

  • 额外开销:至少多了一步汇总
  • 负载均衡:一个节点计算完成后等另一个节点,浪费计算资源
  • 业务流程:怎么将文件分发出去,有错误怎么办

Map Reduce尝试解决这些问题

什么是Map Reduce

Map Reduce其实就是两个操作,分别为Map操作与Reduce操作。

  1. Map(key1, Value 1) --> List[<Key, Value2>]
  2. Reduce(Key2, List[Value2] --> List< Value2 >)

最早是由Google 在2004年在论文中提出的: 任何数据问题,都可以通过Map与Reduce操作来完成。

比如计算书里Crypto单词数

image.png 两个计算机会先读取书 <doc ID, document>的信息,然后通过一系列Map操作,输出一个List。这个List的每个元素是一个二元组,二元组的key是单词,value是这个单词出现的次数。

等计算完成之后,通过key进行查找相应单词的count(就是crypto),并且讲这些值进行相加,最后输出结果。

详细的数据类型变化

image.png

处理数据的三个步骤:

  • 过滤数据: Map
  • 数据类型转换: Map
  • 数据聚合: Reduce

Hadoop,MapReduce实现

MapReduce是由谷歌提出来的,但是它并没有进行开源,因此Yahoo尝试对MapReduce进行实现。

MapReduce是谷歌提出的一个概念,他讲述了这个东西的实现原理是什么,但是并没有给出他们是如何实现的。Yahoo根据Google提出的概念实现了一个自己的版本,叫做Hadoop

Hadoop生态

Hadoop的创建改变了大数据的处理过程,Hadoop发展中也遇到了一些问题,为了解决这些问题,更多的工具被开发出来了,尽管他们最初可能与Hadoop相关,但是现在也发展成了一个单独的处理工具。比如Zookeeper,Kafka。后面会大概进行解释。

目前比较火的Spark正渐渐代替Hadoop,但是Spark是依靠Hadoop实现出来的,因此在写Spark代码的时候,仍然需要导入Hadoop相关的包。

Hadoop架构

image.png

主要由两部分组成 Client与Machine,Client主要就是提交任务,Machine用来实际处理任务。每个Machine又分为执行和存储两部分。

执行部分中:有一个Machine持有job tracker,它是用来分发任务的,因此是一个较为重要的节点。Task Tracker就是用来进行实际执行计算任务,并且具有一些其他功能,比如向job tracker发送心跳(heartbeat)表示自己仍然在征程工作,或者发送工作进度等。

存储部分中: 分为Name Node和 Data Node,name node就像是一个索引表,用来记录数据在哪,Data Node就是实际的数据。

接下来呢?

下一篇文章会介绍Hadoop中如何实现的MapReduce以及它们的工作过程。