开发者学堂课程【高校精品课-上海交通大学-企业级应用体系架构:Hadoop 1】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/75/detail/15841
Hadoop 1(三)
内容介绍
一.认识 SOA
二.如何组装服务
三.服务和构建的区别
四.服务的架构
五.微服务
六.SOA 的架构
七.Hadoop,Spark 和Storm
六.SOA 的架构
那么在 SOA 的架构里面,底层是现有的这个系统里面,他们的一个操作系统,在它上面我们部署了很多的应用,我们把它构建化。基于这些构建,我们封装出一些服务,可以从一个构建里封装出不同的服务,然后这些服务还可以组合,多个服务可以组合成一个更大的服务,然后把这些服务编排一下,就生成了服务的流程,根据流程来执行的时候,以这种门户的方式展现给用户,这是在 SOA 里面的一个分层架构。当然我说的这些只是一个理论、一个概念,真正要使用的话,那要去用相应的东西,比如说开源的,有一个叫 servicemix ,这是一个开源的 service spa ,商用的,大家可以去用。有一个叫websphere ,大家也可以去用,它是 IBM 的东西,它里面也支持 SOA 开发。大家要理解 SOA 和 web service 是两回事,不是说我开发成 web service 系统就是 SOA ,这是第一点。第二点是 SOA 里面这个 service 更面向业务逻辑,它和构建本来就是两个不同的维度,相当于一个竖着看,一个横着看,所以它们两个之间是一个多的关系,没有说服务是谁更粗,不是若干的构建把它分装出来,所以这种基本的概念要理解。然后就是 SOA 里面最重要,这三个特性是靠服务总监来实现的,只有具备这样的特点才是 SOA 。
七.Hadoop,Spark 和 Storm
这节课我们转入到另外一个话题,它不再是单个的系统的开发,而是并行的一个系统框架,常用的,比如 Spark 或者 Storm ,我们可以认为他们是从 Hadoop 这个上面演化出来的,或者认为 Hadoop 是一个基础。我们把 Hadoop 拆开,它里面的分布式文件系统,它的大表,这些东西我们在未来的几节课里都会去讲。讲完它之后,我们就看一些商业的系统,或者说用的很多的一个系统 Storm 和 Spark 是什么样的,它们都属于并行处理框架。我们前面讲的集群,使用起来是两个,一个是在做系统的负载均衡,即系统压力太大,要把客户端的请求均衡到后面的若干台机器上去处理。第二个是在数据库做容余,就是防止一个数据库节点崩溃之后,其他的节点不能访问,数据不能访问,我要让其他的节点备份。这两个里面都暗含了一点,就是这个集群里面所有的机器,实际上可以一起来做某一件事情,比如在容余里面,我们可以把数据库的读请求发送到 slave 节点上,把写请求给 master 去写,然后让 master 去同步所有的 slave 。实际上,我们就看到写读请求,在做负载均衡的时候,会分到多台机器上去做。那如果他们在读不同的部分,每一个节点处理不同的部分,最后把结果合起来就是在并行。我们是在拿一个集群去做同样一件事情,只是把一个很大的输入分割成若干个小的部分,每一部分在某一个节点上执行,这样执行完了之后,把每一个节点的数据汇聚起来,就能得到最终的结果。所以,我们现在要谈论的话题是如何进行并行处理。很显然如果一台机器不够,就再加一台,再加一台,不断的加,这样系统的处理能力就会增强。那关键的问题是加了之后应该如何去使用它。
最常用的就是这个 Hadoop 。它真正在面对并行问题的时候,我们用的最基础就是 MapReduce ,在 Hadoop 新的版本里面,它后来有一个 MapReduce 2.0。然后我们讲一下 Storm ,这个推特的东西是怎么样的,最后讲一下 Spark 。 Hadoop 现在被收入到 Apache 里面去了,变成了 Apache 的一个项目。 Hadoop 这个名字本身没有什么意义,实际上它的作者在家带孩子,作者在想到这个项目不知道应该叫什么的时候,他的小孩儿不太会发声,作者就听他说话,发出一个大概这样的声音,他就把 Hadoop 作为这个项目的名字,所以 Hadoop 不是什么东西的缩写,它就是这样定下的比较奇怪的一个名字。无论如何,在这个库里面,它就是让我们在大量的数据集上,在一个计算机的集群上面去做分布式的并行处理。也就是说,我给你一组机器,给你一个很大的输入,你要把它分发到这一组机器上面去做编程,但是这个编程的模型要尽量的简单,这就它最初的想法。当然它里面除了要去做 mapreduce 这样的并行的处理之外,它为了支撑这个事情,还会有像分布式文件系统,还有 HP 这样的大表工具来做支撑。 Hadoop 它面向的是成千上万的机器,所以每一台机器它都有本地的计算能力和存储能力。那么,它的想法就是,我们与其要一个非常大的超级计算机,不如要一堆廉价计算机组成一个很大的计算机的集群,而且,这个集群,因为都是廉价计算机,所以我也不能保证所有的机器都不会出故障,但是我可以保证即使它出故障我也能处理,所以整个系统会表现出很高的可靠性。
这句话的后面暗含的意思就是,我们要去检测到这种错误,而且能够去容错。容错在很大程度上就是靠副本的,所以它就是用大量的廉价机器去堆出一个超级计算机一样的东西,这就是它的基本的想法。
Hadoop 里面核心的东西。第一个就是它的 common 的一个公共的工具库,就是将来要跑起来的一个基础的核心的东西。第二个就是它的分布式文件系统,这种大量的数据在做存储的时候要存在一个分布式的文件系统里。下节课,我们把分布式文件系统拆开来去看它里面的内容是什么样的,这节课我们后面要去使用的。
然后是有 MapReduce 和一个 YARN , YARN 就是做作业调度的,即当你给我一批作业的时候,我怎么样在一个集群里面去管理这些资源,也就是把这些作业提交给这些资源,然后让这些资源去执行。我还要去看这些 job ,给你这个资源后,这些资源执行的怎么样了?有没有崩?如果崩了应该怎么办?你给我这个作业的时候,我以什么为依据去给了这些集群里的计算机的? MapReduce 实际上是这个编程并行的处理框架,它就是要把这一大堆的输入数据,怎么样让一群机器去给他并行的去做直径来提高速度。它在底下还提供了一个对象存储,当然再往细里分,它还有像 hive 这种数据仓库,像 hBace 这种数据库,大表 KY 的数据库等等。我们这节课先去看一下并行处理是如何实现的。
为了去跑这个东西,大家下载了 Hadoop 之后,要按照它的约定做一些配置,其中上面的配置是在说如果要跑起来的话,在什么地方去做监听,它底下是 HDFS 的分布式文件系统来做支撑的,这就是这个分布式文件系统的服务的位置。然后在这个文件里面要配一下分布式文件的 replication ,即在数据存储的时候,它的副本的数量。因为我们只在一台机器上跑,所以你就设成1。如果你在很多台机器上跑,你就有可能会有足够的容余存储量,然后任何一个数据块在存储的时候都要存,比如超过一个,要有2个,甚至是3个这样的副本。也就是说,拿空间去换可靠性,任何一个数据在存储的时候我都存两份或者3份,任何一份失败了,比如 SOAP 坏了,或者是机器崩了,我还有另外一个副本可以拿出来去用。在 Hadoop 的这个 etc 目录里,这两个文件要做相应的配置,配置完之后,就可以去做相应的处理。
如图为 SSH 的东西。
关键是在这里,如果你要让它跑起来的话,要先把这个 FS 的namenode 格式化,至于 namenode 是什么,下节课再解释。在它的底层,必须要有一个分布式文件系统,这个分布式文件系统有一个像文件分区表一样,可以理解为它叫 normally 。还有其的真正存储数据的,即 DataNode 。也就是说,在很多的集群里、很多的节点上,存储数据时有一个节点在文件分区表,在那里可以去看这些文件都存在哪里,然后才到真正存储文件的 DataNode 上去获取这个文件。我们再运行 sbin/start-dfs.sh ,就能把这个分布式文件系统启动起来,启动起来之后才能去做其他的事情。一旦启动起来,还有一个外部界面( http://localhost:9870/ )可以去查看当前的环境里都有些什么样的内容,这是做一些准备工作,至少这两步是必须要做的。下载好了 Hadoop 之后就要做这两步,做完之后就可以写代码、做处理。
那么如何做处理呢?我们先看一下理论上的逻辑。这是一个 Google 提出来的方法,那么 Google 在 OSBI 操作系统的会议上,在16年前就提出来了 MapReduce 。这篇论文的题目是完整,他的想法比较简单,就是假设输入文件的数据量非常大,于是就把它切成了很多部分,不同的部分,然后我们弄了三个 worker ,指的是三个进程,这三个进程可以在三个机器,也可以在一个机器里。一般来说,我们可能会在三个机器里,否则在一台机器里,比如三个进程,就没有意义了。因为如果没有多台机器,没有一个机器群,只有一台机器,意义就不大了。
当然,如果机器很大有多个核,想跑多个进程来处理也是可以的。反正有三个不同的进程,在 map 这个阶段,我们认为他要做的事情就是把输入的数据映射成我们想要的一个结果。举个例子,我们知道红楼梦这个小说里面涉及到了很多人物,有名有姓的有多少,有名无姓的有多少,没姓有名的有多少,就是这样的人物。假设我们来做一个任务,这个任务就是这个用户程序,我们要统计一下在红楼梦里面凡是出现过的人物有多少个,并且他们出现了多少次。那么在 map 这个阶段在干什么呢?
就是对于每一个 worker ,一共三个 worker ,每次处理其中一块数据,我把这个数据拿出来之后,每看到一个人名就发出来一个,比如一个名字出现了一次这样的建制,看到一个就发一个,如果这个人在这段话里面出现了两次,我就发两个这样的信息。那么,这就是在 map 阶段,它把输入映射成了这样的一堆建制队,然后,他们三个 Worker 每一个拿一个,比如一个拿回去的是零,一个拿回去的是2,一个拿回去的是3。这三个 worker 都是受这个 master 的控制, master 会说,你们三个各去拿一个,处理完之后,比如零处理完之后告诉 master ,我处理完了, master 看到1还没处理,那你就接着处理1,所以就把1给了他。那么2处理完之后,他也会告诉 master ,我处理完了,master 就说还有4没处理,于是就把4给他,让他去处理。3处理完了之后,他会说我处理完了, master 发现现在不剩下了,现在零、2、3都处理完了,1和4还没处理完,然后1的处理时间比较长了,因为它可能是零先处理完,2后处理完的,所以1再分给下面的 worker 处理时间比4分给下面 worker 的处理时间长,于是,master 就说第三个 worker ,也不要闲着,我在没有完成的输入数据里面,找一个处理时间特别长的让你继续处理。为什么呢?其实我也不知道他会不会因为某种原因比如崩溃了,或者是碰到其他原因,导致他处理不过来,比如内存很少,我就把这种可能会碰到问题的概率最大化了。
到现在为止,执行的时间最长的这个事情,我让已经做完有空闲的那个 worker 去做。这样做的一个好处就是,万一那边真的出错了,那至少你这边已经开始做了,不用等。那如果这边没出错,很快就完成了, master 就告诉他,你不用做了,那边已经做完了。也就是说,他充分利用 worker 的计算能力,不让 worker 闲着,等到有问题了再说,只要没处理完的就去处理,如果现在没有被处理的输入块了,就找最近的正在被处理的时间最长的那个,让空闲的机器继续去处理,从头开始处理,这是在 map 这个阶段做的事情。每一块数据在处理完之后,他都会把结果写到一个指定的位置上,一个人的人名从 A 开头到 N 开头的写在一个地方,从 O 开头到 Z 开头的写在另外一个地方,每一个输入都是这样去处理的,如果这个人的人名是 O 开头就放在一边,如果这个人的人名是 S 开头就放在另一边。所以这边和另一边就是在指定的不同的位置,在某一台机器上,比如在服务器上,我用 A 来表示,另一个是在服务器 B 上。那么左边的三块都在服务器 A 上,右边的三块都在服务器 B 上。 Intermediate files (on local disks) 就是一个中间结果。然后,进入 Reduce 阶段,这个阶段在干什么呢?前面已经分成了两块,worker 就去做,比如从 A 到 N 的处理,把相同的加起来, N 在这三块里面总共有多少个< N:1 >这样的对呢?100个,就产生了< N:100 >这样一个结果。
同理,处理 S 就是从 A 到 N 的,前面的一半前面的处理,后面的一半后面的处理,就产生了 < S:94 >这样一个结果。他们的输出就会在这两个文件(output file 0和 output file 1)里,这两个文件合起来就是最终的文件。在整个过程中, Map 这个阶段和 reduce 这个阶段都是并行,即多台机器上的多个 worker 在同时执行,这就是 MapReduce 的一个含义。中间的过程叫 shutfile 就像洗牌这个动作一样,把它按照一定的规则排好,一部分在前面,一部分在后面,这是 MapReduce 的一个基本的操作。
对于 word count ,我们经常用记录一篇文章里不同的单词出现了多少次这个例子来讲, word count尾代码就是在 Map 阶段,对于每一个单词都发出一个单词“ W ”,“1”这样的一个东西。在 Reduce 这个阶段要做的事情就是,对于每一个单词来说,把这些“1”全部都加起来产生一个输出,这样就得到了每一个单词出现多少次的这个结果,这就是它的伪代码。
所以在 Map Reduce 框架里面就会有 map 和 reduce 两个东西,在它们两个的执行过程当中操作的全是这种监制队。