Azure Databricks 上的最大消息大小

Posted

技术标签:

【中文标题】Azure Databricks 上的最大消息大小【英文标题】:Maximum message size on Azure Databricks 【发布时间】:2020-02-06 01:45:12 【问题描述】:

我在 Azure 上使用带有 python 的 databricks 来处理我的数据。此过程的结果将保存为 azure blob 存储上的 csv 文件。

但这就是问题所在。当结果文件超过 750 Mb 时发生错误。

在对 google 进行了一些研究之后,我知道我必须增加我的 Scala.rc.message.maxSize,我就这样做了。问题是我可以设置的最大大小只有 2Gb,而且当我使用 databricks 分析大数据时,我确实希望文件远大于 2Gb。

问题是:

    2 Gb 真的是 Azure Databricks 支持的最大消息大小吗?我试图搜索并浏览微软的官方文档,但找不到任何相关信息。

    有什么方法可以增加价值吗?甚至将其设置为可扩展取决于我的数据。

这是我用于这些过程的 python 代码。

#mount azure storage to my databricks
dbutils.fs.mount(
  source = "wasbs://mystoragecontainer.blob.core.windows.net",
  mount_point = "/mnt/test3",
  extra_configs = "fs.azure.account.key.mystoragecontainer.blob.core.windows.net":dbutils.secrets.get(scope = "myapps", key = "myappskey"))


#define saving process in a function
def save_data(df, savefile):
  df.coalesce(1).write.mode("overwrite").options(header="true").format("com.databricks.spark.csv").save(savefile)
  res = savefile.split('/')
  ls_target = savefile.rstrip(res[-1])
  dbutils.fs.ls(savefile+"/")
  fileList = dbutils.fs.ls(savefile+"/")
  target_name = ""
  for item in fileList:
    if item.name.endswith("csv"):
      filename= item.path
      target_parts = filename.split('/')
      target_name = filename.replace('/'+target_parts[-2]+'/', '/')
      print(target_name)
      dbutils.fs.mv(filename, ls_target)
    else:
      filename= item.path
      dbutils.fs.rm(filename, True)
  dbutils.fs.rm(savefile, True)
  dbutils.fs.mv(target_name, savefile)

# call my save function
save_data(df,"dbfs:/mnt/test3/myfolderpath/japanese2.csv")

任何信息将不胜感激。

最好的,

【问题讨论】:

到目前为止你有什么尝试? Databricks Runtime 5.5 及以下版本的 dbfs 存在限制,仅支持小于 2GB 的文件。如果您使用本地文件 I/O API 读取或写入大于 2GB 的文件,您可能会看到损坏的文件。话虽如此,您应该能够在 Python 中将更大的文件写入已挂载的存储。你能分享一些你试过的代码吗? 嗨@AxelR。谢谢您的答复。我已经安装了我的天蓝色存储,但同样的问题仍然存在。将我的代码添加到我的第一篇文章中,请查看以供参考。 【参考方案1】:

如果我理解正确,您想合并由 :

生成的分布式 csv
df.coalesce(1).write.mode("overwrite").options(header="true").format("com.databricks.spark.csv").save(savefile) 

我建议您尝试将其转换为 pandas 数据帧并写入单个 csv,如下所示:

# call my save function
df.toPandas().to_csv("/dbfs/mnt/test3/myfolderpath/japanese2.csv")

这应该编写一个包含数据框中所有数据的 csv。 在使用 Pandas 时要小心使用/dbfs/,因为它使用文件 API 而不是 DBFS API。

另外,这是 pySpark,不是真正的 scala。

【讨论】:

以上是关于Azure Databricks 上的最大消息大小的主要内容,如果未能解决你的问题,请参考以下文章

Databricks - 写入 Azure Synapse 时出错

Azure Databricks:此群集的运行时版本不支持

在 Azure Key Vault 支持的 Databricks 中创建秘密范围失败

火花作业中的 Azure databricks 群集错误:ExecutorLostFailure

Azure Databricks:访问防火墙后面的 Blob 存储

减少由于 Azure Databricks 中 GC 分配失败而导致的时间延迟的步骤