【问题标题】:Submit a Spark job from C# and get results从 C# 提交 Spark 作业并获得结果
【发布时间】:2017-06-30 13:47:40
【问题描述】:

根据标题,我想请求对 Spark 集群(Azure 中的本地/HDInsight)进行计算,并从 C# 应用程序中获取结果。

我承认 Livy 的存在,我理解它是一个位于 Spark 之上的 REST API 应用程序来查询它,我还没有找到一个标准的 C# API 包。这是适合这项工作的工具吗?它只是缺少一个众所周知的 C# API

Spark 集群需要访问 Azure Cosmos DB,因此我需要能够提交包含连接器 jar 库(或其在集群驱动程序上的路径)的作业) 以便 SparkCosmos 读取数据。

【问题讨论】:

  • 你检查过莫比乌斯吗?
  • @T.Gawęda 我确实有,但在我看来,它更像是一种用 C# 编写 Spark 作业的方式,而不是用于调用和获取结果的 API。它也有这个用途吗?
  • 说实话我不知道。我只从 Databricks 帖子中认出了 Spark + C# = Mobius ;)
  • 无论如何,谢谢,我可能会挖掘更多,但看起来它只是创建工作的绑定。 @T.Gawęda

标签: c# apache-spark azure-hdinsight livy spark-dotnet


【解决方案1】:

作为查询数据的 .NET Spark 连接器似乎不存在,我写了一个

https://github.com/UnoSD/SparkSharp

这只是一个快速实现,但它也有一种使用 Spark SQL

查询 Cosmos DB 的方法

这只是 LivyC# 客户端,但应该绰绰有余。

using (var client = new HdInsightClient("clusterName", "admin", "password"))
using (var session = await client.CreateSessionAsync(config))
{
    var sum = await session.ExecuteStatementAsync<int>("val res = 1 + 1\nprintln(res)");

    const string sql = "SELECT id, SUM(json.total) AS total FROM cosmos GROUP BY id";

    var cosmos = await session.ExecuteCosmosDbSparkSqlQueryAsync<IEnumerable<Result>>
    (
        "cosmosName",
        "cosmosKey",
        "cosmosDatabase",
        "cosmosCollection",
        "cosmosPreferredRegions",
        sql
    );
}

【讨论】:

    【解决方案2】:

    如果您只是在寻找一种使用 SparkSql 查询 Spark 集群的方法,那么这是一种从 C# 进行的方法:

    https://github.com/Azure-Samples/hdinsight-dotnet-odbc-spark-sql/blob/master/Program.cs

    控制台应用程序需要安装 ODBC 驱动程序。你可以在这里找到:

    https://www.microsoft.com/en-us/download/details.aspx?id=49883

    控制台应用程序也有一个错误:将此行添加到生成连接字符串的部分之后的代码中。 紧接在这一行之后:

    connectionString = GetDefaultConnectionString();
    

    添加这一行

    connectionString = connectionString + "DSN=Sample Microsoft Spark DSN";
    

    如果您在安装 spark ODBC 驱动程序时更改了 DSN 的名称,则需要在上面的行中更改名称。

    由于您需要访问 Cosmos DB 中的数据,您可以在集群上打开一个 Jupyter Notebook 并将数据摄取到 spark 中(在此处创建数据的永久表),然后使用此控制台应用程序/您的 c# 应用程序来查询数据。

    如果您有一个用 scala/python 编写的 spark 作业并且需要从 C# 应用程序提交,那么我猜 LIVY 是最好的方法。我不确定 Mobius 是否支持。

    【讨论】:

    • 查询会不断变化,所以我不认为我可以在 Jupyter 中设置它,然后用 ODBC 驱动程序查询它,你所建议的(永久表)更静态,我我对吗?我认为它也将保存在内存中,并且需要在重新启动/数据更改时重新创建(?)如果是这样,它将不合适。
    • @stfano 您的表始终可以附加新数据。如果您的表被缓存,您可以刷新缓存。创建第一个表: parquet_reader.write.saveAsTable("ptable") 附加到表: new_parquet.write.saveAsTable("ptable", mode='append') 您的查询也可以不断变化。您将需要稍微修改 git hub 代码,但您可以让它接受动态查询。
    【解决方案3】:

    Microsoft 刚刚通过 .NET Foundation OSS 发布了基于数据帧的 .NET 对 Apache Spark 的支持。有关详细信息,请参阅 http://dot.net/sparkhttp://github.com/dotnet/spark。如果您选择正确的 HDP/Spark 版本(目前是 3.6 和 2.3,很快还会有其他版本),它现在默认在 HDInsight 中可用。

    【讨论】:

      【解决方案4】:

      更新:

      很久以前,我对这个问题明确表示不。 然而时代变了,微软做出了努力。 请查看https://dotnet.microsoft.com/apps/data/spark

      https://github.com/dotnet/spark

          // Create a Spark session
          var spark = SparkSession
          .Builder()
          .AppName("word_count_sample")
          .GetOrCreate();
      

      现在用 C# 编写 spark 应用程序就是这么简单!

      过时:

      不,如果您想使用 Spark,C# 不是您应该选择的工具!但是,如果您真的想用它来完成这项工作,请尝试上面提到的 Mobius https://github.com/Microsoft/Mobius

      Spark 有 4 种主要语言和 API-s:Scala、Java、Python、R。 如果您正在寻找生产中的语言,我不建议使用 R API。其他 3 个运行良好。

      对于 Cosmo DB 连接,我建议:https://github.com/Azure/azure-cosmosdb-spark

      【讨论】:

        猜你喜欢
        • 2015-09-25
        • 1970-01-01
        • 1970-01-01
        • 2017-06-25
        • 2016-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-10
        相关资源
        最近更新 更多