当Dask以单机和集群的形式在短暂的环境中运行时,如何为Dask选择适当数量的线程、工作线程和进程

当Dask以单机和集群的形式在短暂的环境中运行时,如何为Dask选择适当数量的线程、工作线程和进程,dask,dask-distributed,aws-fargate,dask-kubernetes,Dask,Dask Distributed,Aws Fargate,Dask Kubernetes,我们公司目前正在利用数据工作流(ELT、报告生成、ML等)。我们刚刚开始添加执行并行任务的能力,这是由。我们的流是使用临时容器执行的,临时容器将使用Dask LocalCluster,并将一定数量的工作线程和进程传递到LocalCluster对象中 我们在达斯克的旅程将非常像这样: 继续使用单机LocalCluster,直到超出允许的最大cpu/内存 当我们超出单个容器时,在初始容器(la)上生成额外的工作容器,并将它们加入LocalCluster 我们目前从拥有256个cpu(.25个vCPU

我们公司目前正在利用数据工作流(ELT、报告生成、ML等)。我们刚刚开始添加执行并行任务的能力,这是由。我们的流是使用临时容器执行的,临时容器将使用Dask LocalCluster,并将一定数量的工作线程和进程传递到LocalCluster对象中

我们在达斯克的旅程将非常像这样:

  • 继续使用单机LocalCluster,直到超出允许的最大cpu/内存
  • 当我们超出单个容器时,在初始容器(la)上生成额外的工作容器,并将它们加入LocalCluster
  • 我们目前从拥有256个cpu(.25个vCPU)和512个内存的容器开始,并将本地集群固定为1个n_工作线程和每个工作线程3个线程,以获得合理的并行度。然而,这确实是猜测的工作。1 n_工人,因为这是一台少于1个vcpu和3个线程的机器,因为根据我以前在Fargate运行其他基于python的应用程序的经验,这听起来并不疯狂。在一个非常简单的示例中,这似乎可以很好地将函数映射到项目列表

    RENEWAL_TABLES = [
    'Activity',
    'CurrentPolicyTermStaus',
    'PolicyRenewalStatus',
    'PolicyTerm',
    'PolicyTermStatus',
    'EndorsementPolicyTerm',
    'PolicyLifeState'
    ]
    
    RENEWAL_TABLES_PAIRS = [
        (i, 1433 + idx) for idx, i in enumerate(RENEWAL_TABLES)
    ]
    
    
    @task(state_handlers=[HANDLER])
    def dummy_step():
        LOGGER.info('Dummy Step...')
        sleep(15)
    
    
    @task(state_handlers=[HANDLER])
    def test_map(table):
        LOGGER.info('table: {}...'.format(table))
        sleep(15)
    
    
    with Flow(Path(__file__).stem, SCHEDULE, state_handlers=[HANDLER]) as flow:
        first_step = dummy_step()
        test_map.map(RENEWAL_TABLES_PAIRS).set_dependencies(upstream_tasks=[first_step])
    
    我看到一次执行的任务不超过3个

    我真的很想了解如何最好地配置n_worker(单机)、线程和进程,因为我们将单机的大小扩展到添加远程worker。我知道这取决于我的工作负载,但您可以在单个流程中看到一个任务从数据库提取到csv,另一个任务运行一个计算。我在网上看到过这样的情况,它似乎应该是threads=文档中请求的cpu数量,但似乎您仍然可以在Fargate中用不到一个cpu实现并行

    任何反馈都将不胜感激,并有助于其他希望以更短暂的方式利用Dask的人


    考虑到vCPU的Fargate从.25->.50->1->2->4递增,我认为使用1个工人到1个vCPU设置是安全的。然而,考虑到Fargate vcpu分配是如何工作的,了解如何为每个工作线程数选择一个好的上限会很有帮助。

    Hi@braunk!谢谢你的提问。不幸的是,这个问题可能过于宽泛,无法在这里回答。堆栈溢出对于诸如“这个关键字意味着什么?”之类的特定问题非常有用,但对于“这是我的情况,我应该做什么”之类的问题就没那么好了。不幸的是,我不确定今天是否有一个很好的资源给你。我鼓励你尝试将你的情况分解成更小的问题,这些问题也更有可能对其他人有用。基于我提交本文以来对线程与进程的研究,我觉得我们对如何前进有了很好的想法。谢谢你的反馈,我会确保下一个问题更加具体。感谢您和所有Dask贡献者创造了如此伟大的团队合作。继续做伟大的工作。