有关DolphinDB计算资源分配的问题
DolphinDB database的文档中提到支持分布式计算。假如同时提交4个计算任务,内部是以什么样的机制来分配的计算资源?是否会因为资源分配不均导致计算时间瓶颈卡在性能最差的节点上?如果出现了计算资源分配不均的问题,一般怎么排查和解决?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
DolphinDB首先是一个数据库,内置的计算引擎主要解决高并发、交互式的计算任务,一般的计算任务都在亚秒级或秒级完成,最长不超过几分钟。因此DolphinDB的资源配置方式与Apache Spark等低并发、批处理的计算引擎有所不同。Apache Spark以独占方式按应用事先分配计算资源包括CPU核,内存等。DolphinDB则将计算作业分解成子任务,以子任务为单位进行调度。每一个子任务并不独占CPU核和内存。而是将计算资源放入一个共享的资源池,根据每个计算任务的优先级和并行度来调度子任务。
当有多个作业时,系统按照作业的优先级来调度子任务,优先级高的子任务先被执行。并行度表示在一个数据节点上,最多同时可以用多少个线程来执行该作业产生的子任务。简言之,优先级高并行度高的作业会分到更多的计算资源。但是DolphinDB计算引擎的总体目标是希望每个任务尽快得到相应,这个优先级的是动态的,每被调用一轮,优先级降一,当触及0后,又回到原先的优先级。下面我们以A,B两个作业举例说明。A作业优先级6,并行度4,子任务个数16。B作业优先级4,并行度2,子任务个数2个。资源池中的线程个数为4个。第一轮调度,优先级最高的是6,计算资源全部分给A。执行完毕后,A的优先级降到5,A的子任务还剩12个。第二轮调度,优先级最高是5,计算资源全部分给A。执行完毕后,A的优先级降到4,A的子任务还剩8个。第三轮调度,优先级最高是4,A和B各有2个子任务被执行。执行完毕后,B已经完成,A优先级仍然为4,A的子任务还剩6个。虽然A的优先级和并行度更高,但是因为子任务太多,最终B先完成任务。
下面再具体说明一下DolphinDB如何分解一个作业的任务。大部分的计算任务如SQL查询,以数据库分区为单位,每一个分区就是一个子任务,计算下推到存储引擎执行,也就是说计算和存储耦合。这种计算任务的分解完全是由数据库的分区模式决定的,因此创建数据库时如何合理的分区非常的重要。另一种计算任务涉及到数据的reshuffle,譬如用repartitionDS来产生数据源,然后套用mr(map reduce)或imr(iterative map reduce,通常用于机器学习)函数来计算。这类任务计算和数据分离,repartitionDS产生的每一个数据源就是一个子任务。
要提高计算效率,最关键的是数据和计算资源的均衡。具体包括:
当计算引擎出现性能问题,或者某些作业耗时太久,可以从下面这些途径排查问题:
getAllChunks
,getClusterChunksStatus
可以获取分区的分布信息。关于作业的种类,作业的执行过程,以及相关的配置,请参考DolphinDB作业管理教程