数据工程工作负荷的工作区出站访问保护

通过工作区出站访问保护,可以精确控制来自 Microsoft Fabric 工作区的外部通信。 启用此功能后,数据工程工作区项(如笔记本、Spark 作业定义和 lakehouses)受到限制,除非通过批准的托管专用终结点显式授予访问权限,否则无法与公共终结点建立出站连接。 此功能对于安全或受监管环境中的组织至关重要,因为它有助于防止数据外泄并强制实施组织网络边界。

通过数据工程来理解出站访问保护

启用出站访问保护后,默认情况下会阻止来自工作区的所有出站连接。 然后,工作区管理员可以通过配置托管专用终结点来创建例外,以仅授予对已批准的目标的访问权限:

工作区出站访问保护在数据工程方案中的图解。

为数据工程配置出站访问保护

若要为数据工程配置出站访问保护,请执行以下操作:

  1. 按照以下步骤来启用出站访问保护

  2. 启用出站访问保护后,可以设置 托管专用终结点 ,以根据需要允许出站访问其他工作区或外部资源。

配置后,数据工程项只能连接到已批准的托管专用终结点,而所有其他出站连接仍被阻止。

支持的数据工程项类型

出站访问保护支持以下数据工程项目类型:

  • 湖边房屋
  • Notebooks
  • Spark 作业定义
  • Environments

以下部分介绍了出站访问保护如何影响工作区中的特定数据工程项类型。

Notebooks

在工作区上启用出站访问保护时,仅当将托管专用终结点从工作区设置为目标时,笔记本才能引用目标。

来源 目的地 是否设置了托管专用终结点? 笔记本或 Spark 作业是否可以连接到目标?
笔记本(工作区 A) Lakehouse (工作区 B) 是的,在 A 中设置了从 A 到 B 的跨工作区托管专用终结点 是的
笔记本(工作区 A) Lakehouse (工作区 B)
笔记本(工作区 A) 外部 Azure Data Lake Storage (ADLS) G2/其他数据源 是的,托管专用终结点是从 A 设置到外部数据源的 是的
笔记本(工作区 A) 外部 ADLS G2/其他数据源

了解 Fabric 笔记本中的文件路径行为

从 Fabric 笔记本访问 Lakehouse 中的数据时,可以使用相对路径或完全限定路径引用文件。 了解差异对于成功访问数据非常重要,尤其是在跨工作区工作时。

相对路径

相对路径是引用当前 Lakehouse 中文件的最简单和最常见的方法。 当您将 Lakehouse 资源管理器中的文件拖到笔记本单元格中时,会自动使用相对路径。

Example:
Files/people.csv

Spark 代码:

df = spark.read.format("csv").option("header", "true").load("Files/people.csv")

相对路径开箱即用,无需进一步配置。

完全限定(绝对)路径

完全限定的路径指定文件的完整位置,包括工作区和 Lakehouse 信息。 但是,在这些路径中使用显示名称可能会导致错误,例如套接字超时,因为默认情况下 Spark 会话无法解析它们。

错误的示例(将失败):
abfss://your_workspace@onelake.dfs.fabric.microsoft.com/your_lakehouse.Lakehouse/Files/people.csv

跨工作区访问数据

若要访问位于不同工作区中的 Lakehouse 中的文件,请使用包含工作区 ID 和 Lakehouse ID(而不是其显示名称)的完全限定路径。 这可确保 Spark 能够解析路径并访问数据。

正确的 URI 格式:
abfss://<workspace_id>@onelake.dfs.fabric.microsoft.com/<lakehouse_id>/Files/people.csv

Spark 代码示例:

df = spark.read.format("csv").option("header", "true").load("abfss://4c8efb42-7d2a-4a87-b1b1-e7e98bea053d@onelake.dfs.fabric.microsoft.com/5a0ffa3d-80b9-49ce-acd2-2c9302cce6b8/Files/people.csv")

如何查找工作区和 Lakehouse 标识符

  • 工作区 ID: Fabric 工作区 URL 中 /groups/ 后的 GUID。
  • Lakehouse ID: URL 中 /lakehouses/ 之后的 GUID。

示例 URL:
https://app.fabric.microsoft.com/groups/4c8efb42-7d2a-4a87-b1b1-e7e98bea053d/lakehouses/5a0ffa3d-80b9-49ce-acd2-2c9302cce6b8/...

