有关DolphinDB计算资源分配的问题

DolphinDB database的文档中提到支持分布式计算。假如同时提交4个计算任务,内部是以什么样的机制来分配的计算资源?是否会因为资源分配不均导致计算时间瓶颈卡在性能最差的节点上?如果出现了计算资源分配不均的问题,一般怎么排查和解决?

请先 登录 后评论

1 个回答

logger

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产生的每一个数据源就是一个子任务。

要提高计算效率,最关键的是数据和计算资源的均衡。具体包括:

  • 如果包含多个节点,每个节点的计算资源尽量均衡;
  • 数据库表的各个分区大小保持均衡;
  • 如果是多节点,每个节点上的分区数量尽量保持均衡。这一点通常是人工干预,比如在节点之间移动副本拷贝副本、或者删除节点上一个或多个副本数据,而导致了分区数量的不均衡。

当计算引擎出现性能问题,或者某些作业耗时太久,可以从下面这些途径排查问题:

  • 首先,查看所有节点的资源使用情况,譬如每个节点平均负载,CPU使用率,网络读写性能,磁盘读写性能,内存使用情况,作业和子任务队列深度等等。这些指标可以从Web界面读取。如果跟Prometheus集成了,也可以从Prometheus观察。或者通过内置函数getPerfgetClusterPerfgetJobStatgetDiskIOStat等来观察这些指标。高阶函数pnodeRun可以帮助在所有数据节点上运行这些函数。
  • 其次,可以分析作业涉及的数据的分布,包括分区的数量,分区在各个节点上的分布。函数getAllChunks,getClusterChunksStatus可以获取分区的分布信息。

关于作业的种类,作业的执行过程,以及相关的配置,请参考DolphinDB作业管理教程





请先 登录 后评论
  • 1 关注
  • 0 收藏,909 浏览
  • jinzhi 提出于 2021-06-15 14:01

相似问题