根据 Azure Databricks 改编现有的 Apache Spark 代码
本文概述需要做出哪些更改才能改编现有的 Apache Spark 工作负载,使其能够在 Azure Databricks 上运行。 无论是从本地群集、基于云的自定义基础结构还是其他企业 Apache Spark 产品/服务迁移到 Azure Databricks,大多数工作负载只需进行少量更改即可投入生产。 Azure Databricks 通过引入自定义优化、配置和部署基础结构以及维护 Databricks Runtime 中的依赖项来扩展、简化和改进 Apache Spark 的性能。
重要
升级 Apache Spark 版本时,语法可能会发生中断性变更。 请参阅 Databricks Runtime 发行说明版本和兼容性和 Spark 迁移指南。
将 parquet
更改为 delta
Databricks 建议在写入数据时使用 Delta Lake 而不是 Parquet 或 ORC。 Azure Databricks 优化了许多功能,以便在与 Delta Lake 支持的表交互时提高效率,将 Parquet 中的数据和代码格式升级到 Delta Lake 只需执行少量几个步骤。 请参阅将 Parquet 数据湖迁移到 Delta Lake。
由于 Delta Lake 提供 ACID 事务保证,因此你可以简化工作负载,这样就不需要专门采取解决方法在 Apache Spark 操作中创建伪事务性。 示例包括:
- 构建允许将给定操作中的所有文件作为分区的一部分同时发现的目录结构或分区策略。
- 配置或依赖于元存储以提高新数据发现方式的事务性。
- 使用
MSCK repair
将写入表中的文件注册到元存储。 - 使用
alter table add partition
将分区手动添加到表。
请参阅何时对 Azure Databricks 上的表进行分区。
注意
无需升级使用的数据格式即可运行工作负载,但 Azure Databricks 的最高性能提升在很大程度上与 Delta Lake 直接相关。
使用 Databricks Runtime 兼容的库重新编译 Apache Spark 代码
每个版本的 Databricks Runtime 都预配置了 Apache Spark 应用程序中所需的许多库。 可以根据需要将其他库安装到计算,Databricks 建议尽可能使用 Databricks Runtime 中打包的库版本,因为这些版本已通过兼容性测试。 每个 Databricks Runtime 版本包含所有已安装库的列表。 请参阅 Databricks Runtime 发行说明版本和兼容性。
删除 SparkSession 创建命令
许多旧版 Apache Spark 工作负载为每个作业显式声明一个新的 SparkSession。 Azure Databricks 自动为每个计算群集创建一个 SparkContext,并为针对群集执行的每个笔记本或作业创建一个独立的 SparkSession。 可以通过升级这些命令以使用 SparkSession.builder().getOrCreate()
来保留在本地编译和测试代码,然后部署到 Azure Databricks 的能力。
删除终端脚本命令
Apache Spark 要求程序使用 sys.exit()
或 sc.stop()
等命令显式声明其完整性。 在作业完成时,Azure Databricks 会自动终止并清理这些作业,因此这些命令是不需要的,应予以删除。
Azure Databricks 还会在运行终止时自动终止并清理结构化流式处理工作负载,以便你可以从结构化流式处理应用程序中删除 awaitTermination()
和类似的命令。
信任 Azure Databricks 配置群集
Azure Databricks 自动为计算群集中的驱动程序和执行程序配置所有设置,以最大程度地提高复原能力和资源利用率。 为执行程序或 JVM 提供自定义配置可能导致性能降低。 Databricks 建议仅设置控制类型处理或函数所需的 Spark 配置,使逻辑保持一致。
运行工作负载
删除了可能干扰 Azure Databricks 执行的模式、命令和设置后,可以在测试环境中运行工作负载,并将性能和结果与旧版基础结构进行比较。 虽然团队掌握的故障排除和提高 Apache Spark 工作负载性能的许多技能仍可在 Azure Databricks 上得到利用,但升级步骤以使用 Apache Spark、Delta Lake 或自定义 Azure Databricks 产品中的新功能更容易获得更大的收益。