【问题标题】:Optimizing the number of tasks per core in Azure Databricks优化 Azure Databricks 中每个核心的任务数
【发布时间】:2019-07-13 13:40:57
【问题描述】:

我正在使用 Azure Databricks 来部署一些 R 代码,这些代码通过使用 SparkRgapplyCollect() 的多个 worker 并行化。


项目概述

  • 我有 10000 多个类似的数据源每天生成大量需要分析的交易信息;
  • 我有一个 R 函数,可以一次分析 1 个数据源的所有信息,为我提供有关该特定数据源的一些有价值的见解;
  • 因此,我每天需要执行我的 R 函数 10000 多次来分析我的所有数据。

代码逻辑

  1. SparkDataframe 读取所有数据(来自关系数据库)
  2. groupBy() SparkDataframe 基于我的数据源列(数据按数据源列均匀分布)
  3. 在上一步的GroupedData 结果上使用gapplyCollect(),以便在每个数据分区上应用我的R 函数。
    • 每次执行的结果是一个带有几行的小 R DataFrame (dim == (5,5))。
    • 所有结果都由gapplyCollect() 执行连接,生成一个小的R DataFrame (,合并所有结果。
  4. 将结果保存在我的 DBFS 上。

我的问题

在我的开发环境中,我正在对 250 个数据源的分析进行一些实验,并为此使用 4 个小型工作人员(VM 类型:Standard_F4s)

gapplyCollect() 正在将我的 R 函数发送给工作人员,但是......是否可以自定义每个工作人员要执行的最大活动任务数?默认情况下,我看到 Databricks 允许每个工作人员执行 5 个活动任务。

  • 例如:如何允许每个工作人员并行执行 8 个任务? spark-submit 适合这个任务吗?

我从未使用过 spark-submit,也没有找到在 Azure Databricks 上使用它的好文档。

  • 我将使用每日计划的作业将此代码投入生产。在工作中,我可以使用例如spark-submit 功能来更改--executor-cores 选项吗?

  • 如果是,我如何保证在我的所有工作驱动程序 + 工作人员中安装 forecast CRAN 库,因为 Azure Databricks 不允许我定义库使用spark-submit时在GUI中?

【问题讨论】:

  • 每个core一次只能运行1个task,你试过增加每个executor的core个数吗?
  • 对于这样的工作负载,您将需要更大的实例并配置动态资源分配databricks.com/session/…
  • @MinhThai 是的,我已经尝试过了,它增加了活动任务的数量,并加快了整个处理时间。但是我现在尝试优化的是任务/核心之间的比率,测试这个比率是向下还是向上,然后我可以进一步提高执行时间。
  • @sramalingam24 据我所知,动态资源分配对于这个用例来说不是一个好的选择,因为我想按需创建一个集群,执行我所有的 10000+ 计算,然后终止簇。该集群将根据计划的管道自动创建和终止。我没有可变负载作业,也不会使用共享集群。

标签: apache-spark databricks sparkr spark-submit azure-databricks


【解决方案1】:

我已经访问了 Databricks 的托管资源组,其中包含所有内部创建的资源(例如 VM、磁盘和网络接口)

在那里,我检查了每个工人的 CPU 消耗指标。这是 2x Worker 集群的结果:

这是捕捉任务最终结束时刻的同一张图表:

根据这些指标,我们可以看到:

  • 平均 CPU 使用率为 85~87%
  • 最大 CPU 使用率为 92~96%
  • 最低 CPU 使用率为 70~80%

这些指标适用于我的用例... 但如果有人对如何将 spark-submit 与 Databricks 一起使用有任何线索,请随时在此处分享新答案。

【讨论】:

    猜你喜欢
    • 2022-11-09
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2011-10-05
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多