首页 > 解决方案 > Spark 处理如何处理来自集群外部的数据(如 azure blob 存储)?

问题描述

我的问题类似于:

Mesos 上的独立 Spark 集群访问不同 Hadoop 集群中的 HDFS 数据

虽然上面的问题是关于使用 spark 处理来自不同 hadoop 集群的数据,但我也想知道 spark 如何处理来自 azure blob 存储容器的数据。

在 azure 文档 ( https://docs.microsoft.com/en-us/azure/databricks/data/data-sources/azure/azure-storage ) 中,以下代码用于将数据直接加载到数据帧中:

val df = spark.read.parquet("wasbs://<container-name>@<storage-account-name>.blob.core.windows.net/<directory-name>")

当对数据帧应用 udf 等操作时,是否将完整的数据传输到驱动程序内存,然后在执行程序之间拆分?

位置是否在处理过程中发挥作用?例如,如果 spark 集群和数据(在 azure blob 存储容器或不同的 hadoop 集群上)位于不同的数据中心,它是如何处理的?

标签: azureapache-sparkapache-spark-sqlazure-databricks

解决方案


当对数据帧应用 udf 等操作时,是否将完整的数据传输到驱动程序内存,然后在执行程序之间拆分?

是的,完整的数据被传输,但不传输给驱动程序。执行器并行读取数据。如果文件很多,则在 executor 之间进行分割,大文件由多个 executor 并行读取(如果文件格式是可拆分的)。

val df = spark.read.parquet("wasbs://@.blob.core.windows.net/")

了解该行代码不加载任何内容至关重要。稍后当您调用df.write或评估 Spark SQL 查询时,将读取数据。如果数据是分区的,查询可能能够消除查询不需要的整个分区。

位置是否在处理过程中发挥作用?

在 Azure 中,真正快速的网络弥补了数据和计算分离的问题。

当然,您通常希望 Blob/Data Lake 与 Spark 集群位于同一 Azure 区域。跨区域的数据移动速度较慢,并且按数据出口收费,略低于 0.01 美元/GB。


推荐阅读