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

通过 Azure Synapse Analytics 进行星载数据分析

Azure Synapse Analytics
Azure AI 服务
Azure 计算机视觉
Azure Batch
Azure 存储

此体系结构旨在展示端到端实现,该实现涉及通过使用地理空间库和具有 Azure Synapse Analytics 的 AI 模型来提取、加载、转换和分析星载数据。 本文还介绍如何集成特定于地理空间的 Azure 认知服务模型、合作伙伴提供的 AI 模型、自带数据以及使用 Azure Synapse Analytics 的 AI 模型。 本文档的目标受众是具有使用地理空间或航天数据的中级技能水平的用户。

GitHub 中提供了本体系结构的实现。

Apache®、Apache Spark、Spark、Spark 徽标、Apache Sedona、Apache Incubator、Apache 羽毛徽标和 Apache Incubator 项目徽标是 Apache 软件基金会在美国和/或其他国家/地区的注册商标或商标。 使用这些标记并不暗示获得 Apache Software Foundation 的认可。

体系结构

显示地理空间处理分析解决方案的图片。

下载此体系结构的 Visio 文件

数据流

以下部分介绍体系结构中的各个阶段。

数据引入

星载数据拉取自 AirbusNAIP/USDA(通过 Planetary Computer API)Maxar 等数据源。 数据引入到 Azure Data Lake Storage

Azure Synapse Analytics 提供各种管道和活动,例如 Web 活动、数据流活动和自定义活动,以便连接到这些源并将数据复制到 Data Lake Storage。

Azure Synapse 自定义活动在 Azure Batch 虚拟机池或兼容 Docker 的容器中运行自定义代码逻辑。

数据转换

数据被处理并转换为分析师和 AI 模型可以使用的格式。 地理空间库(包括 GDAL、OGR、Rasterio 和 GeoPandas)可用于执行转换。

Azure Synapse Spark 池提供配置和使用这些库来执行数据转换的功能。 也可以使用 Azure Synapse 自定义活动,这些活动使用 Azure Batch 池。

Azure Synapse 笔记本是一个 Web 界面,可用于创建包含实时代码、可视化效果和叙述性文本的文件。 笔记本是验证想法、定义转换和进行快速实验以从数据中获取见解并生成管道的好去处。 在示例代码中,GDAL 库用于在 Spark 池中执行数据转换。 有关详细信息,请参阅本文的示例代码部分。

示例解决方案从这一数据转换步骤实现此管道。 编写示例时假设数据通过前面描述的数据引入方法复制到 Data Lake Storage 中。 它演示了此管道用于光栅数据处理的实现。

AI 模型的分析和执行

Azure Synapse 笔记本环境分析和运行 AI 模型。

使用认知服务自定义视觉模型等服务开发、在自己的环境中训练并打包为 Docker 容器的 AI 模型可在 Azure Synapse 环境中使用。

在 Azure Synapse 环境中,还可以运行合作伙伴提供的 AI 模型,以实现对象检测、变更检测和土地分类等各种功能。 这些模型在自己的环境中进行训练,并打包为 Docker 容器。

Azure Synapse 可以通过自定义活动运行此类 AI 模型,该活动将 Batch 池中的代码作为可执行文件或 Docker 容器运行。 本示例解决方案演示如何将自定义视觉 AI 模型作为 Azure Synapse 管道的一部分运行,以便在特定地理空间区域上进行对象检测。

后期分析和可视化效果

  • 为了进一步分析和可视化效果,AI 模型的分析和执行输出可以存储在 Data Lake Storage、数据感知数据库(如 Azure Database for PostgreSQL 或 Azure Cosmos DB)中。 本示例解决方案演示如何转换 AI 模型输出并将其作为 GeoJSON 数据存储在 Data Lake Storage 和 Azure Database for PostgreSQL 中。 可以从此处检索和查询输出。
  • 对于可视化效果:
    • 可以使用 ArcGIS Desktop 等许可工具或 QGIS 等开源工具。
    • 可以使用 Power BI 从各种数据源访问 GeoJSON 并可视化地理信息系统 (GIS) 数据。
    • 可以使用基于 JavaScript 的客户端地理空间库来可视化 Web 应用中的数据。

组件

数据源

数据引入

  • Azure Synapse Analytics 是一种无限制的分析服务,它将数据集成、企业数据仓库和大数据分析结合在一起。 Azure Synapse 包含了与 Azure 数据工厂相同的数据集成引擎和体验,使你可以创建大规模 ETL 管道,而无需离开 Azure Synapse。
  • Azure Data Lake Storage 专用于大数据分析,基于 Azure Blob 存储而构建。
  • 可以通过 Azure Batch 在 Azure 上运行和缩放大量批处理计算作业。 Batch 任务可直接在 Batch 池中的虚拟机(节点)上运行;但也可以设置一个 Batch 池,以便在节点上的 Docker 兼容容器中运行任务。
    • Azure Synapse 自定义活动在 Azure Batch 虚拟机池或 Docker 容器中运行自定义代码逻辑。
  • Azure Key Vault 存储和控制对机密(如令牌、密码和 API 密钥)的访问。 Key Vault 还会创建和控制加密密钥并管理安全证书。

数据转换

以下地理空间库和包一起用于转换。 这些库和包安装在无服务器 Spark 池中,然后附加到 Azure Synapse 笔记本。 有关安装库的信息,请参阅本文后面的在 Azure Synapse Spark 池中安装地理空间包

  • 地理空间库
    • GDAL 是用于操作星载数据的工具库。 GDAL 适用于光栅和矢量数据类型。 这是一个很好的工具,可以知道你是否正在使用星载数据。
    • Rasterio 是用于光栅处理的模块。 可以使用它在 Python 中读取和写入几种不同的光栅格式。 光栅基于 GDAL。 导入模块后,Python 会自动注册所有已知的 GDAL 驱动程序来读取支持的格式。
    • GeoPandas 是一个开源项目,使用该项目可更轻松地在 Python 中处理星载数据。 GeoPandas 会扩展 Pandas 使用的数据类型,从而允许对几何类型进行空间操作。
    • Shapely 是一个 Python 包,用于对平面特征进行集论分析和操作。 它(通过 Python 的 ctypes 模块)使用广泛部署的 GEOS 库中的函数。
    • pyproj 执行制图转换。 它通过使用 PROJ 将经度和纬度转换为本机地图投影 x、y 坐标,反之亦然。
  • 可以通过 Azure Batch 在 Azure 上运行和缩放大量批处理计算作业。
  • Azure Synapse 笔记本是一种 Web 界面,用于创建包含实时代码、可视化效果和叙述性文本的文件。 可以使用 Notebook 活动将现有 Azure Synapse 笔记本添加到 Azure Synapse 管道。
  • Apache Spark 池 提供配置和使用库来执行数据转换的功能。 可以使用 Spark 作业定义活动将现有 Spark 作业添加到 Azure Synapse 管道。

分析和 AI 建模

  • Azure Synapse 提供机器学习功能。
  • 可以通过 Azure Batch 在 Azure 上运行和缩放大量批处理计算作业。 在此解决方案中,Azure Synapse 自定义活动用于在 Azure Batch 池上运行基于 Docker 的 AI 模型。
  • Azure 认知服务提供将视觉嵌入应用的功能。 可以使用自定义视觉(认知服务的组件),为特定域自定义和嵌入最先进的计算机视觉图像分析。
  • 也可以使用自带 AI 模型和 Microsoft 合作伙伴 AI 模型,例如 blackshark.ai

后期分析和可视化效果链接

  • Azure Database for PostgreSQL 是一种完全托管的关系数据库服务,专为超大规模工作负载而设计。 它通过 PostGIS 扩展支持星载数据。
  • Azure Cosmos DB 支持对以 GeoJSON 表示的地理空间点数据进行索引和查询。
  • Power BI 是用于生成报表和仪表板的交互式数据可视化工具。 可以从 Esri ArcGIS 地图获取有关星载数据的见解。
  • QGIS 是一种免费的开源 GIS,用于创建、编辑、可视化、分析和发布地理空间信息。
  • ArcGIS Desktop 是 Esri 提供的许可产品。 可以使用它来创建、分析、管理和共享地理信息。

备选方法

如果要运行可从 Azure Synapse 调用的容器化 AI 模型,可以使用 Azure Kubernetes 服务Azure 容器实例Azure 容器应用

Azure Databricks 提供了用于托管分析管道的替代方法。

Azure HDInsight 中的 Spark 提供了在 Apache Spark 环境中使用地理空间库的替代方法。

以下是一些可用于星载数据处理的替代库和框架:

  • Apache Sedona,原名 GeoSpark,是一种用于处理大规模空间数据的群集计算系统。 Sedona 使用现成的空间弹性分布式数据集和 SpatialSQL 扩展 Spark 和 Spark SQL,以便跨计算机高效地加载、处理和分析大规模空间数据。
  • Dask for Python 是一个并行计算库,可缩放现有的 Python 生态系统。

