Apache Spark - 使用 .NET for Apache Spark

12 December 2020 — Written by Sky Chang
#Azure#DataBricks#.NET#Spark#Linux

前言

其實,這屬於 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 )

2020 12 12 15 47 01

確認一下在 /Libary/Java/JavaVirtualMachines/ 底下是否安裝完成,以可以執行 JAVA 看看有無問題。

2020 12 12 15 48 13

安裝 Apache Spark

這邊官方是使用手動安裝,但目前查看,Brew 已經包好了,所以小弟主要採用 Brew 進行。

brew 安裝

這邊小弟因為是使用 mac,所以直接使用 brew 進行安裝。

brew install apache-spark

玩成後,可以執行底下指令,確認版本。

spark-submit --version

2020 12 12 15 34 28

手動安裝

當然,也可以自行下載。

下載,選擇 3.0.1 的版本。

2020 12 12 14 45 54

下載後,將此解壓縮到 ~/bin 底下

mkdir ~/bin
tar xvf spark-3.0.1-bin-hadoop3.2.tgz --directory ~/bin

完成如下

2020 12 12 14 54 08

如果有需要,也可以將此目錄放到環境變數下,來方便使用。

下載 .NET for Apache Spark

有了 .NET、JAVA、Apache Spark、最後一個步驟要準備的是 .NET for Apache Spark。

大家可以透過此位置下載,如下圖。

2020 12 12 16 10 41

下載下來後,解壓縮到 ~/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 底下。

2020 12 12 16 22 11

撰寫 .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

完成的結果如下,可以快速分析完剛剛提供的文件。

2020 12 12 16 50 29

後記

這邊初步的體驗 .NET for Apache Spark,雖然小弟沒有對這塊很熟,也只是隨手摸摸,但可以看到在未來 .NET 的發長上,真的可以看見許多東西。

參考資料

Sky & Study4.TW