【问题标题】:Running the same Databricks Python Notebook concurrently同时运行相同的 Databricks Python Notebook
【发布时间】:2021-01-14 22:25:15
【问题描述】:

我使用下面的代码并行运行同一个笔记本三次:

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor

def notebook1_function(country, days):   
         dbutils.notebook.run(path = "/pathtonotebook1/notebook1", \
                              timeout_seconds = 300, \
                              arguments = {"Country":country, "Days":days})

countries = ['US','Canada','UK'] 
days = [2] * len(countries) 
with ThreadPoolExecutor() as executor:   
         results = executor.map(notebook1_function, countries, days)

每次,我为“国家”传递不同的值,为“天”传递 2。在 notebook1 里面我有 df1。 我想知道以下内容:

  1. 如何将三个并发运行中的所有 df1 附加到单个数据帧中。
  2. 完成后如何获取每次运行的状态[Success/Failure]。

提前谢谢你。

【问题讨论】:

    标签: python concurrency parallel-processing databricks


    【解决方案1】:

    当您使用dbutils.notebook.run(所谓的Notebook workflows)时,笔记本作为单独的作业执行,并且笔记本的调用者不与它共享任何内容 - 所有通信都通过您指定的参数进行' 传递给笔记本,笔记本可能只返回通过调用dbutils.notebook.exit 指定的字符串值。因此,您的代码无法访问您正在调用的笔记本中的 df1

    通常,如果您使用这样的笔记本工作流程,那么您需要以某种方式将被调用笔记本中 df1 的内容保存到某个表中,然后从调用者笔记本中读取该内容。

    另一种可能性,是将被调用笔记本中的代码提取到将接收参数并返回数据帧的函数中,通过%run 包含该笔记本,使用不同参数调用函数,并使用 @ 组合结果987654327@。像这样的:

    笔记本 1(调用):

    def my_function(country, days):
      # do something
      return dataframe
    

    来电笔记本:

    %run "./Notebook 1"
    
    df_us = my_function('US', 10)
    df_canada = my_function('Canada', 10)
    df_uk = my_function('UK', 10)
    
    df_all = df_us.union(df_canada).union(df_uk)
    

    【讨论】:

    • 感谢@Alex 提供的信息。不幸的是,'%run' 会以串行方式运行,因此速度会大大降低。我的最后一个问题是在上面的代码中,该信息存储在“结果”中,我如何访问它?
    • %run 只是执行笔记本——如果笔记本只包含函数定义,它们将被简单地注入到当前的 Python 环境中。当您拨打电话时,然后union,Spark 将尝试优化执行(如果您的函数没有自己执行任何操作)。如果您想使用dbutils.notebook.run 实现某些目标,则只需强制笔记本写入单独的表,例如:`spark.sql("create table bla-bla-temp");调用笔记本将该名称作为参数传递给写入,并在执行后从该临时表中读取数据
    • 嗨,亚历克斯!在这里要清楚一点,当我强制笔记本写入单独的表时,如果我运行 30 个笔记本,我将需要 30 个不同的表。那是对的吗?如果所有笔记本都写入同一张表,我应该期待什么问题?
    • 这取决于表格格式和写入模式...我个人会使用 %run 和 union...因为如果您独立运行 notebooks,Spark 可以比单独的作业优化得更好
    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多