注释

在跨工作区访问数据时,始终在 URI 中使用工作区 ID 和 Lakehouse ID。

Spark 任务

启用工作区出站访问保护后,将阻止 Spark 群集与公共 Internet 建立出站连接。 这包括:

  • 使用 pip install 直接从 PyPI 安装 Python 包
  • 访问公共域,例如 https://login.microsoftonline.com
  • 连接到任何外部 API 或网站

Microsoft Fabric 通过托管虚拟网络(托管 VNET)强制实施此限制,除非授予显式访问权限,否则将 Spark 群集与外部网络隔离开来。

使用托管专用终结点保护连接

若要使 Spark 群集能够在保持安全性的同时连接到外部资源,必须使用托管专用终结点。 这些终结点允许建立安全批准的连接:

  • 外部服务(例如 Azure SQL 数据库、Azure Blob 存储)
  • 同一租户中的其他 Fabric 工作区

仅允许通过批准的托管专用终结点建立的连接。 默认情况下会阻止所有其他出站访问尝试。

在出站访问受保护的工作区中安全地安装库

由于 Fabric 阻止公共 Internet 流量,因此 Spark 群集无法使用 PyPI pip install直接安装包。

在启用了出站访问保护的工作区中安装库有两个安全选项:

  1. 上传和使用 wheel 文件: 在受信任的计算资源上手动准备所需的 Python 包滚轮文件,然后将其上传到 Fabric 环境。 此方法可确保仅安装已批准的包,并避免公共 Internet 访问。

  2. 托管专用 PyPI 镜像: 在 Azure 存储上设置专用 PyPI 存储库,并将其与公共 PyPI 索引中的所选包同步。 将 Fabric 环境配置为使用托管专用终结点从此专用镜像安装包,从而保持与网络安全策略的符合性。

选择最适合组织包管理和安全性要求的方法。

选项 1:上传和使用 wheel 文件

  1. 标识 Fabric Spark 运行时中未包含的缺失包。

  2. 在计算资源上运行以下脚本,以设置与 Microsoft Fabric Spark 运行时 1.3 相同的本地 python 环境。 此脚本需要一个 YAML 文件,其中包含预装环境中包含的所有库的列表。

  3. 确保从此 YAML 中删除Microsoft托管的专用库。

    wget https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-Linux-x86_64.sh 
    bash Miniconda3-py310_24.1.2-0-Linux-x86_64.sh 
    chmod 755 -R /usr/lib/miniforge3/ 
    export PATH="/usr/lib/miniforge3/bin:$PATH" 
    sudo apt-get update 
    sudo apt-get -yq install gcc g++ 
    conda env create -n <custom-env-name> -f Python<version>-CPU.yml 
    source activate <custom-env-name> 
    
  4. 该脚本可用于传递 requirements.txt 文件,该文件包含要安装在 spark 运行时中的所有包和版本。 它打印输入库要求的新 wheel 文件/依赖项的名称。

    pip install -r <input-user-req.txt> > pip_output.txt 
    cat pip_output.txt | grep "Using cached *" 
    
  5. 手动下载 .whl 文件。

  6. 使用环境项目上传所有必需的轮子。

  7. 将环境附加到笔记本或作业。

选项 2:在 Azure 存储上托管专用 PyPI 镜像

先决条件
PyPI 存储库的初始同步

作为初始步骤,需要执行 PyPI 存储库的同步。 完整的 PyPI 存储库包含大量包,并且持续扩展,因此初始下载可能需要 8 到 48 小时,具体取决于硬件和网络。 有关当前存储库大小和包计数,请参阅 统计信息 ·PyPI

Maintenance

需要定期监视和更新才能使镜像保持同步。以下因素会影响同步速度:

  • 网络速度。
  • 运行 Bandersnatch 的计算资源上的服务器资源,例如 CPU、内存和磁盘 I/O。
  • 磁盘速度(SSD 与 HDD)会影响 Bandersnatch 写入数据的速度。
  • 初始设置与维护同步:初始同步下载整个存储库,可能需要 8 到 48 小时,但后续同步速度更快,因为它们仅更新新的或已更改的包。
