azure - 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 集群上)位于不同的数据中心,它是如何处理的?
解决方案
当对数据帧应用 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。
推荐阅读
- java - 使用可重入锁 Java 中断所有等待线程
- java - CAS:JBoss 中 cas-server-support-json-service-registry 出现 6.2.0-snapshot 错误
- javascript - 如何在具有唯一 ID 的不同位置使用类组件?
- android - 按钮更改颜色
- python - 尽管文档说没有配额,但 Google CSE 站点受限 API 仍返回请求限制配额
- python - 从列表中附加正确的值
- python-3.x - 如何在 python 中安装 software-properties-gtk 包?在 ubuntu 上
- requestidlecallback - requestIdleCallback 是否保证执行,是否保留执行顺序?
- semantic-versioning - Semver:“latest pre-release”包比“latest stable”更旧是否可以接受?
- python - 为什么我在运行此循环以打印出键值对时出现类型错误?每个项目 k 和 v 已经是 str