【发布时间】:2019-07-13 13:40:57
【问题描述】:
我正在使用 Azure Databricks 来部署一些 R 代码,这些代码通过使用 SparkR 和 gapplyCollect() 的多个 worker 并行化。
项目概述
- 我有 10000 多个类似的数据源每天生成大量需要分析的交易信息;
- 我有一个 R 函数,可以一次分析 1 个数据源的所有信息,为我提供有关该特定数据源的一些有价值的见解;
- 因此,我每天需要执行我的 R 函数 10000 多次来分析我的所有数据。
代码逻辑
- 以
SparkDataframe读取所有数据(来自关系数据库) -
groupBy()SparkDataframe基于我的数据源列(数据按数据源列均匀分布) - 在上一步的
GroupedData结果上使用gapplyCollect(),以便在每个数据分区上应用我的R 函数。- 每次执行的结果是一个带有几行的小 R
DataFrame(dim == (5,5))。 - 所有结果都由
gapplyCollect()执行连接,生成一个小的RDataFrame(,合并所有结果。
- 每次执行的结果是一个带有几行的小 R
- 将结果保存在我的 DBFS 上。
我的问题
在我的开发环境中,我正在对 250 个数据源的分析进行一些实验,并为此使用 4 个小型工作人员(VM 类型:Standard_F4s)。
gapplyCollect() 正在将我的 R 函数发送给工作人员,但是......是否可以自定义每个工作人员要执行的最大活动任务数?默认情况下,我看到 Databricks 允许每个工作人员执行 5 个活动任务。
- 例如:如何允许每个工作人员并行执行 8 个任务?
spark-submit适合这个任务吗?
我从未使用过 spark-submit,也没有找到在 Azure Databricks 上使用它的好文档。
我将使用每日计划的作业将此代码投入生产。在工作中,我可以使用例如
spark-submit功能来更改--executor-cores选项吗?如果是,我如何保证在我的所有工作驱动程序 + 工作人员中安装
forecastCRAN 库,因为 Azure Databricks 不允许我定义库使用spark-submit时在GUI中?
【问题讨论】:
-
每个core一次只能运行1个task,你试过增加每个executor的core个数吗?
-
对于这样的工作负载,您将需要更大的实例并配置动态资源分配databricks.com/session/…
-
@MinhThai 是的,我已经尝试过了,它增加了活动任务的数量,并加快了整个处理时间。但是我现在尝试优化的是任务/核心之间的比率,测试这个比率是向下还是向上,然后我可以进一步提高执行时间。
-
@sramalingam24 据我所知,动态资源分配对于这个用例来说不是一个好的选择,因为我想按需创建一个集群,执行我所有的 10000+ 计算,然后终止簇。该集群将根据计划的管道自动创建和终止。我没有可变负载作业,也不会使用共享集群。
标签: apache-spark databricks sparkr spark-submit azure-databricks