浅谈分布式计算的开发与实现(一)

作者 : 开心源码 本文共3528个字,预计阅读时间需要9分钟 发布时间: 2022-05-12 共133人阅读

详情

分布式计算简单来说,是把一个大计算任务拆分成多个小计算任务分布到若干台机器上去计算,而后再进行结果汇总。 目的在于分析计算海量的数据,从雷达监测的海量历史信号中分析异常信号(外星文明),淘宝双十一实时计算各地区的消费习惯等。

海量计算最开始的方案是提高单机计算性能,如大型机,后来因为数据的爆发式增长、单机性能却跟不上,才有分布式计算这种妥协方案。 由于计算一旦拆分,问题会变得非常复杂,像一致性、数据完整、通信、容灾、任务调度等问题也都来了。

举个例子,产品要求从数据库中100G的客户购买数据,分析出各地域的消费习惯金额等。 假如没什么时间要求,程序员小明就写个对应的业务解决服务程序,部署到服务器上,让它慢慢跑就是了,小明估计10个小时能解决完。 后面产品嫌太慢,让小明想办法加快到3个小时。
平时开发中相似的需求也很多,总结出来就是,数据量大、单机计算慢。 假如上Hadoop、storm之类成本较高、而且有点大才小用。 当然让老板买更好的服务器配置也是一种办法。

利用分片算法

小明作为一个有追求有理想的程序员,决定用介于单机计算和成熟计算框架的过度处理方案,这样成本和需求都能满足了。 分布式计算的核心在于计算任务拆分,假如数据能以水平拆分的方式,分布到5台机器上,每台机器只计算自身的1/5数据,这样即能在3小时内完成产品需求了。

如上所述,小明需要把这些数据按照肯定维度进行划分。 按需求来看以客户ID划分最好,因为客户之间没有状态上的关联,所以也不需要事务性及二次迭代计算。 小明用简单的hash取模对id进行划分。

<pre style=”margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: “Courier New” !important; font-size: 12px !important;”>f(memberid) % 5 = ServerN</pre>

这样程序可以分别部署到5台机器上,而后程序按照配置只取对应余数的客户id,计算出结果并入库。 这种方式多机之间毫无关联,不需要进行通信,可以避免很多问题。 机器上的程序本身也不具有分布式的特性,它和单机一样,只计算自身获取到的数据就可,所以假如某台机器上程序崩溃的话,解决方式和单机一样,比方记录下解决进度,下次从当前进度继续进行后续计算。

利用消息队列

使用分片方式相比照较简单,但有如下不足之处。

  • 它不具备负载均衡的能力,假如某台机器配置稍好点,它可能最先计算完,而后空闲等待着。也有可能是某些客户行为数据比较少,导致计算比较快完成。
  • 还有一个弊端就是每台机器上需要手动更改对应的配置, 这样的话多台机器上的程序不是完全一样的,这样可以用远程配置动态修改的办法来处理。

小明这种方式引入了个第三方,消息队列。 小明先用一个单独的程序把客户信息推送到消息队列里去,而后各台机器分别取消费这个队列。 于是就有了3个角色:

  • 推送消息的,简称Master。
  • 消息队列,这里以Rabbitmq为例。
  • 各个解决程序,简称Worker或者Slave都行。

尽管仅仅引入了个第三方,但它已经具有了分布式计算的很多特性。

  1. 计算任务分发。 Master把需要计算的客户数据,不断的推送消息队列。
  2. 程序一致性。 Worker订阅相同的消息队列就可,无需更改程序代码。
  3. 任意扩容。 因为程序完全一样,意味着假如想要加快速度,重复部署一份程序到新机器就可。 当然这是理论上的,实际当中会受限于消息队列、数据库存储等。
  4. 容灾性。 假如5台中某一台程序挂了也不影响,利用Rabbitmq的消息确认机制,机器崩溃时正在计算的那一条数据会在超时,在其余节点上进行消费解决。

Hadoop简介

Hadoop详情已经相当多了,这里简述下比方:”Hadoop是一套海量数据计算存储的基础平台架构”,分析下这句话。

  • 其中计算指的是MapReduce,这是做分布式计算用的。
  • 存储指的是HDFS,基于此上层的有HBase、Hive,用来做数据存储用的。
  • 平台,指可以给多个客户使用,比方小明有一计算需求,他只要要按照对应的接口编写业务逻辑就可,而后把程序以包的形式发布到平台上,平台进行分配调度计算等。 而上面小明的分布式计算设计只能给自己使用,假如另外有小华要使用就需要重新写一份,而后单独部署,申请机器等。Hadoop最大的优势之一就在于提供了一套这样的完整处理方案。

