「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>Azure Databricks]]
--Azure Databricksチュートリアル
--[[Azure DatabricksのNotebook]]

* 目次 [#w8c8f593]
#contents

*概要 [#m1326267]
Azure Databricksのチュートリアル。

*準備 [#n68abe24]

**契約 [#t42d5e96]

***[[Azureの契約>AzureのPoC環境を契約する]] [#ke36671c]

***Databricksの契約 [#cf1e6ce6]
-Azureの無料試用版サブスクリプションは利用不可との事。

-ただし、Azureの従量課金制サブスクリプションで~
Databricksの14日間の無料試用版を使用可能。

--無料の Azure アカウントと Azure Databricks ユニット | Microsoft Azure~
https://azure.microsoft.com/ja-jp/free/services/databricks/
>既存のサブスクリプションで試用版を使用する場合、~
ワークスペース作成の価格レベルで試用版を選択する。

--ただし、

---Databricksユニットには課金されないが、

---クラスタのVMには課金されるので注意する。

**環境 [#rf9815ce]

***ワークスペース [#gd9a5060]

-作成開始の方法

--ポータルで [リソースの作成] > [分析] > [Azure Databricks] の順に選択

--若しくは、[Azure Databricks | Microsoft Azure] の~
[Already an Azure customer? Get started]を押下。~
https://portal.azure.com/#create/Microsoft.Databricks

-値を指定

--ワークスペース名~
mydatabrickswsとか

--サブスクリプション~
任意の値

--リソース グループ
---DplRGとか
---既定値は、ワークスペース名に、prefixとしてdatabricks-rg-が付与されたもの。~
databricksXXXと入力すると、databricks-rg-databricksXXX-XXXXになってしまう。

--場所(リージョン)
---データ・パープライン系は「West US 2」辺りが良いかも。
---リージョン別の Azure 製品 | Microsoft Azure~
https://azure.microsoft.com/ja-jp/global-infrastructure/services/?products=databricks

--価格レベル~
試用版を選択できる。

--Virtual Network~
以下の項目は、共に「いいえ」を選択した。
---Secure Cluster Connectivity による...デプロイ (パブリック IP なし)
---自分の仮想ネットワーク (VNet) に...デプロイします~

-[作成]ボタンを押下~
ワークスペースの作成には数分かかる。
--「デプロイが完了しました」が表示されたら、
--[リソースに移動]ボタンを押下する。
--[ワークスペースの起動]ボタンを押下する。
--Databricks のポータル・サイトに移動する。

-エンドポイントの保護

--IPアドレス制限~
プレミアム・ライセンスが必要

--FQDN名
 <databricks-instance> = adb-<workspace-id>.<random-number>.azuredatabricks.net

--以下、[[Databricks CLI>#bf24b43b]]が必要

---トークンの設定
 $ export DATABRICKS_TOKEN=xxxxxx

---有効化(WSLで)
 $ curl -X PATCH https://<databricks-instance>/api/2.0/workspace-conf \
 --header "Authorization: Bearer $DATABRICKS_TOKEN" \
 -d '{
   "enableIpAccessLists": "true"
 }'

---付与(WSLで)
 $ curl -X POST https://<databricks-instance>/api/2.0/ip-access-lists
 --header "Authorization: Bearer $DATABRICKS_TOKEN" \
 -d '{
   "label": "office",
   "list_type": "ALLOW",
   "ip_addresses": [
     "xxx.xxx.xxx.xxx"
   ]
 }'

-IaC化

--[[Azure CLI]]で~
---現時点でクイック スタート情報なし。

--[[PowerShell]]で
---クイック スタートから、以下のように作成可能。
 >Connect-AzAccount
 >Set-AzContext -SubscriptionId ...
 >Register-AzResourceProvider -ProviderNamespace Microsoft.Databricks
 >New-AzDatabricksWorkspace -Name [名称] -ResourceGroupName [既存のRG名] -Location [場所(リージョン)] -ManagedResourceGroupName [ManagedRG名] -Sku [sku]

---参考~
・https://opentouryo.osscons.jp/index.php?%E9%83%A8%E4%BC%9A%E3%83%A1%E3%83%A2%EF%BC%882021%E5%B9%B4%EF%BC%89#vc306769~
・https://github.com/OpenTouryoProject/DataPipeline/blob/develop/Batch/AzDatabricks/README.md

-参考
--DatabricksへのアクセスをIP制限する - 雲のメモ帳~
https://www.cloudnotes.tech/entry/databricks_iprestrict
--Azure Databricks 個人用アクセストークンを使用した認証-Azure Databricks - Workspace | Microsoft Docs~
https://docs.microsoft.com/ja-jp/azure/databricks/dev-tools/api/latest/authentication

***クラスタ [#med3ca62]
手順に従いClusterを作成する

-[New Cluster]を押下

-入力
--Cluster Name : mysparkcluster
--Cluster Mode : Standard
--Pool : None
--Runtime : 6.4 -> 7.3 LTS
--Autopilot Options
---☑ Enable autoscaling
---☑ Terminate after 20 minutes of inactivity
---Worker Type~
・Standard_DS3_v2~
・Min Workers 2 Max Workers 8~
・☑ Spot instances~
・Driver Type Same as worker~

-[Create Cluster]ボタンを押下~
※ この手順では、&color(red){クォータ制限};の問題は発生しなかった(発生した場合は[[コチラ>#h06a7649]])。

***Notebook [#je91701c]
-以下の手順に従いNotebookを作成する。

--[New Notebook]を押下

--入力
---Name : mynotebook
---Language : Python
---Cluster : mysparkcluster

--[Create]ボタンを押下

-Notebook上でインタラクティブ実行してみる。
--[[ハロー・ワールド風>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?PySpark#ffe40eef]]

-参考
--[[Azure DatabricksのNotebook]]

***ツール [#bf24b43b]
-Databricks CLI~
ファイル・システムにアクセスしたりする時に使う。

--Python 3.6 以降が必要

--[[Pythonのインストール>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Python#lc36d4a8]]

--Databricks CLIのインストール~
pip3を使用してインストール
 >pip3 install databricks-cli

--インストールの確認
 >databricks
 Usage: databricks [OPTIONS] COMMAND [ARGS]...
 
 Options:
   -v, --version   0.14.3
   ...

--Databricks CLIの設定
 >databricks configure --token

---ホスト URLの入力
 Databricks Host (should begin with https://): https://.....azuredatabricks.net

---トークンの取得
#ref(無題1.png,left,nowrap,トークンの取得,70%)

--トークンの入力
 Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

--以下のようになる(Tokenの所は入力が表示されない)。
 >databricks configure --token
 Databricks Host (should begin with https://): https://.....azuredatabricks.net/
 Token:
 
 >

*Scala [#m5f129dc]
[[Notebook>#je91701c]]のセルに記述可能。

**ETL のチュートリアル [#xf1b382e]
[[参考>#j501dd8e]]中の「...データの抽出、変換、読み込みを行う」~

**Event Hubsと組み合わせるチュートリアル [#qb0fbdbe]
[[参考>#j501dd8e]]中の「Event Hubs を使用して...ストリーム配信する」

**感情分析のチュートリアル [#qb0fbdbe]
[[参考>#j501dd8e]]中の「Azure Databricks を使用したストリーミング データに対する感情分析」

**参考 [#w15adae9]
[[Microsoft Docs>#y4d4dbfd]]、[[Qiita>#g377cc6b]]

*[[Python (PySpark)>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?PySpark]]  [#r15035b9]
[[Notebook>#je91701c]]のセルに記述可能。

**Docsのクイック スタート [#qd3c3cb0]
-[[参考>#j501dd8e]]中のクイック スタート。
-Docsの説明が雑なので以下、注釈を加えてみる。

***Parquetファイル [#q83dd008]
-CSVやTSVファイルのような行指向ファイル形式~
に対し効率的で高性能な列指向ストレージ形式。

-ダウンロード先がイマイチ不明なので、以下から取得する。~
https://github.com/Teradata/kylo/tree/master/samples/sample-data/parquet

-先ずは、[[Jupyter Notebook>Azure DatabricksのNotebook#p84bd61d]]でローカルから読込。

--読込
 parquet_df = spark.read.parquet("path/to/userdata1.parquet")
--表示
 parquet_df.show()
--結果
 +-------------------+---+----------+---------+--------------------+------+---------------+-------------------+--------------------+----------+---------+--------------------+--------------------+
 |  registration_dttm| id|first_name|last_name|               email|gender|     ip_address|                 cc|             country| birthdate|   salary|               title|            comments|
 +-------------------+---+----------+---------+--------------------+------+---------------+-------------------+--------------------+----------+---------+--------------------+--------------------+
 |2016-02-03 16:55:29|  1|    Amanda|   Jordan|    ajordan0@com.com|Female|    1.197.201.2|   6759521864920116|           Indonesia|  3/8/1971| 49756.53|    Internal Auditor|               1E+02|
 ...

-一応、Spark SQLを実行してみる。

--Spark SQL
 parquet_df.createOrReplaceTempView('source')
 parquet_df = spark.sql('SELECT * FROM source LIMIT 10')

--表示
 print('Displaying top 10 rows: ')
 parquet_df.show()

--結果~
 Displaying top 10 rows: 
 上記が10行に絞られた結果

***[[Azureストレージ>Azureのストレージ]]へアクセス [#l015e466]
その次に、[[Azureストレージ>Azureのストレージ]]から読込んでみる。

-[[Parquetファイル>#q83dd008]]を[[Azureストレージ>Azureのストレージ]]に配置
--[[Azureストレージ>Azureのストレージ]]作成のスクリプトは[[コチラ>https://opentouryo.osscons.jp/index.php?%E9%83%A8%E4%BC%9A%E3%83%A1%E3%83%A2%EF%BC%882021%E5%B9%B4%EF%BC%89#vc306769]]
--[[Parquetファイル>#q83dd008]]はポータルからアップロード可能

-[[Jupyter Notebook>Azure DatabricksのNotebook#p84bd61d]]上の[[Python (PySpark)>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?PySpark]]から読込んでみる。

--実行
 from pyspark.sql import SparkSession
 spark: SparkSession = SparkSession.builder.appName("SimpleApp").getOrCreate()
 
 blob_account_name = "osscjpdevinfra"
 blob_container_name = "container1"
 blob_relative_path = "userdata1.parquet"
 blob_sas_token = r"?st=xxxxxxxxxxxxxxxxxxxx"
 
 wasbs_path = 'wasbs://%s@%s.blob.core.windows.net/%s' % (blob_container_name, blob_account_name, blob_relative_path)
 spark.conf.set('fs.azure.sas.%s.%s.blob.core.windows.net' % (blob_container_name, blob_account_name), blob_sas_token)
 
 print('Remote blob path: ' + wasbs_path)
 
 parquet_df = spark.read.parquet(wasbs_path)
 parquet_df.show()

--結果~
ライブラリが足りないもよう。
 Class org.apache.hadoop.fs.azure.NativeAzureFileSystem$Secure not found

***[[Azure Databricks]]上で実行 [#m6c58006]
ライブラリが足りないので、[[Azure Databricks]]上で実行してみる。

-前提
--ワークスペースの作成(作成のスクリプトは[[コチラ>#gd9a5060]]
--クラスタの作成(作成の手順は[[コチラ>#med3ca62]]
--Notebookの作成する(作成の手順は[[コチラ>#je91701c]]

-[[先程のコード>#l015e466]]を実行する。

--Clusterを開始する。

---左上のドロップダウン・リストから作成したClusterを選択し、

---そこから[Start Cluster]を選択して押下する。

--(先程の)コードをセルに貼り付ける。

--Shift + Enter キーを使用してコードを実行

--無事、実行されたことを確認したら~
以下のようにコードを変更して再実行する。

---変更前
 parquet_df.show()

---変更後
 display(parquet_df)

--データの視覚的な表現を作成する。~
displayで表示された形式の出力の一番下から、~
[Plot Options]をクリックし、以下のようにする。
#ref(無題.png,left,nowrap,グラフ表示,50%)

--Clusterを停止する。

---Clusterを開始した際に使ったドロップダウン・リストからCluster管理画面へ飛ぶ。
---Cluster管理画面で、Terminate or Deleteを選択する。
---課金がアレなので、~
・PoCならリソース・グループごと削除しておいた方が良い。~
・と言うのも、リソース・グループを見るとClusterのリソースが大量に。

**[[PySparkチュートリアル>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?PySpark#p629aafe]] [#x3565c3a]
[[クイック スタート>#qd3c3cb0]]も終わったので、[[PySparkチュートリアル>#x3565c3a]]を、Azure Databricksで動かしてみる。

***[[on Jupyter Notebook on Docker>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?PySpark#ffe40eef]] [#r5a02814]

***[[DataFrameに対する様々な操作>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?PySpark#w64c6c2e]] [#ia077b23]

**静的ファイルで構造化ストリーミングをエミュレート [#gd028138]
[[databricks.comのApache Spark チュートリアル(ストリーミング)>#k666624d]]を、Azure Databricksで動かしてみる。

***環境準備 [#t647655e]
作成のスクリプトは以下
-送信:なし
-受信:[[Azure Databricks>#gd9a5060]]

***エミュレート [#c2e0e166]
readStreamでinputPathをmaxFilesPerTriggerで読む...みたいな感じになる。

 from pyspark.sql.functions import *
 
 # Similar to definition of staticInputDF above, just using `readStream` instead of `read`
 streamingInputDF = (
   spark
     .readStream
     .schema(jsonSchema)               # Set the schema of the JSON data
     .option("maxFilesPerTrigger", 1)  # Treat a sequence of files as a stream by picking one file at a time
     .json(inputPath)
 )
 
 # Same query as staticInputDF
 streamingCountsDF = (
   streamingInputDF
     .groupBy(
       streamingInputDF.action, 
       window(streamingInputDF.time, "1 hour"))
     .count()
 )

***出力方法 [#r4ddc25c]
インタラクティブにやる場合、

-in-memoryテーブルに名前を付け、~
 
 query = (
   streamingCountsDF
     .writeStream
     .format("memory")        # memory = store in-memory table 
     .queryName("counts")     # counts = name of the in-memory table
     .outputMode("complete")  # complete = all the counts should be in the table
     .start()
 )

-「%sql」のマジックコマンドでセレクトする。
 %sql select action, date_format(window.end, "MMM-dd HH:mm") as time, count from counts order by time, action


みたいな方法になる。

**[[EventHubsのKafka>Azure Event Hubsチュートリアル#od841821]]と構造化ストリーミング [#l13d0540]
[[PySparkチュートリアル>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?PySpark]]中の[[構造化ストリーミング>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?PySpark#x623bccd]]の[[入力のKafka化>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?PySpark#yd135245]]ができなかった~
(コンテナのJupyter NotebookからコンテナのKafkaに接続できなかった)ので、

Azure Databricksでリトライ。

***環境準備 [#n3bec3ce]
作成のスクリプトは以下
-送信:[[Azure Event Hubs>Azure Event Hubsチュートリアル#d5ec211f]]
-受信:[[Azure Databricks>#gd9a5060]]

***送受信 [#f5fa0a25]
-[[純正クライアントを使用した送信処理>Azure Event Hubsチュートリアル#saca433a]]

-Azure Databricksで受信する。

--[[Azure DatabricksのCluster・Notebookを作成>#m6c58006]]する。

--[[PySparkチュートリアル中の構造化ストリーミング>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?PySpark#x623bccd]]の~
[[入力部分をKafka化>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?PySpark#yd135245]]したスクリプトを以下に書き出す。
---ただし、[[Event HubsのKafkaエンドポイント風>.NET for Apache Sparkのデータ接続#efb0d878]]に書く。
---パラメタは[[純正クライアントを使用した受信処理>Azure Event Hubsチュートリアル#saca433a]]を参考にする。~
(詳細不明だが、eh_saslの先頭にkafkashadedと言う文字列が必要)
 import sys
 
 from pyspark.sql import SparkSession
 from pyspark.sql.functions import explode
 from pyspark.sql.functions import split
 from pyspark.sql.functions import window
 
 bootstrapServers = "<eventhubsNameSpace>.servicebus.windows.net:9093"
 eh_sasl = 'kafkashaded.org.apache.kafka.common.security.plain.PlainLoginModule required username="$ConnectionString" password="<primaryConnectionString>";'
 
 windowSize = 10
 slideSize  = 10
 if slideSize > windowSize:
     print("<slideSize> must be less than or equal to <windowSize>", file=sys.stderr)
 windowDuration = '{} seconds'.format(windowSize)
 slideDuration = '{} seconds'.format(slideSize)
 
 spark = SparkSession\
     .builder\
     .appName("StructuredNetworkWordCountWindowed")\
     .getOrCreate()
 
 # Create DataFrame representing the stream of input lines from kafka
 lines = spark \
   .readStream \
   .format("kafka") \
   .option("kafka.bootstrap.servers", bootstrapServers) \
   .option("subscribe", "test_topic") \
   .option("kafka.sasl.mechanism", "PLAIN") \
   .option("kafka.security.protocol", "SASL_SSL") \
   .option("kafka.sasl.jaas.config", eh_sasl) \
   .load()
 
 # Split the lines into words, retaining timestamps
 # split() splits each line into an array, and explode() turns the array into multiple rows
 words = lines.select(
     explode(split(lines.value, ' ')).alias('word'),
     lines.timestamp
 )
 
 # Group the data by window and word and compute the count of each group
 windowedCounts = words.groupBy(
     window(words.timestamp, windowDuration, slideDuration),
     words.word
 ).count().orderBy('window')
 
 # Start running the query that prints the windowed word counts to the console
 query = windowedCounts\
     .writeStream\
     .outputMode('complete')\
     .format('console')\
     .option('truncate', 'false')\
     .start()
 
 query.awaitTermination()

-構造化ストリーミングでは(?)、~
consoleへの出力が確認できなかったので、~
インタラクティブにやる場合、

--最後を、以下のように変更し、~
(in-memoryテーブルに名前つけて)
 # Start running the query that prints the windowed word counts to the console
 query = windowedCounts\
     .writeStream\
     .format("memory")\
     .queryName("counts")\
     .outputMode("complete")\
     .start()
 
 # query.awaitTermination()

--%sqlのマジックコマンドでセレクトする。
 %sql select * from counts

**その他 [#x1c99a7c]

***KcMichael - Qiita [#a81fca8a]
[[参考>#j501dd8e]]中の...

***SQL Serverと組み合わせるチュートリアル [#qb0fbdbe]
[[参考>#j501dd8e]]中の「...ノートブックから...SQL Server Linux Docker コンテナーのクエリを実行する」~

**古い? [#g2030b5a]
ちょっと古いのか?アカンやつ。

***Azure Databricksを使ってみた [#hf19908a]
[[参考>#j501dd8e]]中の「Azure Databricksを使ってみた」

...ちと古いし、他にも色々アレなので、パス。

***[[Azure Data Lake]] のチュートリアル [#gffec173]
[[参考>#j501dd8e]]中の

>「チュートリアル:Azure Data Lake Storage Gen2、Azure Databricks、および Spark」

...フライト データのダウンロードができない。

**参考 [#w15adae9]
[[Microsoft Docs>#h5fc34ee]]、[[Qiita>#e44d9b2a]]

*.NET [#q1122d96]
(.NET for Apache Spark)

-[[.NET for Apache SparkガイドのGet started in 10 minutes>.NET for Apache Sparkチュートリアル]]の周辺を処理してみる。

-ビルドしたモノをZIPして、spark-submitするのでローカル環境構築が必要。

**Get started in 10 minutes [#ta98bbdc]
-[[以前開発したサンプルの動作確認を行い>.NET for Apache Sparkチュートリアル#s680c185]]、

-実際に発行&アップロード&実行してみる。

***アプリの発行 [#y0b75f0a]
-ターゲットはubuntu
 >dotnet publish -c Release -f netcoreapp3.1 -r ubuntu.16.04-x64

-publishしたものをpublish.zipにまとめる。~
Windowsなので、[[PowerShell]]を使用してみる。
 powershell compress-archive publish ..\publish.zip

***依存関係のダウンロード [#n418b549]
-依存関係ファイルをダウンロードする。

>※ URL : https://github.com/dotnet/spark/tree/master/deployment

-Microsoft.Spark.Worker~
ローカル実行で使用したものに対応するLinux版の*.tar.gz~
https://github.com/dotnet/spark/releases/download/v1.0.0/Microsoft.Spark.Worker.netcoreapp3.1.linux-x64-1.0.0.tar.gz

-install-worker.sh~
Apache Spark クラスタに Worker バイナリをインストール

-db-init.sh
--ワーカーとアプリの依存関係を Databricks Spark クラスタに インストール。
--DOTNET_SPARK_RELEASEを修正するという手順があるが、コレは不要らしい。

>※ *.shの行の終わりは Unix 形式 (LF) であることを確認~

***ファイルのアップロード [#uee92a05]
次のファイルをアップロードする

-アプリケーション

--一式

---publish.zip~
発行したアプリ

---input.txt~
自分は、input.txtをプロジェクト出力に含めていたのでpublishに同梱されているが、~
カレント・ディレクトリが異なるため別途アップロードが必要らしい(根拠は以下のエラー・メッセージ)。~
 Microsoft.Spark.JvmException: org.apache.spark.sql.AnalysisException: Path does not exist: dbfs:/input.txt;

---microsoft-spark-2-4_2.11-1.0.0.jar~
ローカル実行で使用したもの(publish中で[[使用したバージョン>.NET for Apache Sparkチュートリアル#c8e7248e]])

--dbfsにアップロード~
[[Databricks CLI>#bf24b43b]]を使って。
 databricks fs cp input.txt dbfs:/input.txt
 databricks fs cp publish.zip dbfs:/spark-dotnet/publish.zip
 databricks fs cp microsoft-spark-2-4_2.11-1.0.0.jar dbfs:/spark-dotnet/microsoft-spark-2-4_2.11-1.0.0.jar
※ input.txtがZIPに同梱されていても、カレント・ディレクトリが異なるのでアップロードが必要。

-[[依存関係>#n418b549]]

--[[前述>#n418b549]]の一式

---Microsoft.Spark.Worker
---install-worker.sh
---db-init.sh

--dbfsにアップロード~
[[Databricks CLI>#bf24b43b]]を使って。
 databricks fs cp Microsoft.Spark.Worker.netcoreapp3.1.linux-x64-1.0.0.tar.gz dbfs:/spark-dotnet/Microsoft.Spark.Worker.netcoreapp3.1.linux-x64-1.0.0.tar.gz
 databricks fs cp install-worker.sh dbfs:/spark-dotnet/install-worker.sh
 databricks fs cp db-init.sh dbfs:/spark-dotnet/db-init.sh

-参考
--DBFS CLI-Azure Databricks - Workspace | Microsoft Docs~
https://docs.microsoft.com/ja-jp/azure/databricks/dev-tools/cli/dbfs-cli

***ジョブを作成して実行 [#a1355971]
-ジョブを作成する。~
[[ワークスペース(Databricks のポータル・サイト)>#ye161f29]]の
--左メニュー中の [Job] アイコンを選択し、
--次に[+ Create Job] を選択して、Job名を入力、

--以下、UIが変更されているので、以下を参考にする。
---ジョブ - Azure Databricks | Microsoft Docs~
https://docs.microsoft.com/ja-jp/azure/databricks/jobs

-spark-submitの構成~
初めに、[Task]の[Type]を[[[Notebook>#je91701c]]]から[Spark Submit]に変更する。

-クラスタ構成の設定~
次に、Clusterの[Edit]を選択し、Configure New Clusterを表示させる。

--Databricks Runtime Versionを選択
---Spark 2.4.1が無かったので、最も近い、
---Runtime: 5.5 LTS (Scala 2.11, Spark 2.4.3)に変更。

--Initスクリプトを db-init.sh に設定
---Advanced optionsを展開する。
---[Init Scripts]タブを選択する。
---[Destination]ドロップダウンリストでDBFSを選択する。
---[Init Script Path]に以下を入力する。
 dbfs:/spark-dotnet/db-init.sh
---[Confirm]を押下する。

>※ コレにより、db-init.sh 内で install-worker.sh が構成される($1-3をパラメタライズ)。

-パラメタの設定~
--パラメタに次の文字列を貼り付ける。
 ["--class","org.apache.spark.deploy.dotnet.DotnetRunner","/dbfs/spark-dotnet/microsoft-spark-2-4_2.11-1.0.0.jar","/dbfs/spark-dotnet/publish.zip","mySparkApp"]

--自分は、

---mySparkApp → MySparkApp としていたので、その様に変更した。

---[[ 実行に必要となる引数>.NET for Apache Sparkチュートリアル#s680c185]]が存在する場合、spark-submitでは、以下のように指定できる模様。
>.NET for Apache Spark ジョブを Databricks に送信する | Microsoft Docs~
https://docs.microsoft.com/ja-jp/dotnet/spark/how-to-guides/databricks-deploy-methods

---...と言う事で、実際、パラメタには、次の文字列を貼り付けた。
 ["--class","org.apache.spark.deploy.dotnet.DotnetRunner","/dbfs/spark-dotnet/microsoft-spark-2-4_2.11-1.0.0.jar","/dbfs/spark-dotnet/publish.zip","MySparkApp", "input.txt"]

--[Create]を押下する。

-アプリの実行~

--ここで、[[Initスクリプト>#a1355971]]が実行される。

--ジョブのクラスタが作成されるまで数分かかる。~
(リソース・グループを確認するとクラスタのリソース増が確認できる)

--Job名の横にある [Run Now] ボタンをクリックする。

--Jobで構成した Spark クラスタでJobが実行される。

--実行結果は、Completed Runs表中のSpark列に表示されるLogsから確認できる。
#ref(無題2.png,left,nowrap,実行の結果,70%)

-リソースのクリーンアップ
--リソース・グループを確認するとクラスタのリソース減が確認できる
--必要に応じて、(ワークスペースとクラスタの)リソース・グループを削除する。

***参考 [#h06a7649]
-[[Azure HDInsightとの比較>Azure HDInsight#n2b1fb3a]]~
>[[クラスタの作成中のdb-init.sh 設定+アプリの実行>#a1355971]]
>≒ [[スクリプト アクション実行>Azure HDInsight#y790895b]]

-エラー

--1~
[[Azureのクォータ]]制限を解除する。

---Cluster:~
 Driver: Standard_DS3_v2,
 Workers: Standard_DS3_v2,
 8 workers, 5.5 LTS (includes Apache Spark 2.4.3, Scala 2.11)

---Message:~
 Unexpected failure while waiting for the cluster (...) to be ready.
 Cause Unexpected state for cluster (...):
 AZURE_QUOTA_EXCEEDED_EXCEPTION(CLIENT_ERROR):~
 azure_error_code : QuotaExceeded,~
 azure_error_message :
   Operation could not be completed as it results in exceeding approved Total Regional Cores quota.
   Additional details -
   Deployment Model: Resource Manager,
   Location: japaneast,
   Current Limit: 10,
   Current Usage: 4,
   Additional Required: 28,
   (Minimum) New Limit Required: 32.
   Submit a request for Quota increase at
   https://aka.ms/ProdportalCRP/?#create/Microsoft.Support/Parameters/%7B%22subId%22:%2232e43be6-1930-4982-a62c-a259327e5c77%22,%22pesId%22:%2206bfd9d3-516b-d5c6-5802-169c800dec89%22,%22supportTopicId%22:%22e12e3d1d-7fa0-af33-c6d0-3c50df9658a3%22%7D
   by specifying parameters listed in the 'Details' section for deployment to succeed.
   Pleas ... ***WARNING: message truncated. Skipped 964 bytes of output**

---クォータ制限を解除する。~
以下のクォータを32に設定する。~
・Total Regional vCPUsのクォータ~
・Standard_DS3_v2 → DSv2 シリーズ(Standard DSv2 Promo Family vCPUs)のクォータ

--2~
input.txtの扱いについて、

---[[ZIP同梱していても、別途アップロードが必要になる。>#uee92a05]]
---[[また、コマンド引数でファイル名を渡している場合、spark-submitのパラメタで設定可能。>#a1355971]]

**上記と同様に行ってみる例 [#m420e622]
ワークスペースをクリーンナップするか新規作成する必要があるので、~
1つのバッチにまとめて、コマンドライン引数で切り替えるのが良いかも。

***[[バッチ処理>.NET for Apache Sparkチュートリアル#l7b4829d]] [#o0543855]
-アプリ
--publish.zipの発行とアップロード
 cd ...\DotNet4ApacheSpark\mySparkBatchApp\mySparkBatchApp
 dotnet publish -c Release -f netcoreapp3.1 -r ubuntu.16.04-x64
 cd ...\mySparkBatchApp\bin\Release\netcoreapp3.1\ubuntu.16.04-x64
 powershell compress-archive publish ..\publish.zip
 cd ..
 databricks fs rm dbfs:/spark-dotnet/publish.zip
 databricks fs cp publish.zip dbfs:/spark-dotnet/publish.zip

--projects_smaller.csvのアップロード
 databricks fs cp projects_smaller.csv dbfs:/projects_smaller.csv

-spark-submitのパラメタ設定
 ["--class","org.apache.spark.deploy.dotnet.DotnetRunner","/dbfs/spark-dotnet/microsoft-spark-2-4_2.11-1.0.0.jar","/dbfs/spark-dotnet/publish.zip","mySparkBatchApp", "projects_smaller.csv"]

-エラー~
何故か、最後のDataFrame.Showでエラーになって~
4つ目の結果セットが表示されなかった(原因不明)。

***[[構造化ストリーミング>.NET for Apache Sparkチュートリアル#v2288c2e]] [#qfa6d3c7]
未実施

***[[ML.NETでの感情分析>.NET for Apache Sparkチュートリアル#bb5afcf2]] [#p0da09b0]
未実施

*Java [#re2bf642]
可能らしいがサンプルが無いのは、[[Scala>#m5f129dc]]でやるから?

**... [#ab4244b8]

*参考 [#j501dd8e]
-Azure Databricksを使ってみた – ナレコムAzureレシピ | AIに強い情報サイト~
https://azure-recipe.kc-cloud.jp/2018/08/azure-databricks/

**databricks.com [#k666624d]
Apache Spark チュートリアル: Apache Spark チュートリアルを開始する~

-はじめに~
https://databricks.com/jp/spark/getting-started-with-apache-spark
-クイックスタート~
https://databricks.com/jp/spark/getting-started-with-apache-spark/quick-start
-DATAFRAME~
https://databricks.com/jp/spark/getting-started-with-apache-spark/dataframes
-DATASET~
https://databricks.com/jp/spark/getting-started-with-apache-spark/datasets
-機械学習~
https://databricks.com/jp/spark/getting-started-with-apache-spark/machine-learning
-ストリーミング~
https://databricks.com/jp/spark/getting-started-with-apache-spark/streaming
-次のステップ~
https://databricks.com/jp/spark/getting-started-with-apache-spark/whats-next

**microsoft.com [#bbd920d1]

***Scala [#y4d4dbfd]
-チュートリアル

--Azure Databricks を使用してデータの抽出、変換、読み込みを行う~
https://docs.microsoft.com/ja-jp/azure/databricks/scenarios/databricks-extract-load-sql-data-warehouse

--Event Hubs を使用してデータを Azure Databricks にストリーム配信する~
https://docs.microsoft.com/ja-jp/azure/databricks/scenarios/databricks-stream-from-eventhubs

--Azure Databricks を使用したストリーミング データに対する感情分析~
https://docs.microsoft.com/ja-jp/azure/databricks/scenarios/databricks-sentiment-analysis-cognitive-services

***Python (PySpark) [#h5fc34ee]
-クイック スタート

--Azure portal を使用して Azure Databricks ワークスペースで Spark ジョブを実行する~
https://docs.microsoft.com/ja-jp/azure/databricks/scenarios/quickstart-create-databricks-workspace-portal

--PowerShell を使用して Azure Databricks ワークスペースを作成する~
https://docs.microsoft.com/ja-jp/azure/databricks/scenarios/quickstart-create-databricks-workspace-powershell

-チュートリアル
--Azure Databricks ノートブックから~
仮想ネットワーク内の SQL Server Linux Docker コンテナーのクエリを実行する~
https://docs.microsoft.com/ja-jp/azure/databricks/scenarios/vnet-injection-sql-server
--Azure Data Lake Storage Gen2、Azure Databricks、および Spark~
https://docs.microsoft.com/ja-jp/azure/storage/blobs/data-lake-storage-use-databricks-spark

***Getting Started [#a53c1d8d]
-Azure Databricks - Workspace > Apache Spark の概要~
https://docs.microsoft.com/ja-jp/azure/databricks/getting-started/spark/

--Apache Spark を使ってみる~
https://docs.microsoft.com/ja-jp/azure/databricks/getting-started/spark/quick-start
--DataFrames のチュートリアル~
https://docs.microsoft.com/ja-jp/azure/databricks/getting-started/spark/dataframes
--Datasets のチュートリアル~
https://docs.microsoft.com/ja-jp/azure/databricks/getting-started/spark/datasets
--MLlib を使用した機械学習のチュートリアル~
https://docs.microsoft.com/ja-jp/azure/databricks/getting-started/spark/machine-learning
--[[構造化ストリーミングのチュートリアル>#ib347719]]

***Perform Data Science - Learn [#o3f4dbe8]

-Azure Databricks を使用してデータ サイエンスを実行する~
https://docs.microsoft.com/ja-jp/learn/paths/perform-data-science-azure-databricks/

--Azure Databricks の説明~
https://docs.microsoft.com/ja-jp/learn/modules/describe-azure-databricks/
---Azure Databricks について説明する
---ワークスペースとクラスターを作成する
---ノートブックを理解する
---演習: ノートブックを操作する

--Spark アーキテクチャの基礎~
https://docs.microsoft.com/ja-jp/learn/modules/spark-architecture-fundamentals/
---Azure Databricks の Spark クラスターのアーキテクチャについて理解する
---Spark ジョブのアーキテクチャについて理解する

--Azure Databricks でデータの読み取りと書き込みを行う~
https://docs.microsoft.com/ja-jp/learn/modules/read-write-data-azure-databricks/
---CSV 形式でデータを読み取る
---JSON 形式でデータを読み取る
---Parquet 形式でデータを読み取る
---テーブルとビューに格納されているデータを読み取る
---データを書き込む
---演習: データの読み取りと書き込みを行う

--Azure Databricks でデータフレームを操作する~
https://docs.microsoft.com/ja-jp/learn/modules/work-dataframes-azure-databricks/
---データフレームについて説明する
---一般的なデータフレーム メソッドを使用する
---display 関数を使用する
---演習: 個別の記事

--ユーザー定義関数を操作する~
https://docs.microsoft.com/ja-jp/learn/modules/work-with-user-defined-functions/
---ユーザー定義関数を作成する
---演習: ユーザー定義関数を使用したETL操作を実行する

--Delta Lake の構築とクエリ~
https://docs.microsoft.com/ja-jp/learn/modules/build-query-delta-lake/
---オープンソースの Delta Lake の説明
---演習: 基本的な Delta Lake 機能の使用
---Azure Databricks によって Delta Lake を管理する方法についての説明
---演習: Delta Lake Time Machine を使用して最適化を実行する

--Azure Databricks を使用した機械学習の実行~
https://docs.microsoft.com/ja-jp/learn/modules/perform-machine-learning-with-azure-databricks/
---機械学習を理解する
---演習: モデルをトレーニングし、予測を作成する
---探索的データ分析を使用してデータを理解する
---演習: 探索的データ分析を実行する
---機械学習ワークフローについて説明する
---演習: 機械学習のベースライン モデルを構築して評価する

--機械学習モデルのトレーニング~
https://docs.microsoft.com/ja-jp/learn/modules/train-machine-learning-model/
---データセットの特徴量化を実行する
---演習: データセットの特徴量化を終了する
---回帰モデリングを理解する
---演習: 回帰モデルを構築して解釈する

--Azure Databricks で MLflow を操作する~
https://docs.microsoft.com/ja-jp/learn/modules/work-with-mlflow-azure-databricks/
---MLflow を使用して実験を追跡し、メトリックをログ記録し、実行を比較する
---演習: MLflow を操作して、実験のメトリック、パラメーター、成果物、モデルを追跡する

--ハイパーパラメーターのチューニングによるモデル選択の実行~
https://docs.microsoft.com/ja-jp/learn/modules/perform-model-selection-with-hyperparameter-tuning/
---モデルの選択とハイパーパラメーターのチューニングについての説明
---演習: ハイパーパラメーターをチューニングして最適なモデルを選択する

--分散型トレーニングのための Horovod によるディープ ラーニング~
https://docs.microsoft.com/ja-jp/learn/modules/deep-learning-with-horovod-distributed-training/
---Horovod を使用してディープ ラーニング モデルをトレーニングする
---Petastorm を使用して、分散型モデル トレーニング用に Horovod で Apache Parquet 形式のデータセットを読み取る
---演習: ディープ ラーニング モデルをトレーニングするために Horovod と Petastorm を使用する

--[[Azure Machine Learning を操作してサービス モデルをデプロイする>#ybe88a83]]

***構造化ストリーミング [#ib347719]
-構造化ストリーミング~
https://docs.microsoft.com/ja-jp/azure/databricks/spark/latest/structured-streaming/
--デモ ノートブック~
https://docs.microsoft.com/ja-jp/azure/databricks/spark/latest/structured-streaming/demo-notebooks
--運用環境での構造化ストリーミング~
https://docs.microsoft.com/ja-jp/azure/databricks/spark/latest/structured-streaming/production
--構造化ストリーミングの例~
https://docs.microsoft.com/ja-jp/azure/databricks/spark/latest/structured-streaming/examples

-チュートリアル~
https://docs.microsoft.com/ja-jp/azure/databricks/getting-started/spark/streaming
--デモ Scalaノートブック~
https://docs.microsoft.com/ja-jp/azure/databricks/_static/notebooks/structured-streaming-scala.html
--デモ Pythonノートブック~
https://docs.microsoft.com/ja-jp/azure/databricks/_static/notebooks/structured-streaming-python.html

***Azure Machine Learning [#ybe88a83]
-Azure Machine Learning を操作してサービス モデルをデプロイする~
https://docs.microsoft.com/ja-jp/learn/modules/work-with-azure-machine-learning-deploy-serving-models/

-AutoML と Azure Databricks を使用して開発する~
https://docs.microsoft.com/ja-jp/azure/machine-learning/how-to-configure-databricks-automl-environment

**Qiita [#pba8f8ab]

***Scala [#g377cc6b]

***Python (PySpark) [#e44d9b2a]
-KcMichael~
https://qiita.com/KcMichael
--Azure Databricks:
---1. リソースの作成~
https://qiita.com/KcMichael/items/eb17285a46bda68f9c64
---2. Databricksの基本事項~
https://qiita.com/KcMichael/items/34902eedf9270059c041
---3-1. DBFSにBlob Storageをマウント~
https://qiita.com/KcMichael/items/8f5c8a3f97df31769f11
---3-2. DBFSにAzure Data Lake Storage Gen2をマウント~
https://qiita.com/KcMichael/items/98493d2e9bb3eb3f12db
---4. PySpark基本操作~
https://qiita.com/KcMichael/items/8b1d51ac0e9f64633853

----
Tags: [[:クラウド]], [[:ビッグデータ]], [[:Azure]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS