微软加入ASF之后.NET生态拓展得越来越好了,可喜可贺。
本文基于.NET for Apache® Spark™
- Java 1.8
- Apache Spark 2.4.1
- .NET Framework 4.7.2
- VS2019
java version “1.8.0_301”
Java™ SE Runtime Environment (build 1.8.0_301-b09)
Java HotSpot™ 64-Bit Server VM (build 25.301-b09, mixed mode)
按照 Getting Started with Spark .NET on Windows 和 Building Spark .NET on Windows 的说明安装依赖、配置环境变量。
- 下载Microsoft.Spark.Worker和spark-2.4.1-bin-hadoop2.7,解压后放到C:\bin下。
- 新增环境变量DOTNET_WORKER_DIR,值为C:\bin\Microsoft.Spark.Worker\
- 将路径C:\bin\spark-2.4.1-bin-hadoop2.7\bin\加入到环境变量PATH中
- 注意:虽然Getting Started with Spark .NET on Windows里没说,但是WinUtils还是需要的。必须要装!
先确定需要安装的版本:跟Hadoop的版本一样,到C:\bin\spark-2.4.1-bin-hadoop2.7\jars下面看版本,我这个包里是2.7.3,那就装2.7.3版本的WinUtils。winutils 这个作者太忙了,另外一个人接手,所以真正的下载地址应该在 这里 。下载之后还是解压完放到C:\bin\下面,并设置环境变量HADOOP_HOME为C:\bin\hadoop-2.7.3\,然后把C:\bin\hadoop-2.7.3\bin加到PATH里。 - 打开VS2019,新建一个Console App,比如说叫Spark.NetFW.Demo,然后把示例代码粘贴进Program.cs里:
using Microsoft.Spark.Sql;
namespace HelloSpark
{
class Program
{
static void Main(string[] args)
{
var spark = SparkSession.Builder().GetOrCreate();
var df = spark.Read().Json("people.json");
df.Show();
}
}
}
并建一个people.json文件,随便写点东西进去,只要不是do not copy就行。或者干脆直接到输出目录下建这个文件都可以。
6. 打开Package Manager Console,安装Microsoft.Spark
7. 编译
8. 打开一个命令行窗口,切换目录到Spark.NetFW.Demo的输出目录下,执行:
spark-submit `
--class org.apache.spark.deploy.dotnet.DotnetRunner `
--master local `
microsoft-spark-2-4_2.11-2.0.0.jar `
Spark.NetFW.Demo.exe
看github的说明里人家写的是:
spark-submit `
--class org.apache.spark.deploy.dotnet.DotnetRunner `
--master local `
microsoft-spark-<version>.jar `
dotnet HelloSpark.dll
这个<version>有文章,
我们可以看到输出目录下有3个jar包:
文件名里面2.11和2.12指的应该是scala的版本。而我下载的spark 2.4.1用的是scala 2.11.12,scala的版本号如果对不上,则会报一个NoSuchMethodError的错误:
java.lang.NoSuchMethodError: org.apache.spark.internal.Logging.$init$(Lorg/apache/spark/internal/Logging
也就是说,不管我们是用.NET core还是.NET Framework,我们都只能用microsoft-spark-2-4_2.11-2.0.0.jar这个包。用.NET core 3.1和.NET Framework 4.7.2创建的项目我都进行了尝试,只要jar包指定对了就没问题,.NET的版本目前看没发现有影响。