Compartilhar via

将 .NET 用于 Apache Spark 和 Azure Synapse Analytics

适用于 Apache Spark 的 .NET 提供免费的、开源的和跨平台的.NET支持。

它为 Spark 提供了.NET绑定,可用于通过 C# 和 F# 访问 Spark API。 使用适用于 Apache Spark 的 .NET,还可以为以 .NET 编写的 Spark 编写和执行用户定义的函数。 使用适用于 Spark 的 .NET API 可以访问 Spark 数据帧的所有方面,这些方面可帮助你分析数据,包括 Spark SQL、Delta Lake 和结构化流式处理。

可以通过 Spark 批处理作业定义或交互式的 Azure Synapse Analytics 笔记本,使用 .NET for Apache Spark 来分析数据。 本文介绍如何使用这两种方法将 .NET 用于 Apache Spark 和 Azure Synapse。

重要

适用于 Apache Spark 的 .NET 是 .NET Foundation 下的开源项目,当前需要 .NET 3.1 库,该库已达到支持不足状态。 我们想通知使用 Azure Synapse Spark 的用户,在 Apache Spark 版本 3.3 的 Azure Synapse 运行时中将移除 .NET for Apache Spark 库。 有关此问题的更多详细信息,用户可以参考 .NET 支持策略

因此,用户将无法再通过 C# 和 F# 利用 Apache Spark API,也无法在 Synapse 的笔记本中或通过 Synapse 中的 Apache Spark 作业定义执行 C# 代码。 请务必注意,此更改仅影响 Apache Spark 3.3 及更高版本的Azure Synapse运行时。

我们将继续在所有早期版本的 Azure Synapse Runtime 中,按照它们的生命周期阶段支持用于 Apache Spark 的 .NET。 但是,我们没有计划在 Azure Synapse Runtime 中支持 Apache Spark 3.3 及未来版本的 .NET for Apache Spark。 建议使用 C# 或 F# 编写的现有工作负荷的用户迁移到 Python 或 Scala。 建议用户记下此信息并相应地进行计划。

使用 Spark 作业定义提交批处理作业

访问本教程,了解如何使用 Azure Synapse Analytics 为 Synapse Spark 池创建 Apache Spark 作业定义。 如果尚未打包应用以提交到Azure Synapse,请完成以下步骤。

  1. 配置应用程序 dotnet 依赖项,以便与 Synapse Spark 兼容。 所需的.NET Spark 版本将记录在 Apache Spark 池配置下的 Synapse Studio 接口中,位于“管理”工具箱下。

    显示属性的截图,包括 .NET Spark 版本。

    将项目创建为输出 Ubuntu x86 可执行文件的.NET控制台应用程序。

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp3.1</TargetFramework>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Microsoft.Spark" Version="2.1.0" />
      </ItemGroup>
    
    </Project>
    
  2. 运行以下命令以发布应用。 请务必将 mySparkApp 替换为应用的路径。

    cd mySparkApp
    dotnet publish -c Release -f netcoreapp3.1 -r ubuntu.18.04-x64
    
  3. 例如,压缩步骤 1 中创建的发布文件夹 publish.zip 的内容。 所有程序集都应位于 ZIP 文件的根目录中,并且不应有中间文件夹层。 这意味着解压缩 publish.zip 时,所有程序集都会解压缩到当前工作目录中。

    在 Windows 系统上:

    使用 Windows PowerShell 或 PowerShell 7,从发布目录的内容创建 .zip。

    Compress-Archive publish/* publish.zip -Update
    

    在 Linux 上:

    首先,打开一个 bash shell,然后使用 cd 命令进入包含所有发布的二进制文件的 bin 目录,并运行以下命令。

    zip -r publish.zip
    

在 Azure Synapse Analytics 笔记本中使用用于 Apache Spark 的 .NET

使用笔记本是为 Apache Spark 中的 .NET 管道和场景制作原型的极佳选择。 可以开始快速高效地处理、理解、筛选、显示和可视化数据。

数据工程师、数据科学家、业务分析师和机器学习工程师都可以通过共享的交互式文档进行协作。 你会看到数据浏览的即时结果,并且可以在同一笔记本中可视化数据。

如何对 Apache Spark 笔记本使用.NET

创建新笔记本时,请选择想要表达业务逻辑的语言内核。 内核支持适用于多种语言,包括 C# 。

若要在 Azure Synapse Analytics 笔记本中使用 apache Spark .NET,请选择 .NET Spark (C#) 作为内核,并将笔记本附加到现有的无服务器 Apache Spark 池。

.NET Spark 笔记本基于 .NET 交互式体验,提供交互式的 C# 体验,能够直接使用 .NET for Spark,并且 Spark 会话变量 spark 已经预定义。

在笔记本中安装 NuGet 包

可以在 NuGet 包名称之前使用 #r nuget magic 命令将所选的 NuGet 包安装到笔记本中。 下图显示了一个示例:

截图显示如何使用 #r 安装 Spark .NET 笔记本 NuGet 包

若要详细了解如何在笔记本中使用 NuGet 包,请参阅 .NET 交互式文档

适用于 Apache Spark C# 内核功能的.NET

在 Azure Synapse Analytics 笔记本中为 Apache Spark 使用 .NET 时,可以使用以下功能:

  • 声明性 HTML:使用 HTML 语法从单元格生成输出,例如标头、项目符号列表,甚至显示图像。
  • 简单的 C# 语句(例如赋值、打印到控制台、引发异常等)。
  • 多行 C# 代码块(例如 if 语句、foreach 循环、类定义等)。
  • 访问标准 C# 库(如 System、LINQ、Enumerables 等)。
  • 支持 C# 8.0 语言功能。
  • spark 作为预定义变量,可用于访问 Apache Spark 会话。
  • 支持定义可在 Apache Spark 中运行的.NET用户定义的函数。 我们建议在 .NET 中Write 并在 Apache Spark 交互式环境中调用 UDF,了解如何在 .NET 中使用 UDF 进行 Apache Spark 交互式体验。
  • 支持使用XPlot.Plotly库,通过不同的图表(如折线图、条形图或直方图)和布局(例如单个、覆盖等)可视化您的Spark作业输出。
  • 能够将 NuGet 包包含在 C# 笔记本中。

故障排除

OutOfMemoryError:org.apache.spark 上的 java 堆空间

Dotnet Spark 1.0.0 使用与 1.1.1+ 不同的调试体系结构。 必须对已发布的版本使用 1.0.0,并使用 1.1.1+ 进行本地调试。

后续步骤