下面找了详情Hadoop的概览图,跟小明的设计做比照下:

  • 图中“大数据计算任务” 对应小明的100G客户数据的计算任务。
  • ”任务划分“ 对应Master和消息队列。
  • “子任务” 对应Worker的业务逻辑。
  • ”结果合并“ 对应把每个worker的计算结果入库。
  • “计算结果” 对应入库的客户消费习惯数据。

PS:为了方便形容,把小明设计的分布式计算,叫做小和尚。

MapReduce

因为MapReduce计算输入和输出都是基于HDFS文件,所以大多数公司的做法是把mysql或者sqlserver的数据导入到HDFS,计算完后再导出到常规的数据库中,这是MapReduce不够灵活的地方之一。 MapReduce优势在于提供了比较简单的分布式计算编程模型,使开发此类程序变得非常简单,像之前的MPI编程就相当复杂。

狭隘的来讲,MapReduce是把计算任务给规范化了,它可以等同于小和尚中Worker的业务逻辑部分。 MapReduce把业务逻辑给拆分成2个大部分,Map和Reduce,可以先在Map部分把任务计算一半后,扔给Reduce部分继续后面的计算。 当然在Map部分把计算任务全做完也是可以的。

假如把小明产品经理的需求放到Hadoop来做,其解决流程大致如下:

  1. 把100G数据导入到HDFS
  2. 按照Mapreduce的接口编写解决逻辑,分Map、Reduce两部分。
  3. 把程序包提交到Mapreduce平台上,存储在HDFS里。
  4. 平台中有个叫Jobtracker进程的角色进行分发任务。 这个相似小和尚的Master负载调度管理。
  5. 假如有5台机器进行计算的话,就会提前运行5个叫TaskTracker的slave进程。 这相似小和尚worker的分离版,平台把程序和业务逻辑进行分离了, 简单来说就是在机器上运行个独立进程,它能动态加载、执行jar或者dll的业务逻辑代码。
  6. Jobtracker把任务分发到TaskTracker后,TaskTracker把开始动态加载jar包,创立个独立进程执行Map部分,而后把结果写入到HDFS上。
  7. 假如有Reduce部分,TaskTracker会创立个独立进程把Map输出的HDFS文件,通过RPC方式远程拉取到本地,拉取成功后,Reduce开始计算后续任务。
  8. Reduce再把结果写入到HDFS中
  9. 从HDFS中把结果导出。

这样一看如同是把简单的计算任务给复杂化了,其实假如只有几台计算任务的话,使用Mapreduce的确是杀鸡用牛刀了。 假如有TB、PB级别的数据、跑在成百上千台计算节点上,Mapreduce的优势才会表现出来。 其计算框架图架构如下:

离线计算

通常称Mapreduce及小和尚这种计算为离线计算,由于它对已经持久化的文件数据进行计算,不能实时响应。 还有个起因就是它的解决速度比较慢,它的输入和输出源都是基于HDFS设计,假如数据不是一开始就写入到HDFS上,就会涉及到数据导入导出,这部分相对耗费时间。 而且它的数据流动是基于文件系统的,Map部分输出的数据不是直接传送到Reduce部分,而是先写入HDFS再进行传送。

解决速度慢也是Mapreduce的不足之处,促使了后面实时计算的诞生。
另外个缺点是Mapreduce的计算任务流比较单一,它只有Map、Reduce两部分。 简单的可以只写一部分逻辑来处理,假如想拆分成多个部分,如逻辑A、逻辑B、逻辑C等, 而且一部分计算逻辑依赖上一次计算结果的话,MapReduce解决起来就比较困难了。 像storm框架处理此类问题的方案,也称为流式计算,下一章继续补充。


喜欢这篇文章的朋友可以点个喜欢,也可以关注一下我的个人专题:Java成长之路

针对于上面所涉及到的知识点我总结出了有1到5年开发经验的程序员在面试中涉及到的绝大部分架构面试题及答案做成了文档和架构视频资料免费分享给大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习,也可以关注我一下以后会有更多干货分享。

资料获取方式: QQ群搜索“708-701-457” 就可免费领取



说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 浅谈分布式计算的开发与实现(一)

发表回复