简单的分布式计算框架

电脑杂谈  发布时间:2020-04-19 16:24:10  来源:网络整理

分布式 计算_云计算与分布式_云计算和分布式

一段时间以前,有一个项目涉及到超过十亿数量级的浮点数计算. 通过的程序是Spark. 经过测试,发现Spark无法满足此要求,因为它需要毫秒级的返回时间,但是服务器资源有限,导致放弃使用Spark进行开发.

以下是我在个人测试中发现不足的问题(由于我仅将Spark Streaming用于Spark,因此我不了解很多方面)

1. 每次提交作业时,都需要读取数据的一侧. 假设读取的数据不在本地,则还必须通过网络IO. 磁盘IO加网络IO是无法忍受的. (后来,另一个小组的同事使用rdd缓存方法基本上不需要再次读取数据,但是新的问题是它无法递增)

云计算与分布式_分布式 计算_云计算和分布式

2. 每次都要在BlockManager中提交作业进行调度,序列化,分发等工作,需要2秒钟以上的时间(也可以对其进行优化,预先创建Executor,并创建SparkContext)

3. CPU使用率无法达到上限

当Spark解决方案不可行时,我尝试使用多节点redis + lua进行计算,发现当redis数据大于一百万时,lua脚本没有响应,因此它也失败了分布式 计算,所以我决定开发一个简单的分布式计算框架.

分布式 计算_云计算和分布式_云计算与分布式

设计思路如下:

1. 以CPU的每个核心为单位划分资源,以便CPU资源得到充分利用

2. 主节点充当控制节点,根据不同服务器的CPU资源读取并分配数据. 监视计算节点的心跳用于确定计算节点是否脱机并监视计算节点的状态.

云计算和分布式_分布式 计算_云计算与分布式

3. 作为从节点,计算节点主动报告心跳,报告当前状态,断开连接并快速重新连接,将接收到的数据缓存在内存中分布式 计算,并将数据异步保存到本地文件中,以便在停机后快速重新启动.

4. 主节点提供了一个RESTFUL界面,供用户发布命令,例如计算,查看节点状态等.

因为使用Java来快速实现演示,所以将Spring boot用作基本框架,并将Netty4用作开发的通信框架. 网络协议是由它自己定义的简单协议,包括头(魔术,版本,类型)和主体.

云计算和分布式_分布式 计算_云计算与分布式

实现也非常简单. Netty是RPC通信的基础. RESTFUL接口使用Spring Boot Web,该Web提供了嵌入式Tomcat.

最终实现后,效果仍然可以接受. 18亿条数据仅需要800到900毫秒.

目前,仅实现简单的基本功能,并且有许多未设计的地方. 例如,当并发数出现时,需要引入任务队列,如何确保主节点的高可用性,如何确保数据分配的均等性以及如何自动进行数据平衡等.

具体代码在: Presageee / DNCF


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-181382-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...