方案详细信息

星载数据收集越来越常见。 对于人工智能的应用程序,存储的数据存档是机器学习所必需的。 为星载数据分析构建基于云的解决方案的需求变得越发重要,这使企业和政府能够制定更明智的商业和战术决策。

可能的用例

此解决方案非常适合航空航天和飞机工业。 它可以解决以下场景:

  • 光栅数据引入和处理
  • 通过预训练的 AI 模型进行对象检测
  • 通过 AI 模型对陆块进行分类
  • 通过 AI 模型监测环境变化
  • 派生自预处理图像集的数据集
  • 矢量可视化效果/小面积使用
  • 矢量数据筛选和跨数据联接

注意事项

这些注意事项实施 Azure 架构良好的框架的支柱原则,即一套可用于改善工作负荷质量的指导原则。 有关详细信息,请参阅 Microsoft Azure 架构良好的框架

卓越运营

如果通过使用 Git 进行源代码管理来展开协作,则可使用 Synapse Studio 将工作区与 Git 存储库、Azure DevOps 或 GitHub 相关联。 有关详细信息,请参阅 Synapse Studio 中的源代码管理

  • 在 Azure Synapse 工作区中,CI/CD 将所有实体从一个环境(开发、测试、生产)移到另一个环境。
  • 可以使用 Azure DevOps 发布管道和 GitHub 操作自动将 Azure Synapse 工作区部署到多个环境。

性能

  • Azure Synapse 支持 Apache Spark 3.1.2,其性能优于其前身。
  • 有关 Spark 池缩放和节点大小的信息,请参阅 Azure Synapse Analytics 中的 Spark 池
  • 使用 Azure Batch,可以并行横向扩展在 Azure Synapse 自定义活动中提交的转换。 Azure Batch 支持可用于运行 AI 模型的专用 GPU 优化 VM 大小。

可靠性

可靠性可确保应用程序符合你对客户的承诺。 有关详细信息,请参阅可靠性支柱概述

有关 SLA 的信息,请参阅 Azure Synapse SLA

安全性

安全性针对蓄意攻击及滥用宝贵数据和系统提供保障措施。 有关详细信息,请参阅安全性支柱概述

有关安全最佳做法,请参阅以下文章:

成本优化

成本优化是关于寻找减少不必要的费用和提高运营效率的方法。 有关详细信息,请参阅成本优化支柱概述

这些资源提供有关定价和成本优化的信息:

备注

有关合作伙伴 AI 模型的定价和许可条款,请参阅合作伙伴的文档。

部署此方案

示例解决方案的 Bicep 部署可供使用。 要开始此部署,请参阅以下说明

演示已部署示例解决方案的体系结构的图片。

下载此体系结构的 Visio 文件

限制

此体系结构演示了使用 Azure Synapse 的端到端地理处理和分析解决方案。 此示例实现面向相关的中小型区域和有限的光栅数据并发地理处理。

代码示例

以下说明介绍如何使用 Synapse 笔记本读取、写入和应用转换存储在 Azure Data Lake Storage 中的光栅数据。 其目的更多的是为了演示 Synapse 笔记本中库的使用,而不是演示转换。

先决条件