设置步骤
  1. 设置适用于 Linux 的 Linux VM 或 Windows 子系统(WSL)开发计算机。

    wget https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-Linux-x86_64.sh 
    bash Miniconda3-py310_24.1.2-0-Linux-x86_64.sh 
    chmod 755 -R /usr/lib/miniforge3/ 
    
    # Add Python executable to PATH 
    export PATH="/usr/lib/miniforge3/bin:$PATH" 
    
  2. 安装 Bandersnatch 以镜像 PyPI。 Bandersnatch 是一种 PyPI 镜像工具,可在 本地文件系统上下载整个 PyPI 存储库和关联的索引文件。

    # Install Bandersnatch 
    pip install bandersnatch
    
  3. 配置 Bandersnatch:使用 GitHub 上的 bandersnatch/src/bandersnatch/example.conf 中指定的配置创建 bandersnatch.conf 文件。

  4. 执行镜像命令以与 PyPI 主服务器执行一次性同步。

    bandersnatch --config <path-to-bandersnatch.conf> mirror

    此命令在本地文件系统上的镜像目录中创建以下子目录。

    注释

    初始同步需要时间才能运行(请参阅 统计信息 ·PyPI)。 Bandersnatch 还支持使用白名单和黑名单插件进行选择性镜像,从而更高效地管理依赖关系。 通过筛选不必要的包,可以减小镜像的大小,从而最大限度地减少成本和维护工作量。 例如,如果镜像仅用于 Fabric,则可以排除 Windows 二进制文件以优化存储。 建议根据用例评估这些筛选选项。

    另请参阅 镜像筛选 - Bandersnatch 文档

  5. 若要验证镜像设置,可以使用 HTTP 服务器为本地 PyPI 镜像提供服务。 此命令在端口 8000 上启动一个简单的 HTTP 服务器,用于提供镜像目录的内容:

    cd <directory-to-mirror>
    python -m http.server 8000
    
  6. 将 pip 配置为使用本地 PyPI 镜像:

    pip install <package> -index-url http://localhost:8000/simple 
    
  7. 将镜像上传到存储帐户,然后选择 “在 Azure 存储帐户上启用静态网站”。 此设置允许托管静态内容,如 PyPI 索引页。 启用此设置会自动生成名为$web的容器。

    可以使用 Blobfuse2 的 Azure CLI 或 AzCopy 将本地镜像从开发计算机上传到 Azure 存储帐户。

    • 将包文件夹上传到存储帐户容器上的所选容器。
    • 将简单、PyPI、本地统计信息和 JSON 文件夹上传到存储帐户的容器$web。
  8. 若要在 Fabric 环境项中使用此镜像,请在 Fabric 中创建两个托管专用终结点:

    • 一个用于 Blob 容器(包)
    • 一个用于静态网站(索引)
  9. 使用环境项目指定 yml 文件以 在 Fabric 环境中安装库管理

    dependencies: 
      - pip 
      - pip: 
        - pytest==8.2.2 
        - --index-url https://<storage-account-name>.z5.web.core.windows.net/simple 
    
  10. 或者,可以使用以下命令直接在笔记本 %pip install 中安装包:

   %pip install pytest --index-url https://<storage-account-name>.z5.web.core.windows.net/simple

注意事项和限制

  • 如果工作区已启用出站访问保护,它将使用托管虚拟网络(VNET)进行 Spark。 在这种情况下,启动器池处于禁用状态,应该需要 3 到 5 分钟才能启动 Spark 会话。

  • 通过出站访问保护,阻止来自 Spark 的所有公共访问。 此限制可防止用户使用 pip 直接从公共通道(如 PyPI)下载库。 若要安装其数据工程作业的库,用户有两个选项(有关详细信息,请参阅 在出站访问受保护的工作区中安全地安装库):

    • 通过托管专用终结点的连接,将数据源中的库包引用到 Fabric 工作区。

    • 上传其所需库和依赖项的 wheel 文件(这些文件尚未包含在预打包运行时中)。

  • 启用出站访问保护会阻止工作区中的所有公共访问。 因此,若要从另一个工作区查询 Lakehouse,必须创建跨工作区托管的专用终结点,以允许 Spark 作业建立连接。

  • 将完全限定的路径与工作区和 Lakehouse 名称结合使用可能会导致套接字超时异常。 若要访问文件,请使用当前 Lakehouse 的相对路径,或使用包含工作区 ID 和 Lakehouse ID(而不是其显示名称)的完全限定路径。 此方法可确保 Spark 会话能够正确解析路径,并避免套接字超时错误。 了解详细信息