首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Delta Lake中优化合并(Databricks开源)

在Delta Lake中优化合并(Databricks开源)
EN

Stack Overflow用户
提问于 2020-07-28 11:08:11
回答 4查看 749关注 0票数 1

我正在尝试使用delta lake oss实现合并,我的历史数据大约是70亿条记录,delta大约是500万条记录。

合并基于组合键(5列)。

我正在启动一个10节点集群r5d.12xlarge(~3TB内存/ ~480个内核)。

该作业第一次花费了35分钟,后续运行将花费更多时间。

我尝试过使用优化技术,但都不起作用,并且我在运行3次后开始得到堆内存问题,我看到数据洗牌时磁盘上的大量溢出,尝试使用合并键上的order by重写历史,在20分钟内完成了性能改进和合并,溢出大约为2TB,但是问题是作为合并过程的一部分写入的数据的顺序不同,因为我无法控制写入数据的顺序,因此后续运行花费的时间更长。

我无法在德尔塔湖操作系统中使用Zorder,因为它只提供订阅.I尝试压缩,但这也没有帮助。如果有更好的方法来优化合并过程,请告诉我。

EN

回答 4

Stack Overflow用户

发布于 2020-07-28 13:47:47

这里有一个建议,看起来你正在AWS上运行你的databricks笔记本。

优化它的方法是同时使用Hive metastore或任何目录服务。现在这会有什么帮助呢?

在保存数据时,您可以使用bucketing根据合并关键字对数据进行排序,这些元数据信息需要存储在需要配置单元的元存储中。

如果你使用bucketing,数据将是有序的,并且不会导致数据的过度混洗,这将不可避免地提高你的工作性能。

我对databricks不是很确定,但是如果你使用EMR,你可以选择使用glue catalog作为元存储,或者你也可以在EMR中有自己的元存储。

票数 0
EN

Stack Overflow用户

发布于 2021-09-28 19:00:01

根据我的经验,20分钟听起来很不错;)你的分区方案是什么?合并的速度和SELECTS的速度一样慢,所以如果你可以通过分区过滤器来消除lake扫描,那应该会有很大的帮助。

还要看看spark中的随机分区设置,因为我发现这些设置对性能有很大的影响。

最后,压缩数据将对合并性能产生巨大影响。

票数 0
EN

Stack Overflow用户

发布于 2021-09-28 19:59:40

如果你真的想通过代码来优化它,你可以启动并行任务。这是我们用来并行化S3编写的示例代码。您也可以对adls位置使用相同的逻辑。

代码语言:javascript
运行
复制
with futures.ThreadPoolExecutor(max_workers=total_days+1) as e:
  print(f"{raw_bucket}/{db}/{table}/")
  for single_date in daterange(start_date, end_date):
    curr_date = single_date.strftime("%Y-%m-%d")
    jobs.append(e.submit(writeS3, curr_date))

  for job in futures.as_completed(jobs):
    result_done = job.result()
    print(f"Job Completed - {result_done}")

print("Task complete")

参考:https://docs.python.org/3/library/concurrent.futures.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63126467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档