说明

  • 打印光栅数据中的信息:

    from osgeo import gdal
    gdal.UseExceptions()
    access_key = TokenLibrary.getSecret('<key-vault-name>','<secret-name>')
    gdal.SetConfigOption('AZURE_STORAGE_ACCOUNT', '<storage_account_name>')
    gdal.SetConfigOption('AZURE_STORAGE_ACCESS_KEY', access_key)
    dataset_info = gdal.Info('/vsiadls/aoa/input/sample_image.tiff')  #/vsiadls/<container_name>/path/to/image
    print(dataset_info)
    

    备注

    /vsiadls/ 是一种文件系统处理程序,它支持动态随机读取 Azure Data Lake Storage 文件系统中可用的主要非公共文件。 不需要事先下载整个文件。 /vsiadls/ 类似于 /vsiaz/。 它使用相同的配置选项进行身份验证。 不同于 /vsiaz//vsiadls/ 提供真正的目录管理和 Unix 样式的 ACL 支持。 对于某些功能,需要在 Azure 存储中启用分层支持。 有关详细信息,请参阅 /vsiadls/ 文档

    Driver: GTiff/GeoTIFF
    Files: /vsiadls/naip/input/sample_image.tiff
    Size is 6634, 7565
    Coordinate System is:
    PROJCRS["NAD83 / UTM zone 16N",
        BASEGEOGCRS["NAD83",
            DATUM["North American Datum 1983",
                ELLIPSOID["GRS 1980",6378137,298.257222101,
                    LENGTHUNIT["metre",1]]],
            PRIMEM["Greenwich",0,
                ANGLEUNIT["degree",0.0174532925199433]],
            ID["EPSG",4269]],
        CONVERSION["UTM zone 16N",
            METHOD["Transverse Mercator",
                ID["EPSG",9807]],
            PARAMETER["Latitude of natural origin",0,
                ANGLEUNIT["degree",0.0174532925199433],
                ID["EPSG",8801]],
            PARAMETER["Longitude of natural origin",-87,
                ANGLEUNIT["degree",0.0174532925199433],
                ID["EPSG",8802]],
            PARAMETER["Scale factor at natural origin",0.9996,
                SCALEUNIT["unity",1],
                ID["EPSG",8805]],
            PARAMETER["False easting",500000,
                LENGTHUNIT["metre",1],
                ID["EPSG",8806]],
            PARAMETER["False northing",0,
                LENGTHUNIT["metre",1],
                ID["EPSG",8807]]],
        CS[Cartesian,2],
            AXIS["(E)",east,
                ORDER[1],
                LENGTHUNIT["metre",1]],
            AXIS["(N)",north,
                ORDER[2],
                LENGTHUNIT["metre",1]],
        USAGE[
            SCOPE["Engineering survey, topographic mapping."],
            AREA["North America - between 90°W and 84°W - onshore and offshore. Canada - Manitoba; Nunavut; Ontario. United States (USA) - Alabama; Arkansas; Florida; Georgia; Indiana; Illinois; Kentucky; Louisiana; Michigan; Minnesota; Mississippi; Missouri; North Carolina; Ohio; Tennessee; Wisconsin."],
            BBOX[23.97,-90,84,-84]],
        ID["EPSG",26916]]
    Data axis to CRS axis mapping: 1,2
    Origin = (427820.000000000000000,3395510.000000000000000)
    Pixel Size = (1.000000000000000,-1.000000000000000)
    Metadata:
      AREA_OR_POINT=Area
    Image Structure Metadata:
      COMPRESSION=DEFLATE
      INTERLEAVE=PIXEL
      LAYOUT=COG
      PREDICTOR=2
    Corner Coordinates:
    Upper Left  (  427820.000, 3395510.000) ( 87d45'13.12"W, 30d41'24.67"N)
    Lower Left  (  427820.000, 3387945.000) ( 87d45'11.21"W, 30d37'18.94"N)
    Upper Right (  434454.000, 3395510.000) ( 87d41' 3.77"W, 30d41'26.05"N)
    Lower Right (  434454.000, 3387945.000) ( 87d41' 2.04"W, 30d37'20.32"N)
    Center      (  431137.000, 3391727.500) ( 87d43' 7.54"W, 30d39'22.51"N)
    Band 1 Block=512x512 Type=Byte, ColorInterp=Red
      Overviews: 3317x3782, 1658x1891, 829x945, 414x472
    Band 2 Block=512x512 Type=Byte, ColorInterp=Green
      Overviews: 3317x3782, 1658x1891, 829x945, 414x472
    Band 3 Block=512x512 Type=Byte, ColorInterp=Blue
      Overviews: 3317x3782, 1658x1891, 829x945, 414x472
    Band 4 Block=512x512 Type=Byte, ColorInterp=Undefined
      Overviews: 3317x3782, 1658x1891, 829x945, 414x472
    
  • 使用 GDAL 将 GeoTiff 转换为 PNG:

    from osgeo import gdal
    gdal.UseExceptions()
    access_key = TokenLibrary.getSecret('<key-vault-name>','<secret-name>')
    gdal.SetConfigOption('AZURE_STORAGE_ACCOUNT', '<storage_account_name>')
    gdal.SetConfigOption('AZURE_STORAGE_ACCESS_KEY', access_key)
    tiff_in = "/vsiadls/aoa/input/sample_image.tiff" #/vsiadls/<container_name>/path/to/image
    png_out = "/vsiadls/aoa/input/sample_image.png" #/vsiadls/<container_name>/path/to/image
    options = gdal.TranslateOptions(format='PNG')
    gdal.Translate(png_out, tiff_in, options=options)
    
  • 在 Azure Data Lake Storage 中存储 GeoTiff 图像。

    由于数据在云中的存储方式以及文件处理程序 /vsiaz//vsiadls/ 仅支持顺序写入这一事实,我们使用 mssparkutils 包中提供的文件装载功能。 将输出写入装载位置后,将其复制到 Azure Data Lake Storage,如以下示例转换所示:

    import shutil
    import sys
    from osgeo import gdal
    from notebookutils import mssparkutils
    
    mssparkutils.fs.mount(
        "abfss://<container_name>@<storage_account_name>.dfs.core.windows.net",
        "/<mount_path>",
        {"linkedService":"<linked_service_name>"}
    )
    
    access_key = TokenLibrary.getSecret('<key-vault-name>','<secret-name>')
    gdal.SetConfigOption('AZURE_STORAGE_ACCOUNT', '<storage_account_name>')
    gdal.SetConfigOption('AZURE_STORAGE_ACCESS_KEY', access_key)
    
    options = gdal.WarpOptions(options=['tr'], xRes=1000, yRes=1000)
    gdal.Warp('dst_img.tiff', '/vsiadls/<container_name>/path/to/src_img.tiff', options=options)
    
    jobId = mssparkutils.env.getJobId()
    
    shutil.copy("dst_img.tiff", f"/synfs/{jobId}/<mount_path>/path/to/dst_img.tiff")
    

    在 Azure Synapse 中,可以将 Azure Data Lake Storage 添加为链接服务之一。 有关说明,请参阅链接服务

示例解决方案

GitHub 中提供了本体系结构的实现。

此图显示了示例解决方案中的步骤:

显示示例解决方案中的步骤的图片。

下载此体系结构的 Visio 文件

备注

数据从星载数据源中拉取并复制到 Azure Data Lake Storage。 数据引入不是引用实现的一部分。

  1. Azure Synapse 管道从 Azure Data Lake Storage 读取星载数据。
  2. 使用 Azure Synapse 笔记本中的 GDAL 库对数据进行处理。
  3. 处理后的数据存储在 Azure Data Lake Storage 中。
  4. 处理后的数据从 Azure Data Lake Storage 读取,并通过 Azure Synapse 自定义活动传递给对象检测自定义视觉 AI 模型。 自定义活动使用 Azure Batch 池来运行对象检测模型。
  5. 对象检测模型输出检测到的对象和边界框的列表。
  6. 检测到的对象将转换为 GeoJSON 并存储在 Azure Data Lake Storage 中。
  7. GeoJSON 数据从 Azure Data Lake Storage 读取并存储在 PostgreSQL 数据库中。
  8. 数据从 PostgreSQL 数据库中读取。 它可以在 ArcGIS Pro、QGIS 和 Power BI 等工具中进行进一步可视化。

在 Azure Synapse Spark 池中安装地理空间包

需要使用包管理功能在 Azure Synapse Spark 池中安装包。 有关详细信息,请参阅 Azure Synapse 包管理

要支持 Azure Synapse 上的星载数据工作负载,需要 GDALRasterioGeoPandas 等库。 可以使用 YAML 文件在无服务器 Apache Spark 池上安装这些库。 Anaconda 库已预安装在 Spark 池中。

先决条件

说明

  1. environment.yml 文件中提供了以下库和包。 建议使用此文件在 Spark 池中安装库。 如果复制以下内容,请确保没有制表符,因为 YAML 仅允许使用空格作为缩进。

    name: aoi-env
    channels:
      - conda-forge
      - defaults
    dependencies:
      - azure-storage-file-datalake
      - gdal=3.3.0
      - libgdal
      - pip>=20.1.1
      - pyproj
      - shapely
      - pip:
        - rasterio
        - geopandas
    

    备注

    GDAL 将虚拟文件系统 /vsiadls/ 用于 Azure Data Lake Storage。

  2. 转到 https://web.azuresynapse.net ,然后登录到工作区。

  3. 从导航面板中选择管理,然后选择 Apache Spark 池

  4. 通过选择 Spark 池上的省略号按钮 (...) 来选择。 从本地上传 environment.yml 文件并应用包设置。

  5. 门户的通知部分会在安装完成后通知你。 还可以通过执行以下步骤来跟踪安装进度:

    1. 转到监视选项卡上的 Spark 应用程序列表。
    2. 选择与池更新相对应的 SystemReservedJob-LibraryManagement 链接。
    3. 查看驱动程序日志。
  6. 运行以下代码,验证是否已安装正确的库版本。 还将列出 Conda 安装的预安装库。

    import pkg_resources
    for d in pkg_resources.working_set:
       print(d)
    

有关详细信息,请参阅管理包

作者

本文由 Microsoft 更新和维护。 它最初是由以下贡献者撰写的。

主要作者:

其他参与者:

后续步骤