由于我做了很多年.net开发,所以对.net技术还算相对熟练和了解,今天我们就在windows环境下实现spark环境部署,以及简单的wordcount示例
第一步 环境准备
我们要在.net下运行程序,肯定要先安装.net,现在都讲究跨平台开发,所以我们采用.net下的跨平台 .NET Core SDK,下面是下载链接
https://dotnet.microsoft.com/download/dotnet/3.1
我们采用3.1版本,
安装 .NET Core SDK 后,我们打开一个新的cmd命令提示符,然后运行 dotnet
。
如果该命令运行并打印出有关如何使用 dotnet 的信息,说明安装成功了
第二步 安装 Java
java安装比较简单,我们下载jdk解压后,配置一下JAVA_HOME环境变量就可以了,这里就不介绍了
第三步 安装 Apache Spark
下载并安装 Apache Spark,我们从下面链接下载,这里我们选择 spark-3.0.2-bin-hadoop2.7.tgz,因为我使用最新的3.1.1发现版本不兼容
https://github.com/dotnet/spark/releases
下载之后我们解压
解压之后,我们在cmd执行以下语句,创建环境变量,当然也可以手动配置,语句里面的路径请自行配置为自己电脑的实际路径
setx /M HADOOP_HOME C:\bin\spark-3.1.1-bin-hadoop2.7\
setx /M SPARK_HOME C:\bin\spark-3.1.1-bin-hadoop2.7\
setx /M PATH "%PATH%;%HADOOP_HOME%;%SPARK_HOME%\bin" # Warning: Don't run this if your path is already long as it will truncate your path to 1024 characters and potentially remove entries!
这里我们注意第三行,如果有Warning,我们就去手动配置下PATH,主要是路径过长被截断字符了
设置环境变量后,我们一定要打开新的命令提示符运行以下命令,检查配置是否正常
spark-submit --version
我们在下图可以看到spark 版本,scala版本以及java版本都打印出来了
第四步 安装 .NET for Apache Spark
我们需要下载 Microsoft.Spark.Worker,这里我们选择.NET for Apache Spark v1.1.1版本,下载链接如下
https://github.com/dotnet/spark/releases
下载后一样解压到前面spark的位置
第五步 安装 WinUtils(仅限 Windows)
.NET for Apache Spark 要求与 Apache Spark 一起安装 WinUtils,我们从下面链接下载winutils.exe。 然后,将 WinUtils 复制到 C:\bin\spark-3.0.2-bin-hadoop2.7\bin这个目录下
https://github.com/steveloughran/winutils/blob/master/hadoop-2.7.1/bin/winutils.exe
第六步 设置 DOTNET_WORKER_DIR 并检查依赖项
我们在cmd执行下面命令 指定我们前面下载解压的Microsoft.Spark.Worker
setx /M DOTNET_WORKER_DIR C:\bin\Microsoft.Spark.Worker-1.1.1
第七步 wordcount程序实现
我们今天的重头戏来了,首先我们要创建一个.net core项目,我们可以使用vs2019,也可以使用命令创建,命令格式如下
dotnet new console -o MySparkApp
cd MySparkApp
我们进到新建的项目MySparkApp的文件夹里面,执行下面命令,添加项目需要的spark依赖包
dotnet add package Microsoft.Spark
经过上面的步骤,我们的wordcount项目已经创建好了,我现在使用vs2019打开这个项目,见下图,从图中我们可以看到左边是一个hello world示例代码,右侧是项目文件,其中可以看到项目的spark依赖包,其实我们只用到3-0_2-1.1.1.jar第三个包
接下来,我们删除hello world程序,输入以下代码
using Microsoft.Spark.Sql;
using static Microsoft.Spark.Sql.Functions;
namespace MySparkApp
{
class Program
{
static void Main(string[] args)
{
// Create Spark session
SparkSession spark =
SparkSession
.Builder()
.AppName("word_count_sample")
.GetOrCreate();
// Create initial DataFrame
string filePath = args[0];
DataFrame dataFrame = spark.Read().Text(filePath);
//Count words
DataFrame words =
dataFrame
.Select(Split(Col("value"), " ").Alias("words"))
.Select(Explode(Col("words")).Alias("word"))
.GroupBy("word")
.Count()
.OrderBy(Col("count").Desc());
// Display results
words.Show();
// Stop Spark session
spark.Stop();
}
}
}
代码输完后,我们生成一下项目,就是右键项目名称MySparkApp,点击生成,之后我们会在项目里创建debug目录,编译后的文件在MySparkApp\bin\Debug\net5.0里面
从上面的代码可以看到主程序是需要传入一个文件路径参数的,这里我准备了一个输入文件input.txt,内容是
Hello World
This .NET app uses .NET for Apache Spark
This .NET app counts words with Apache Spark
我们在该目录运行cmd命令,然后输入运行命令,注意我们要把input.txt放到MySparkApp\bin\Debug\net5.0同目录里,这样就不用输入物理路径了
spark-submit --class org.apache.spark.deploy.dotnet.DotnetRunner --master local microsoft-spark-3-0_2.12-1.1.1.jar dotnet MySparkApp.dll input.txt
执行后等待任务执行,最终我们会看到打印分析结果,下面第二图
今天的课程就到这里了