Apache Spark - 使用 .NET for Apache Spark
前言
其實,這屬於 Data 部門的事情 ( 無誤 ),但因 .NET Conf 的原因,剛好又沒有人講到 .NET for Apache Spark,而近期,因為有個案子剛好有用到 Data Bricks,所以就舉手說,Keynote 來稍微講講 .NET for Apache Spark,於是就產生了這一篇....
.NET for Apache Spark
那什麼是 .NET for Apache Spark ?
簡單的說,我們在分析超大型資料的時候,大家可能都有聽過 Apache Spark 這個分析的技術,但上面通常撰寫的語言,不是 Python 就是 Scala,那只會 C# 的小弟,就粉可憐,不過好佳在,目前 .NET 已經強大到,能在各個平台中出現,而今天要講的,就是能在 Apache Spark 上使用 C# 來進行分析。
.NET for Apache Spark 環境準備
首先,當然要先準備環境,官方原文在此,但小弟稍微調整了一下,例如,小弟採用 zulu JDK 取代 Oracle JDK,透過 brew 直接安裝 Apache-Spark。
Note : Windows 環境,請參閱官網步驟,小弟今天的環境是 MacOS。
安裝 .NET
首先,既然是 .NET for Apache Spark,那當然就是要先裝 .NET,這邊小弟就不針對 .NET 安裝詳細敘述,可以直接去 .NET 的官網下載並安裝。小弟這邊的版本是 .NET 5 的版本。
Zulu JDK 11
這邊小弟使用 Zulu JDK 11 來取代原本官網的 Oracle JDK 8,目前 Apache Spark 的 Java 最低版本為 8,但官網說 11 也可以,所以這邊就直接使用 Zulu JDK 11。
( Oracle JDK 因有授權問題,所以為了不必要的困擾,小弟習慣使用 Zulu JDK 來取代 Oracle JDK )
確認一下在 /Libary/Java/JavaVirtualMachines/ 底下是否安裝完成,以可以執行 JAVA 看看有無問題。
安裝 Apache Spark
這邊官方是使用手動安裝,但目前查看,Brew 已經包好了,所以小弟主要採用 Brew 進行。
brew 安裝
這邊小弟因為是使用 mac,所以直接使用 brew 進行安裝。
brew install apache-spark玩成後,可以執行底下指令,確認版本。
spark-submit --version手動安裝
當然,也可以自行下載。
下載,選擇 3.0.1 的版本。
下載後,將此解壓縮到 ~/bin 底下
mkdir ~/bin
tar xvf spark-3.0.1-bin-hadoop3.2.tgz --directory ~/bin完成如下
如果有需要,也可以將此目錄放到環境變數下,來方便使用。
下載 .NET for Apache Spark
有了 .NET、JAVA、Apache Spark、最後一個步驟要準備的是 .NET for Apache Spark。
大家可以透過此位置下載,如下圖。
下載下來後,解壓縮到 ~/bin 底下。
mkdir ~/bin
tar xvf Microsoft.Spark.Worker.netcoreapp3.1.osx-x64-1.0.0.zip --directory ~/bin
export DOTNET_WORKER_DIR="~/bin/Microsoft.Spark.Worker-1.0.0"如果有需要,也可以將此目錄放到環境變數下,來方便使用。因小弟是使用 zsh,所以放到 .zshrc 底下。
撰寫 .NET for Apache Spark 應用程式
接著,我們建立一個新的 Console 應用程式。
dotnet new console -o DotNetForApacheSpark.HelloWorld
cd DotNetForApacheSpark.HelloWorld
dotnet add package Microsoft.Spark接下來,我們就可以用 .NET 來寫這個程式了,以前,只能透過 Python 或是其他語言,對於只會寫 C# 的小弟我來說,粉可憐的。
using System;
using Microsoft.Spark.Sql;
using static Microsoft.Spark.Sql.Functions;
namespace DotNetForApacheSpark.HelloWorld
{
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();
}
}
}完成後進行編譯。
dotnet build然後這邊建立一個文件稱為 input.txt,這個文件,等等會提供 Apache Spark 進行文字的解析。
Hello World
This .NET app uses .NET for Apache Spark
This .NET app counts words with Apache Spark完成後,請將 input.txt 複製到 .NET Build 出來的目錄底下,通常為 bin/Debug/net5.0 底下,然後我們也必須應換到這個目錄下執行底下指令,需要注意的是 microsoft-spark-3-0_2.12-1.0.0.jar,這個檔案,其實就在 bin/Debug/net5.0 底下,而 DotNetForApacheSpark.HelloWorld.dll 因為是編譯出來的,所以也同樣在 bin/Debug/net5.0 底下,所以,進入 bin/Debug/net5.0 底下直接執行底下命令會比較快。
spark-submit \
--class org.apache.spark.deploy.dotnet.DotnetRunner \
--master local \
microsoft-spark-3-0_2.12-1.0.0.jar \
dotnet DotNetForApacheSpark.HelloWorld.dll input.txt完成的結果如下,可以快速分析完剛剛提供的文件。
後記
這邊初步的體驗 .NET for Apache Spark,雖然小弟沒有對這塊很熟,也只是隨手摸摸,但可以看到在未來 .NET 的發長上,真的可以看見許多東西。