从 C# 提交 Spark 作业并获得结果
Submit a Spark job from C# and get results
根据标题,我想请求对 Spark 集群(Azure 中的local/HDInsight)进行计算,并从 C# 应用程序中获取结果。
我承认 Livy 的存在,据我所知这是一个 REST API 应用程序,位于 Spark 之上以进行查询它,我还没有找到标准的 C# API 包。这是适合这项工作的工具吗?它只是缺少一个众所周知的 C# API?
Spark 集群需要访问 Azure Cosmos DB,因此我需要能够提交包含连接器 jar 库的作业(或其在集群 driver 上的路径)以便 Spark 从 Cosmos.
读取数据
如果您只是在寻找一种使用 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(在那里创建一个永久的 table 数据),然后使用此控制台 app/your c# 应用程序查询该数据。
如果您有一个用 scala/python 编写的 spark 作业并且需要从 C# 应用程序提交它,那么我想 LIVY 是最好的选择。我不确定 Mobius 是否支持。
更新:
很久以前我就明确的拒绝了这个问题。
然而时代变了,微软做出了努力。
请查看 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
作为 .NET Spark 查询数据的连接器似乎不存在我写了一个
https://github.com/UnoSD/SparkSharp
这只是一个快速实现,但它也有一种使用 Spark SQL 查询 Cosmos DB 的方法
它只是 C# Livy 的客户端,但应该绰绰有余了。
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
);
}
Microsoft 刚刚通过 .NET Foundation OSS 发布了对 Apache Spark 的基于 .NET 的数据框支持。有关详细信息,请参阅 http://dot.net/spark and http://github.com/dotnet/spark。如果您 select 正确的 HDP/Spark 版本(目前是 3.6 和 2.3,很快也会有其他版本),它现在默认在 HDInsight 中可用。
根据标题,我想请求对 Spark 集群(Azure 中的local/HDInsight)进行计算,并从 C# 应用程序中获取结果。
我承认 Livy 的存在,据我所知这是一个 REST API 应用程序,位于 Spark 之上以进行查询它,我还没有找到标准的 C# API 包。这是适合这项工作的工具吗?它只是缺少一个众所周知的 C# API?
Spark 集群需要访问 Azure Cosmos DB,因此我需要能够提交包含连接器 jar 库的作业(或其在集群 driver 上的路径)以便 Spark 从 Cosmos.
读取数据如果您只是在寻找一种使用 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(在那里创建一个永久的 table 数据),然后使用此控制台 app/your c# 应用程序查询该数据。
如果您有一个用 scala/python 编写的 spark 作业并且需要从 C# 应用程序提交它,那么我想 LIVY 是最好的选择。我不确定 Mobius 是否支持。
更新:
很久以前我就明确的拒绝了这个问题。 然而时代变了,微软做出了努力。 请查看 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
作为 .NET Spark 查询数据的连接器似乎不存在我写了一个
https://github.com/UnoSD/SparkSharp
这只是一个快速实现,但它也有一种使用 Spark SQL 查询 Cosmos DB 的方法
它只是 C# Livy 的客户端,但应该绰绰有余了。
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
);
}
Microsoft 刚刚通过 .NET Foundation OSS 发布了对 Apache Spark 的基于 .NET 的数据框支持。有关详细信息,请参阅 http://dot.net/spark and http://github.com/dotnet/spark。如果您 select 正确的 HDP/Spark 版本(目前是 3.6 和 2.3,很快也会有其他版本),它现在默认在 HDInsight 中可用。