Google Cloud 架构框架中的这一文档提供了一些建议,可帮助您优化 Google Cloud 中分析工作负载的性能。
BigQuery
本部分提供了一些建议来帮助您优化 BigQuery 中查询的性能。
优化查询设计
查询性能取决于查询读写的字节数以及槽之间传递的数据量等因素。为了优化 BigQuery 中查询的性能,请应用以下文档中介绍的最佳实践:
高效地定义和使用具体化视图
为了提升使用常见和重复查询的工作负载的性能,您可以使用具体化视图。您可以创建的具体化视图的数量存在限制。请不要为查询的每个排列都创建一个单独的具体化视图。而是定义可用于多种查询模式的具体化视图。
提升 JOIN
性能
您可以使用具体化视图来降低基于 JOIN
执行聚合的查询的费用并缩短延迟时间。设想一种场景,您要联接一个包含几个较小维度表的大型事实表,然后基于联接执行聚合。切实可行的做法是重写查询,首先基于事实表执行聚合(将外键用作分组键)。然后,将结果与维度表相联接。最后,执行聚合后操作。
Dataflow
本部分提供了一些建议来帮助您优化 Dataflow 流水线的查询性能。
创建和部署流水线时,您可以配置执行参数,例如应该用于 Dataflow 工作器虚拟机的 Compute Engine 机器类型。如需了解详情,请参阅流水线选项。
您部署流水线后,Dataflow 会管理运行作业所需的 Compute Engine 和 Cloud Storage 资源。此外,Dataflow 的以下功能有助于优化流水线的性能:
- 并行处理:Dataflow 会自动对数据进行分区,并将工作器代码分布到 Compute Engine 实例以进行并行处理。如需了解详情,请参阅并行处理和分布。
- 优化:Dataflow 会使用流水线代码创建一个执行图来表示流水线中的 PCollection 对象和转换。然后优化此执行图以实现最高效的性能和资源使用率。Dataflow 还会自动优化可能产生高额费用的操作,例如数据聚合。如需了解详情,请参阅融合优化和组合优化。
- 自动调整:Dataflow 会在作业运行时使用横向自动扩缩、纵向自动扩缩和动态工作负载再平衡来动态优化作业。
您可以使用基于 Web 的监控界面或 Dataflow gcloud CLI 监控 Dataflow 流水线的性能。
Dataproc
本部分介绍了优化 Dataproc 集群性能的最佳实践。
自动扩缩集群
为确保 Dataproc 集群提供可预测的性能,您可以启用自动扩缩功能。Dataproc 使用 Hadoop YARN 内存指标和您定义的自动扩缩政策来自动调整集群中工作器虚拟机的数量。如需详细了解如何使用和配置自动扩缩,请参阅自动扩缩集群。
预配合适的存储空间
根据您的性能和费用要求,为 Dataproc 集群选择合适的存储选项:
- 如果您需要进行少量更改 Hadoop 和 Spark 作业即可在其中读取和写入数据的低费用的 Hadoop 兼容文件系统 (HCFS),请使用 Cloud Storage。存储在 Cloud Storage 中的数据是永久性的,可供其他 Dataproc 集群和其他产品(如 BigQuery)访问。
- 如果您需要适用于 Dataproc 集群的低延迟的 Hadoop 分布式文件系统 (HDFS),请使用挂接到工作器节点的 Compute Engine 永久性磁盘。存储在 HDFS 存储空间中的数据是瞬时性的,存储费用高于 Cloud Storage 选项。
- 如需获得 Compute Engine 永久性磁盘的性能优势和 Cloud Storage 的费用和耐用性优势,您可以结合使用这两种存储选项。例如,您可以将源数据集和最终数据集存储在 Cloud Storage 中,并为中间数据集预配有限的 HDFS 容量。在确定 HDFS 存储空间的磁盘大小和类型时,请考虑永久性磁盘和本地 SSD 部分中的建议。
缩短使用 Cloud Storage 时的延迟时间
为了缩短访问 Cloud Storage 中存储的数据时的延迟时间,我们建议您执行以下操作:
- 在 Dataproc 集群所在的区域中创建 Cloud Storage 存储桶。
- 为存储在 Cloud Storage 中的 Apache Hive 管理的表停用
auto.purge
。 - 使用 Spark SQL 时,请考虑使用最新版本的可用映像创建 Dataproc 集群。通过使用最新版本,您可以避免可能保留在旧版本中的性能问题,例如 Spark 2.x 中
INSERT OVERWRITE
性能缓慢。 - 为了最大限度地降低将多个大小不同或较小的文件写入 Cloud Storage 的可能性,您可以配置 Spark SQL 参数
spark.sql.shuffle.partitions
和spark.default.parallelism
或 Hadoop 参数mapreduce.job.reduces
。
监控并调整存储负载和容量
挂接到 Dataproc 集群中的工作器节点的永久性磁盘用于保存shuffle 数据。为了实现最佳性能,工作器节点需要足够的磁盘空间。如果这些节点没有足够的磁盘空间,则会在 YARN NodeManager 日志中被标记为 UNHEALTHY
。如果发生此问题,请增加受影响节点的磁盘大小,或同时运行较少的作业。
启用 EFM
工作器节点从正在运行的 Dataproc 集群中移除后(例如由于缩减或抢占),shuffle 数据可能会丢失。为了在此类情况下最大限度地缩短作业延迟时间,我们建议您为使用抢占式虚拟机的集群启用增强的灵活性模式 (EFM),或者仅自动扩缩辅助工作器组。
后续步骤
查看优化计算、存储、网络和数据库资源的性能的最佳实践: