通过


你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

优化转换

使用以下策略优化 Azure 数据工厂和 Azure Synapse Analytics 管道中映射数据流的转换性能。

优化联接、存在和查找

广播

在联接、查找和存在转换中,如果一个或两个数据流都足够小,足以容纳到工作节点内存中,可以通过启用 广播来优化性能。 广播是在将小型数据帧发送到群集中的所有节点时。 这样,Spark 引擎就可以执行联接,而无需在大数据流中重新排序数据。 默认情况下,Spark 引擎会自动决定是否广播联接的一侧。 如果你熟悉传入的数据并且知道一个流小于另一个流,则可以选择固定广播。 固定广播会强制 Spark 广播选定的流。

如果广播数据的大小对于 Spark 节点太大,则可能会出现内存不足错误。 若要避免内存不足错误,请使用 内存优化 群集。 如果在数据流执行期间遇到广播超时,则可以关闭广播优化。 但是,这会导致执行数据流的速度变慢。

使用可能需要较长时间查询的数据源(如大型数据库查询)时,建议在连接操作中关闭广播功能。 当群集尝试广播到计算节点时,具有较长查询时间的源可能会导致 Spark 超时。 关闭广播的另一种不错的选择是:当数据流中有一个流时,该流正在聚合要在以后的查找转换中使用的值。 此模式可能会混淆 Spark 优化器并导致超时。

联接转换优化

交叉联接

如果在联接条件中使用文本值或在联接的两侧有多个匹配项,Spark 将联接作为交叉联接运行。 交叉联接是完全笛卡尔积,可筛选掉联接的值。 这比其他联接类型慢。 确保在联接条件的两侧都具有列引用,以避免影响性能。

联接前排序

与 SSIS 等工具中的合并联接不同,联接转换不是必需的合并联接操作。 联接键不需要在转换之前进行排序。 不建议在映射数据流中使用排序转换。

窗口转换性能

映射数据流中的窗口转换根据你在转换设置的 over() 子句中选择的列值对数据进行分区。 Windows 转换中公开了许多常用的聚合和分析函数。 但如果要为排名 rank() 或行号 rowNumber() 在整个数据集上生成窗口,则建议改用排名转换代理键转换。 这些转换会再次使用这些函数更好地执行完整数据集操作。

重新分区倾斜的数据

某些转换(如联接和聚合)会重新分配数据分区,有时可能会导致数据偏斜。 数据倾斜意味着数据在分区中分布不均。 严重偏斜的数据可能导致下游转化和数据写入速度变慢。 可以通过单击监视显示器中的转换在数据流运行的任何时间点检查数据的倾斜度。

偏斜和库尔特氏症

监视屏幕显示数据如何分布到每个分区,并包括两个指标:偏斜度和峰度。 偏斜 是一个度量值,用于衡量数据的不对称程度,并且可以具有正值、零值、负值或未定义值。 负倾斜意味着左尾比右侧长。 峰度是表示数据是重尾分布还是轻尾分布的度量。 高峰度值表示不理想。 理想的偏斜范围介于 -3 和 3 之间,而库尔特病范围小于 10。 解释这些数字的一种简单方法是查看分区图表,并查看 1 条是否大于其余条形图。

如果在转换后未均匀分区数据,则可以使用 “优化”选项卡 重新分区。 重新调整数据需要一些时间,并且可能无法提高数据流性能。

小窍门

如果对数据进行了重新分区,但下游转换重新组合了数据,请在用作联接键的列上使用哈希分区。

注释

数据流中的转换(接收器转换除外)不会修改静态数据的文件和文件夹分区。 在每次转换中进行分区将在 ADF 为每个数据流执行管理的临时无服务器 Spark 群集的数据帧内重新划分数据。

请参阅与性能相关的其他数据流文章: