From 51acbb1bd6495305cc306ce984fb92a3aa9fbf0b Mon Sep 17 00:00:00 2001 From: Lace Lofranco Date: Wed, 9 Oct 2024 14:17:44 +1000 Subject: [PATCH] Add to archive Single tech/databricks all in one (#755) * add sample5 databricks (#387) * add sample5 databricks Co-authored-by: ssattiraju * add to archive databricks all in one --------- Co-authored-by: Sunil Sattiraju Co-authored-by: ssattiraju --- .../databricks_all_in_one/.gitignore | 391 ++ .../databricks_all_in_one/Architecture.jpg | Bin 0 -> 386271 bytes .../databricks_all_in_one/README.md | 136 + .../aks/aks-for-aml.template.bicep | 39 + .../aks/standalone-aks.template.bicep | 43 + .../aml/machinelearning.template.bicep | 89 + .../databricks_all_in_one/azuredeploy.json | 4074 +++++++++++++++++ .../azuredeploy.parameters.json | 121 + .../databricks_all_in_one/build.sh | 34 + .../databricks/deployment.template.bicep | 248 + .../databricks/deployment/create_cluster.sh | 57 + .../databricks/deployment/create_pat.sh | 16 + .../deployment/create_secret_scope.sh | 65 + .../deployment/post_cluster_create.sh | 55 + .../deployment/pre_cluster_create.sh | 71 + .../init_scripts/capture_log_metrics.sh | 153 + ...isteners-loganalytics_3.0.1_2.12-1.0.0.jar | Bin 0 -> 51809 bytes .../jars/spark-listeners_3.0.1_2.12-1.0.0.jar | Bin 0 -> 150667 bytes .../notebooks/azure_runner_docs_example.ipynb | 1 + .../databricks/notebooks/test-notebook.ipynb | 1 + .../databricks/notebooks/timezone_test.ipynb | 1 + .../databricks/workspace.template.bicep | 56 + .../keyvault/keyvault.template.bicep | 72 + .../keyvault/keyvaultsecrets.template.bicep | 68 + .../databricks_all_in_one/main.bicep | 339 ++ .../monitor/eventhub.template.bicep | 59 + .../monitor/loganalytics.template.bicep | 214 + .../network/firewall.template.bicep | 411 ++ .../network/privateendpoint.template.bicep | 460 ++ .../network/routetable.template.bicep | 14 + .../routetableFirewallRoute.template.bicep | 12 + .../network/securitygroup.template.bicep | 100 + .../network/vnet.template.bicep | 219 + .../other/clientdevice.template.bicep | 97 + .../other/managedIdentity.template.bicep | 26 + .../scripts/enabled-monitoring.sh | 13 + .../storage/storageaccount.template.bicep | 81 + 37 files changed, 7836 insertions(+) create mode 100644 archive/single_tech_samples/databricks_all_in_one/.gitignore create mode 100644 archive/single_tech_samples/databricks_all_in_one/Architecture.jpg create mode 100644 archive/single_tech_samples/databricks_all_in_one/README.md create mode 100644 archive/single_tech_samples/databricks_all_in_one/aks/aks-for-aml.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/aks/standalone-aks.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/aml/machinelearning.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/azuredeploy.json create mode 100644 archive/single_tech_samples/databricks_all_in_one/azuredeploy.parameters.json create mode 100644 archive/single_tech_samples/databricks_all_in_one/build.sh create mode 100644 archive/single_tech_samples/databricks_all_in_one/databricks/deployment.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/databricks/deployment/create_cluster.sh create mode 100644 archive/single_tech_samples/databricks_all_in_one/databricks/deployment/create_pat.sh create mode 100644 archive/single_tech_samples/databricks_all_in_one/databricks/deployment/create_secret_scope.sh create mode 100644 archive/single_tech_samples/databricks_all_in_one/databricks/deployment/post_cluster_create.sh create mode 100644 archive/single_tech_samples/databricks_all_in_one/databricks/deployment/pre_cluster_create.sh create mode 100644 archive/single_tech_samples/databricks_all_in_one/databricks/init_scripts/capture_log_metrics.sh create mode 100644 archive/single_tech_samples/databricks_all_in_one/databricks/jars/spark-listeners-loganalytics_3.0.1_2.12-1.0.0.jar create mode 100644 archive/single_tech_samples/databricks_all_in_one/databricks/jars/spark-listeners_3.0.1_2.12-1.0.0.jar create mode 100644 archive/single_tech_samples/databricks_all_in_one/databricks/notebooks/azure_runner_docs_example.ipynb create mode 100644 archive/single_tech_samples/databricks_all_in_one/databricks/notebooks/test-notebook.ipynb create mode 100644 archive/single_tech_samples/databricks_all_in_one/databricks/notebooks/timezone_test.ipynb create mode 100644 archive/single_tech_samples/databricks_all_in_one/databricks/workspace.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/keyvault/keyvault.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/keyvault/keyvaultsecrets.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/main.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/monitor/eventhub.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/monitor/loganalytics.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/network/firewall.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/network/privateendpoint.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/network/routetable.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/network/routetableFirewallRoute.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/network/securitygroup.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/network/vnet.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/other/clientdevice.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/other/managedIdentity.template.bicep create mode 100644 archive/single_tech_samples/databricks_all_in_one/scripts/enabled-monitoring.sh create mode 100644 archive/single_tech_samples/databricks_all_in_one/storage/storageaccount.template.bicep diff --git a/archive/single_tech_samples/databricks_all_in_one/.gitignore b/archive/single_tech_samples/databricks_all_in_one/.gitignore new file mode 100644 index 000000000..c70c44dea --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/.gitignore @@ -0,0 +1,391 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Nuget personal access tokens and Credentials +nuget.config + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +.idea/ +*.sln.iml + +# remove output.json +output.json \ No newline at end of file diff --git a/archive/single_tech_samples/databricks_all_in_one/Architecture.jpg b/archive/single_tech_samples/databricks_all_in_one/Architecture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..594a3286524f34b7bb299503d392a598a8496597 GIT binary patch literal 386271 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�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 x*a39I4nvO=|+43!;+ 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�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 literal 0 HcmV?d00001 diff --git a/archive/single_tech_samples/databricks_all_in_one/README.md b/archive/single_tech_samples/databricks_all_in_one/README.md new file mode 100644 index 000000000..f39d080c4 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/README.md @@ -0,0 +1,136 @@ +# Deploying secure Databricks cluster with Data exfiltration Protection and Privatelink for Storage, KeyVault and EventHub using Bicep
+ +## Contents + +- [1. Solution Overview](#1-solution-overview) + - [1.1. Scope](#11-scope) + - [1.2. Why Bicep](#12-why-bicep) + - [1.3. Architecture](#13-architecture) + - [1.4. Technologies used](#14-technologies-used) +- [2. How to use this sample](#2-how-to-use-this-sample) + - [2.1. Prerequisites](#21-prerequisites) + - [2.1.1. Client PC password](#211-client-pc-password) + - [2.2 Deploy Options](#22-deploy-options) + - [2.2.1 Option 1](#221-option-1) + - [2.2.2 Option 2](#222-options-2) +- [3. Support](#3-support) +- [4. References](#4-references) +- [5. Next Steps](#5-next-steps) + +## 1. Solution Overview + +In this sample we are extending [sample2_enterprise_azure_datarbicks_environment](https://github.com/Azure-Samples/modern-data-warehouse-dataops/tree/single-tech/databricks_all_in_one/single_tech_samples/databricks/sample2_enterprise_azure_databricks_environment) with other services to cover the ML deployment scenarious and address operational challenges using Bicep + +### 1.1 Scope + +The scope of this sample is to show how to create a secure databricks cluster with Data exfiltration Protection and Privatelink for services using Bicep. + +- Firewall with UDR to allow only required Databricks endpoints. [Link](https://docs.microsoft.com/en-us/azure/virtual-network/manage-network-security-group) +- Storage account with Private endpoint. [Link](https://docs.microsoft.com/en-us/azure/storage/common/storage-private-endpoints) +- Azure Key Vault with Private endpoint. [Link](https://docs.microsoft.com/en-us/azure/private-link/private-endpoint-overview) +- Create Databricks backed secret scope. +- Azure Event Hub with Private endpoint. [Link](https://docs.microsoft.com/en-us/azure/event-hubs/private-link-service) +- Create cluster with cluster logging and init script for monitoring.[Link](https://docs.microsoft.com/en-us/azure/databricks/clusters/init-scripts) +- Sample Databricks notebooks into workspace. +- Secured Windows Virtual machine with RDP (Protect data from export).[Link] +- Configure Log analytics workspace and collect metrics from spark worker node + - Configure Diagnostic logging.[Link](https://docs.microsoft.com/en-us/azure/databricks/administration-guide/account-settings/azure-diagnostic-logs) + - Configure sending logs to Azure Monitor using [mspnp/spark-monitoring](https://github.com/mspnp/spark-monitoring) + - Configure overwatch for fine grained monitoring. [Link](https://databrickslabs.github.io/overwatch/) +- Create Azure ML workspace for Model registry and assist in deploying model to AKS +- Create AKS compute for AML for real time model inference/scoring + +### 1.2 Why Bicep? + +Bicep is free and supported by Microsoft support and is fun, easy, and productive way to build and deploy complex infrastructure on Azure. If you are currently using ARM you will love Bicep simple syntax. Bicep also support [declaring existing resources](https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/resource-declaration?tabs=azure-powershell#reference-existing-resources). +More resources available at this [Link](https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview#benefits-of-bicep-versus-other-tools) + +### 1.3 Architecture + +![Architecture](https://raw.githubusercontent.com/lordlinus/databricks-all-in-one-bicep-template/main/Architecture.jpg) + +- Based on best practices [Link](https://github.com/Azure/AzureDatabricksBestPractices/blob/master/toc.md) +- Azure Databricks Best Practices and template from [sample2_enterprise_azure_databricks_environment](https://github.com/Azure-Samples/modern-data-warehouse-dataops/tree/main/single_tech_samples/databricks/sample2_enterprise_azure_databricks_environment) Anti-Data-Exfiltration Reference architecture + +### 1.4 Technologies used + +- [Azure Databricks](https://azure.microsoft.com/en-au/free/databricks/) + +- [Azure Storage](https://azure.microsoft.com/en-au/services/storage/data-lake-storage/) +- [Azure Key Vault](https://azure.microsoft.com/en-au/services/key-vault/) +- [Azure Virtual networks](https://docs.microsoft.com/en-us/azure/virtual-network/virtual-networks-overview) +- [Azure Firewall](https://docs.microsoft.com/en-us/azure/firewall/overview) +- [Azure Route tables](https://docs.microsoft.com/en-us/azure/virtual-network/manage-route-table) +- [Azure Public IP](https://docs.microsoft.com/en-us/azure/virtual-network/public-ip-addresses) +- [Azure Private Links](https://docs.microsoft.com/en-us/azure/private-link/private-link-overview) +- [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/) +- [Azure Resource Manager](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/overview) + +## 2. How to use this sample + +To clone and run this repo, you'll need [Git](https://git-scm.com), [Bicep](https://github.com/Azure/bicep/blob/main/docs/installing.md) and [azure-cli](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) installed on your computer. Strongly recommend to use vs code to edit the file with bicep extension installed ([instructions](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-bicep)) for intellisense and other completions. +From your command line: + +### 2.1 Prerequisites + +- Managed Identity needs to be enabled as a resource provider inside Azure + +- For the bash script, `jq` must be installed. + +### 2.1.1 Client PC password + +- Client PC password complexity requirements: +The supplied password must be between 8-123 characters long and must satisfy at least 3 of password complexity requirements from the following: + - Contains an uppercase character + - Contains a lowercase character + - Contains a numeric digit + - Contains a special character + - Control characters are not allowed + +### 2.2.1 Option 1 + +[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Flordlinus%2Fdatabricks-all-in-one-bicep-template%2Fmain%2Fazuredeploy.json) + +Click on the above link to deploy the template. + +### 2.2.2 Option 2 + +If you need to customize the template you can use the following command: + +```bash +# Clone this repository +$ git clone https://github.com/Azure-Samples/modern-data-warehouse-dataops.git + +# Go into the repository +$ cd modern-data-warehouse-dataops/single_tech_samples/databricks/sample5_databricks_all_in_one + +# Update main.bicep file with variables as required. Default is for southeastasia region. +# Refer to Azure Databricks UDR section under References for region specific parameters. +$ code main.bicep + +# Run the build shell script to create the resources +$ ./build.sh +``` + +Note: Build script assume Linux environment, If you're using Windows, [see this guide](https://docs.microsoft.com/en-us/windows/wsl/install-win10) on running Linux + +### 2.4 Support + +This repo code is provided as-is and if you need help/support on bicep reach out to Azure support team (Bicep is supported by Microsoft support and 100% free to use.) + +### 2.5 Reference + +- [Bicep Language Spec](https://github.com/Azure/bicep/blob/main/docs/spec/bicep.md) +- [Azure Databricks UDR](https://docs.microsoft.com/en-us/azure/databricks/administration-guide/cloud-configurations/azure/udr) + +## 3 Next Steps + +- Create Databricks secret scope backed by Azure Key Vault. [Link](https://docs.microsoft.com/en-us/azure/databricks/security/secrets/secret-scopes) +- Create Azure SQL with Private link +- Create an integrated ADF pipeline +- Integrate into Azure DevOps +- Create Databricks performance dashboards +- Create and configure External metastore +- Configure Databricks access to specific IP only +- More sample Databricks notebooks +- Add description to all parameters diff --git a/archive/single_tech_samples/databricks_all_in_one/aks/aks-for-aml.template.bicep b/archive/single_tech_samples/databricks_all_in_one/aks/aks-for-aml.template.bicep new file mode 100644 index 000000000..5e84f5fdf --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/aks/aks-for-aml.template.bicep @@ -0,0 +1,39 @@ +param amlWorkspaceName string +param sslLeafName string +param aksAgentCount int +param aksAgentVMSize string +param aksAmlComputeName string +param aksSubnetId string +param identity string + +resource amlAks 'Microsoft.MachineLearningServices/workspaces/computes@2021-07-01' = { + name: '${amlWorkspaceName}/${aksAmlComputeName}' + location: resourceGroup().location + identity: { + type: 'UserAssigned' + userAssignedIdentities:{ + '${identity}' : {} + } + } + properties:{ + computeType: 'AKS' + computeLocation: resourceGroup().location + description: 'AKS cluster to provide inference REST endpoint' + properties: { + loadBalancerType:'PublicIp' + agentCount: aksAgentCount + agentVmSize:aksAgentVMSize + aksNetworkingConfiguration:{ + dnsServiceIP:'10.179.128.10' + serviceCidr:'192.168.0.0/24' + dockerBridgeCidr: '172.17.0.1/16' + subnetId: aksSubnetId + } + clusterPurpose:'FastProd' + sslConfiguration:{ + leafDomainLabel: sslLeafName + status: 'Auto' + } + } + } +} diff --git a/archive/single_tech_samples/databricks_all_in_one/aks/standalone-aks.template.bicep b/archive/single_tech_samples/databricks_all_in_one/aks/standalone-aks.template.bicep new file mode 100644 index 000000000..e0e0a41b8 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/aks/standalone-aks.template.bicep @@ -0,0 +1,43 @@ +// param amlWorkspaceName string +param aksAgentCount int +param aksAgentVMSize string +param aksSubnetId string +param dnsPrefix string +param maxPods int = 110 +@description('The name of the Managed Cluster resource.') +param clusterName string +param location string = resourceGroup().location + +resource AksCluster 'Microsoft.ContainerService/managedClusters@2021-07-01' = { + name: clusterName + location: location + identity: { + type: 'SystemAssigned' // Require this to be systemassigned + } + properties: { + dnsPrefix: dnsPrefix + networkProfile: { + networkPlugin: 'kubenet' + loadBalancerSku: 'standard' + dnsServiceIP: '10.0.0.10' //default service CIDR is 10.0.0.0/16 + dockerBridgeCidr: '172.17.0.1/16' + podCidr: '10.244.0.0/16' + } + agentPoolProfiles: [ + { + name: 'agentpool' + count: aksAgentCount + vmSize: aksAgentVMSize + type: 'VirtualMachineScaleSets' + mode: 'System' + osType: 'Linux' + vnetSubnetID: aksSubnetId + maxPods: maxPods + } + ] + nodeResourceGroup: 'MC_${resourceGroup().name}_${clusterName}_${location}' + } +} + +output aksClusterResourceId string = AksCluster.id +output kubeletidentity string = AksCluster.properties.identityProfile.kubeletidentity.objectId diff --git a/archive/single_tech_samples/databricks_all_in_one/aml/machinelearning.template.bicep b/archive/single_tech_samples/databricks_all_in_one/aml/machinelearning.template.bicep new file mode 100644 index 000000000..af5b23a11 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/aml/machinelearning.template.bicep @@ -0,0 +1,89 @@ +param keyVaultIdentifierId string +param storageAccount string +param amlWorkspaceName string +param containerRegistryName string +param applicationInsightsName string +// param identity string +param aksClusterPrincipleId string +param aksAmlComputeName string +param aksClusterId string +param sslLeafName string +param linkAkstoAml bool +// https://docs.microsoft.com/en-us/azure/role-based-access-control/built-in-roles#acrpull +var acrPullRoleDefId = '7f951dda-4ed3-4680-a7ca-43fe172d538d' +var location = resourceGroup().location + +resource ctrRegistry 'Microsoft.ContainerRegistry/registries@2021-06-01-preview' = { + name: containerRegistryName + location: location + sku: { + name: 'Premium' + } + properties: { + anonymousPullEnabled: false + dataEndpointEnabled: true + adminUserEnabled: true + publicNetworkAccess: 'Enabled' + networkRuleBypassOptions: 'AzureServices' + } +} + +resource aksRoleAssignmentToAcr 'Microsoft.Authorization/roleAssignments@2020-08-01-preview' = { + scope: ctrRegistry + name: aksClusterPrincipleId + properties: { + principalId: aksClusterPrincipleId + roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', acrPullRoleDefId) + } +} + +resource applicationInsightsName_resource 'Microsoft.Insights/components@2018-05-01-preview' = { + name: applicationInsightsName + location: location + kind: 'web' + properties: { + Application_Type: 'web' + } +} + +resource aml 'Microsoft.MachineLearningServices/workspaces@2021-04-01' = { + name: amlWorkspaceName + location: location + identity: { + type: 'SystemAssigned' + } + properties: { + friendlyName: amlWorkspaceName + storageAccount: storageAccount + keyVault: keyVaultIdentifierId + applicationInsights: applicationInsightsName_resource.id + containerRegistry: ctrRegistry.id + allowPublicAccessWhenBehindVnet: true + } +} + +resource standaloneAks 'Microsoft.MachineLearningServices/workspaces/computes@2021-07-01' = if (linkAkstoAml) { + parent: aml + name: aksAmlComputeName + location: location + properties: { + computeType: 'AKS' + computeLocation: location + resourceId: aksClusterId + description: 'External AKS cluster to provide inference REST endpoint' + properties: { + clusterPurpose: 'FastProd' + sslConfiguration: { + status: 'Auto' + leafDomainLabel: sslLeafName + overwriteExistingDomain: true + } + } + } +} + +output amlId string = aml.id +output amlWkspName string = amlWorkspaceName +output amlProperties object = aml.properties +output ctrRegistryName string = ctrRegistry.name +output ctrRegistryId string = ctrRegistry.id diff --git a/archive/single_tech_samples/databricks_all_in_one/azuredeploy.json b/archive/single_tech_samples/databricks_all_in_one/azuredeploy.json new file mode 100644 index 000000000..0a5c4b6ca --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/azuredeploy.json @@ -0,0 +1,4074 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "13503021382899524313" + } + }, + "parameters": { + "prefix": { + "type": "string", + "defaultValue": "sri", + "metadata": { + "description": "2-4 chars to prefix the Azure resources, NOTE: no number or symbols" + }, + "maxLength": 4, + "minLength": 2 + }, + "adminUsername": { + "type": "string", + "metadata": { + "description": "Client PC username, NOTE: do not use admin" + } + }, + "adminPassword": { + "type": "secureString", + "minLength": 8, + "metadata": { + "description": "Client PC password, with atleast 8 char length containing uppercase, digits and special characters " + } + }, + "linkAkstoAml": { + "type": "bool", + "defaultValue": true + }, + "deployADBCluster": { + "type": "bool", + "defaultValue": true + }, + "updateAKVKeys": { + "type": "bool", + "defaultValue": true + }, + "adb_pat_lifetime": { + "type": "string", + "defaultValue": "3600" + }, + "adb_cluster_name": { + "type": "string", + "defaultValue": "test-cluster-01" + }, + "adb_spark_version": { + "type": "string", + "defaultValue": "7.3.x-scala2.12" + }, + "adb_node_type": { + "type": "string", + "defaultValue": "Standard_D3_v2" + }, + "adb_num_worker": { + "type": "string", + "defaultValue": "3" + }, + "adb_auto_terminate_min": { + "type": "string", + "defaultValue": "30" + }, + "aksAgentCount": { + "type": "int", + "defaultValue": 3, + "maxValue": 50, + "minValue": 3, + "metadata": { + "description": "The number of nodes for the cluster." + } + }, + "aksAgentVMSize": { + "type": "string", + "defaultValue": "Standard_A4_v2", + "metadata": { + "description": "The size of the VM instances" + } + }, + "location": { + "type": "string", + "defaultValue": "southeastasia", + "metadata": { + "description": "Default location of the resources" + } + }, + "hubVnetName": { + "type": "string", + "defaultValue": "hubvnet", + "metadata": { + "description": "" + } + }, + "spokeVnetName": { + "type": "string", + "defaultValue": "spokevnet", + "metadata": { + "description": "" + } + }, + "HubVnetCidr": { + "type": "string", + "defaultValue": "10.0.0.0/16", + "metadata": { + "description": "" + } + }, + "FirewallSubnetCidr": { + "type": "string", + "defaultValue": "10.0.1.0/26", + "metadata": { + "description": "" + } + }, + "clientDevicesSubnetCidr": { + "type": "string", + "defaultValue": "10.0.200.0/24", + "metadata": { + "description": "" + } + }, + "SpokeVnetCidr": { + "type": "string", + "defaultValue": "10.179.0.0/16", + "metadata": { + "description": "" + } + }, + "PrivateSubnetCidr": { + "type": "string", + "defaultValue": "10.179.0.0/18", + "metadata": { + "description": "" + } + }, + "PublicSubnetCidr": { + "type": "string", + "defaultValue": "10.179.64.0/18", + "metadata": { + "description": "" + } + }, + "AksSubnetCidr": { + "type": "string", + "defaultValue": "10.179.128.0/18", + "metadata": { + "description": "" + } + }, + "PrivateLinkSubnetCidr": { + "type": "string", + "defaultValue": "10.179.192.0/18", + "metadata": { + "description": "" + } + }, + "webappDestinationAddresses": { + "type": "array", + "defaultValue": [ + "52.187.145.107/32", + "52.187.0.85/32" + ], + "metadata": { + "description": "Southeastasia ADB webapp address" + } + }, + "logBlobstorageDomains": { + "type": "array", + "defaultValue": [ + "[format('dblogprodseasia.blob.{0}', environment().suffixes.storage)]" + ], + "metadata": { + "description": "Southeastasia ADB log blob" + } + }, + "extendedInfraIp": { + "type": "array", + "defaultValue": [ + "20.195.104.64/28" + ], + "metadata": { + "description": "Southeastasia ADB extended ip" + } + }, + "sccReplayDomain": { + "type": "array", + "defaultValue": [ + "tunnel.southeastasia.azuredatabricks.net" + ], + "metadata": { + "description": "Southeastasia SCC relay Domain" + } + }, + "metastoreDomains": { + "type": "array", + "defaultValue": [ + "consolidated-southeastasia-prod-metastore.mysql.database.azure.com" + ], + "metadata": { + "description": "Southeastasia SDB metastore" + } + }, + "eventHubEndpointDomain": { + "type": "array", + "defaultValue": [ + "prod-southeastasia-observabilityeventhubs.servicebus.windows.net" + ], + "metadata": { + "description": "Southeastasia EventHub endpoint" + } + }, + "artifactBlobStoragePrimaryDomains": { + "type": "array", + "defaultValue": [ + "[format('dbartifactsprodseap.blob.{0}', environment().suffixes.storage)]", + "[format('arprodseapa1.blob.{0}', environment().suffixes.storage)]", + "[format('arprodseapa2.blob.{0}', environment().suffixes.storage)]", + "[format('arprodseapa3.blob.{0}', environment().suffixes.storage)]", + "[format('dbartifactsprodeap.blob.{0}', environment().suffixes.storage)]" + ], + "metadata": { + "description": "Southeastasia Artifacts Blob" + } + } + }, + "functions": [], + "variables": { + "uniqueSubString": "[uniqueString(guid(subscription().subscriptionId))]", + "uString": "[format('{0}{1}', parameters('prefix'), variables('uniqueSubString'))]", + "storageAccountName": "[format('{0}stg01', substring(variables('uString'), 0, 10))]", + "keyVaultName": "[format('{0}-akv-00', substring(variables('uString'), 0, 6))]", + "resourceGroupName": "[format('{0}-rg', substring(variables('uString'), 0, 6))]", + "adbWorkspaceName": "[format('{0}-AdbWksp', substring(variables('uString'), 0, 6))]", + "nsgName": "[format('{0}-nsg', substring(variables('uString'), 0, 6))]", + "firewallName": "[format('{0}-HubFW', substring(variables('uString'), 0, 6))]", + "firewallPublicIpName": "[format('{0}-FWPIp', substring(variables('uString'), 0, 6))]", + "fwRoutingTable": "[format('{0}-AdbRoutingTbl', substring(variables('uString'), 0, 6))]", + "clientPcName": "[format('{0}-ClientPc', substring(variables('uString'), 0, 6))]", + "eHNameSpace": "[format('{0}-eh', substring(variables('uString'), 0, 6))]", + "adbAkvLinkName": "[format('{0}SecretScope', substring(variables('uString'), 0, 6))]", + "amlWorkspaceName": "[format('{0}-AmlWksp', substring(variables('uString'), 0, 6))]", + "containerRegistryName": "[format('{0}registry', substring(variables('uString'), 0, 6))]", + "applicationInsightsName": "[format('{0}-AppInsights', substring(variables('uString'), 0, 6))]", + "sslLeafName": "[toLower(substring(variables('uString'), 0, 6))]", + "aksAmlComputeName": "[format('aks-{0}', substring(variables('uString'), 0, 6))]", + "aksDNSPrefix": "[toLower(substring(variables('uString'), 0, 6))]", + "eventHubName": "[variables('eHNameSpace')]", + "managedIdentityName": "[format('{0}Identity', substring(variables('uString'), 0, 6))]" + }, + "resources": [ + { + "type": "Microsoft.Resources/resourceGroups", + "apiVersion": "2021-04-01", + "name": "[variables('resourceGroupName')]", + "location": "[parameters('location')]" + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "ManagedIdentity", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "managedIdentityName": { + "value": "[variables('managedIdentityName')]" + }, + "location": { + "value": "[parameters('location')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "2361919279329234047" + } + }, + "parameters": { + "location": { + "type": "string" + }, + "managedIdentityName": { + "type": "string" + } + }, + "functions": [], + "variables": { + "ownerRoleDefId": "8e3af657-a8ff-443c-a75c-2fe8c4bcb635" + }, + "resources": [ + { + "type": "Microsoft.ManagedIdentity/userAssignedIdentities", + "apiVersion": "2018-11-30", + "name": "[parameters('managedIdentityName')]", + "location": "[parameters('location')]" + }, + { + "type": "Microsoft.Authorization/roleAssignments", + "apiVersion": "2020-08-01-preview", + "name": "[guid(variables('ownerRoleDefId'), resourceGroup().id)]", + "properties": { + "principalType": "ServicePrincipal", + "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).principalId]", + "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('ownerRoleDefId'))]" + }, + "dependsOn": [ + "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))]" + ] + } + ], + "outputs": { + "mIdentityId": { + "type": "string", + "value": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))]" + }, + "mIdentityClientId": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('managedIdentityName'))).clientId]" + } + } + } + }, + "dependsOn": [ + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "NetworkSecurityGroup", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "securityGroupName": { + "value": "[variables('nsgName')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "71359721707976321" + } + }, + "parameters": { + "securityGroupName": { + "type": "string", + "metadata": { + "description": "The name of the network security group to create." + } + }, + "securityGroupLocation": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Location for all resources." + } + } + }, + "functions": [], + "resources": [ + { + "type": "Microsoft.Network/networkSecurityGroups", + "apiVersion": "2020-05-01", + "name": "[parameters('securityGroupName')]", + "location": "[parameters('securityGroupLocation')]", + "properties": { + "securityRules": [ + { + "name": "Microsoft.Databricks-workspaces_UseOnly_databricks-worker-to-worker-inbound", + "properties": { + "description": "Required for worker nodes communication within a cluster.", + "protocol": "*", + "sourcePortRange": "*", + "destinationPortRange": "*", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 100, + "direction": "Inbound" + } + }, + { + "name": "Microsoft.Databricks-workspaces_UseOnly_databricks-worker-to-databricks-webapp", + "properties": { + "description": "Required for workers communication with Databricks Webapp.", + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "443", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "AzureDatabricks", + "access": "Allow", + "priority": 100, + "direction": "Outbound" + } + }, + { + "name": "Microsoft.Databricks-workspaces_UseOnly_databricks-worker-to-sql", + "properties": { + "description": "Required for workers communication with Azure SQL services.", + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "3306", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "Sql", + "access": "Allow", + "priority": 101, + "direction": "Outbound" + } + }, + { + "name": "Microsoft.Databricks-workspaces_UseOnly_databricks-worker-to-storage", + "properties": { + "description": "Required for workers communication with Azure Storage services.", + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "443", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "Storage", + "access": "Allow", + "priority": 102, + "direction": "Outbound" + } + }, + { + "name": "Microsoft.Databricks-workspaces_UseOnly_databricks-worker-to-worker-outbound", + "properties": { + "description": "Required for worker nodes communication within a cluster.", + "protocol": "*", + "sourcePortRange": "*", + "destinationPortRange": "*", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 103, + "direction": "Outbound" + } + }, + { + "name": "Microsoft.Databricks-workspaces_UseOnly_databricks-worker-to-eventhub", + "properties": { + "description": "Required for worker communication with Azure Eventhub services.", + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "9093", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "EventHub", + "access": "Allow", + "priority": 104, + "direction": "Outbound" + } + } + ] + } + } + ], + "outputs": { + "nsgName": { + "type": "string", + "value": "[parameters('securityGroupName')]" + } + } + } + }, + "dependsOn": [ + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "RouteTable", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "routeTableName": { + "value": "[variables('fwRoutingTable')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "15357105487262340350" + } + }, + "parameters": { + "routeTableLocation": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Azure datacentre Location to deploy the Firewall and IP Address" + } + }, + "routeTableName": { + "type": "string", + "metadata": { + "description": "Name of the Routing Table" + } + } + }, + "functions": [], + "resources": [ + { + "type": "Microsoft.Network/routeTables", + "apiVersion": "2020-08-01", + "name": "[parameters('routeTableName')]", + "location": "[parameters('routeTableLocation')]", + "properties": { + "disableBgpRoutePropagation": false + } + } + ], + "outputs": { + "routeTblName": { + "type": "string", + "value": "[parameters('routeTableName')]" + } + } + } + }, + "dependsOn": [ + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "HubandSpokeVnets", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "hubVnetName": { + "value": "[parameters('hubVnetName')]" + }, + "spokeVnetName": { + "value": "[parameters('spokeVnetName')]" + }, + "routeTableName": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'RouteTable'), '2019-10-01').outputs.routeTblName.value]" + }, + "securityGroupName": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'NetworkSecurityGroup'), '2019-10-01').outputs.nsgName.value]" + }, + "firewallSubnetCidr": { + "value": "[parameters('FirewallSubnetCidr')]" + }, + "hubVnetCidr": { + "value": "[parameters('HubVnetCidr')]" + }, + "spokeVnetCidr": { + "value": "[parameters('SpokeVnetCidr')]" + }, + "publicSubnetCidr": { + "value": "[parameters('PublicSubnetCidr')]" + }, + "privateSubnetCidr": { + "value": "[parameters('PrivateSubnetCidr')]" + }, + "privatelinkSubnetCidr": { + "value": "[parameters('PrivateLinkSubnetCidr')]" + }, + "clinetDevicesSubnetCidr": { + "value": "[parameters('clientDevicesSubnetCidr')]" + }, + "AksSubnetCidr": { + "value": "[parameters('AksSubnetCidr')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "14348728657561399441" + } + }, + "parameters": { + "securityGroupName": { + "type": "string", + "metadata": { + "description": "The name of the existing network security group to create." + } + }, + "spokeVnetName": { + "type": "string", + "metadata": { + "description": "The name of the virtual network to create." + } + }, + "hubVnetName": { + "type": "string", + "metadata": { + "description": "The name of the virtual network to create." + } + }, + "privateSubnetName": { + "type": "string", + "defaultValue": "private-subnet", + "metadata": { + "description": "The name of the private subnet to create." + } + }, + "privatelinkSubnetName": { + "type": "string", + "defaultValue": "privatelink-subnet", + "metadata": { + "description": "The name of the private subnet to create." + } + }, + "publicSubnetName": { + "type": "string", + "defaultValue": "public-subnet", + "metadata": { + "description": "The name of the public subnet to create." + } + }, + "firewallSubnetName": { + "type": "string", + "defaultValue": "AzureFirewallSubnet", + "metadata": { + "description": "The name of the firewall subnet to create." + } + }, + "routeTableName": { + "type": "string", + "metadata": { + "description": "Name of the Routing Table" + } + }, + "vnetLocation": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Location for all resources." + } + }, + "spokeVnetCidr": { + "type": "string", + "metadata": { + "description": "Cidr range for the spoke vnet." + } + }, + "hubVnetCidr": { + "type": "string", + "metadata": { + "description": "Cidr range for the hub vnet." + } + }, + "privateSubnetCidr": { + "type": "string", + "metadata": { + "description": "Cidr range for the private subnet." + } + }, + "publicSubnetCidr": { + "type": "string", + "metadata": { + "description": "Cidr range for the public subnet." + } + }, + "firewallSubnetCidr": { + "type": "string", + "metadata": { + "description": "Cidr range for the firewall subnet." + } + }, + "privatelinkSubnetCidr": { + "type": "string", + "metadata": { + "description": "Cidr range for the private link subnet.." + } + }, + "aksSubnetName": { + "type": "string", + "defaultValue": "aks-subnet", + "metadata": { + "description": "The name of the private subnet to create." + } + }, + "AksSubnetCidr": { + "type": "string", + "metadata": { + "description": "Cidr range for the AKS subnet.." + } + }, + "clinetDevicesSubnetCidr": { + "type": "string" + } + }, + "functions": [], + "variables": { + "securityGroupId": "[resourceId('Microsoft.Network/networkSecurityGroups', parameters('securityGroupName'))]", + "serviceEndpoints": [ + { + "service": "Microsoft.Storage", + "locations": [ + "[resourceGroup().location]" + ] + }, + { + "service": "Microsoft.ContainerRegistry", + "locations": [ + "[resourceGroup().location]" + ] + }, + { + "service": "Microsoft.KeyVault", + "locations": [ + "[resourceGroup().location]" + ] + } + ] + }, + "resources": [ + { + "type": "Microsoft.Network/virtualNetworks", + "apiVersion": "2020-08-01", + "name": "[parameters('hubVnetName')]", + "location": "[parameters('vnetLocation')]", + "properties": { + "addressSpace": { + "addressPrefixes": [ + "[parameters('hubVnetCidr')]" + ] + }, + "subnets": [ + { + "name": "[parameters('firewallSubnetName')]", + "properties": { + "addressPrefix": "[parameters('firewallSubnetCidr')]", + "privateEndpointNetworkPolicies": "Enabled", + "privateLinkServiceNetworkPolicies": "Enabled" + } + }, + { + "name": "ClientDevices", + "properties": { + "addressPrefix": "[parameters('clinetDevicesSubnetCidr')]", + "routeTable": { + "id": "[resourceId('Microsoft.Network/routeTables', parameters('routeTableName'))]" + } + } + } + ], + "enableDdosProtection": false + } + }, + { + "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings", + "apiVersion": "2020-08-01", + "name": "[format('{0}/{1}', parameters('hubVnetName'), 'Peer-HubSpoke')]", + "properties": { + "allowVirtualNetworkAccess": true, + "allowForwardedTraffic": true, + "allowGatewayTransit": false, + "useRemoteGateways": false, + "remoteVirtualNetwork": { + "id": "[resourceId('Microsoft.Network/virtualNetworks', parameters('spokeVnetName'))]" + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/virtualNetworks', parameters('hubVnetName'))]", + "[resourceId('Microsoft.Network/virtualNetworks', parameters('spokeVnetName'))]" + ] + }, + { + "type": "Microsoft.Network/virtualNetworks", + "apiVersion": "2020-08-01", + "name": "[parameters('spokeVnetName')]", + "location": "[parameters('vnetLocation')]", + "properties": { + "addressSpace": { + "addressPrefixes": [ + "[parameters('spokeVnetCidr')]" + ] + }, + "subnets": [ + { + "name": "[parameters('publicSubnetName')]", + "properties": { + "addressPrefix": "[parameters('publicSubnetCidr')]", + "networkSecurityGroup": { + "id": "[variables('securityGroupId')]" + }, + "routeTable": { + "id": "[resourceId('Microsoft.Network/routeTables', parameters('routeTableName'))]" + }, + "serviceEndpoints": "[variables('serviceEndpoints')]", + "delegations": [ + { + "name": "databricks-del-public", + "properties": { + "serviceName": "Microsoft.Databricks/workspaces" + } + } + ] + } + }, + { + "name": "[parameters('privateSubnetName')]", + "properties": { + "addressPrefix": "[parameters('privateSubnetCidr')]", + "networkSecurityGroup": { + "id": "[variables('securityGroupId')]" + }, + "routeTable": { + "id": "[resourceId('Microsoft.Network/routeTables', parameters('routeTableName'))]" + }, + "delegations": [ + { + "name": "databricks-del-private", + "properties": { + "serviceName": "Microsoft.Databricks/workspaces" + } + } + ] + } + }, + { + "name": "[parameters('privatelinkSubnetName')]", + "properties": { + "addressPrefix": "[parameters('privatelinkSubnetCidr')]", + "privateEndpointNetworkPolicies": "Disabled", + "privateLinkServiceNetworkPolicies": "Enabled", + "serviceEndpoints": "[variables('serviceEndpoints')]" + } + }, + { + "name": "[parameters('aksSubnetName')]", + "properties": { + "addressPrefix": "[parameters('AksSubnetCidr')]", + "serviceEndpoints": "[variables('serviceEndpoints')]" + } + } + ], + "enableDdosProtection": false + } + }, + { + "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings", + "apiVersion": "2020-08-01", + "name": "[format('{0}/{1}', parameters('spokeVnetName'), 'Peer-SpokeHub')]", + "properties": { + "allowVirtualNetworkAccess": true, + "allowForwardedTraffic": true, + "allowGatewayTransit": false, + "useRemoteGateways": false, + "remoteVirtualNetwork": { + "id": "[resourceId('Microsoft.Network/virtualNetworks', parameters('hubVnetName'))]" + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/virtualNetworks', parameters('hubVnetName'))]", + "[resourceId('Microsoft.Network/virtualNetworks', parameters('spokeVnetName'))]" + ] + } + ], + "outputs": { + "privatelinksubnet_id": { + "type": "string", + "value": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('spokeVnetName'), parameters('privatelinkSubnetName'))]" + }, + "databricksPublicSubnetId": { + "type": "string", + "value": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('spokeVnetName'), parameters('publicSubnetName'))]" + }, + "spokeVnetName": { + "type": "string", + "value": "[parameters('spokeVnetName')]" + }, + "hubVnetName": { + "type": "string", + "value": "[parameters('hubVnetName')]" + }, + "aksSubnet_id": { + "type": "string", + "value": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('spokeVnetName'), parameters('aksSubnetName'))]" + }, + "spokeVnetId": { + "type": "string", + "value": "[resourceId('Microsoft.Network/virtualNetworks', parameters('spokeVnetName'))]" + } + } + } + }, + "dependsOn": [ + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'NetworkSecurityGroup')]", + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'RouteTable')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "StorageAccount", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "storageAccountName": { + "value": "[variables('storageAccountName')]" + }, + "databricksPublicSubnetId": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'HubandSpokeVnets'), '2019-10-01').outputs.databricksPublicSubnetId.value]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "1137679761133512415" + } + }, + "parameters": { + "storageAccountName": { + "type": "string", + "metadata": { + "description": "Name of the storage account" + }, + "maxLength": 24, + "minLength": 3 + }, + "storageContainerName": { + "type": "string", + "defaultValue": "data" + }, + "databricksPublicSubnetId": { + "type": "string" + }, + "storageAccountSku": { + "type": "string", + "defaultValue": "Standard_LRS", + "metadata": { + "description": "Storage Account Sku" + }, + "allowedValues": [ + "Standard_LRS", + "Standard_GRS", + "Standard_ZRS", + "Premium_LRS" + ] + }, + "encryptionEnabled": { + "type": "bool", + "defaultValue": true, + "metadata": { + "description": "Enable or disable Blob encryption at Rest." + } + } + }, + "functions": [], + "variables": { + "location": "[resourceGroup().location]" + }, + "resources": [ + { + "type": "Microsoft.Storage/storageAccounts", + "apiVersion": "2019-06-01", + "name": "[parameters('storageAccountName')]", + "tags": { + "displayName": "[parameters('storageAccountName')]", + "type": "Storage" + }, + "location": "[variables('location')]", + "kind": "StorageV2", + "properties": { + "isHnsEnabled": true, + "minimumTlsVersion": "TLS1_2", + "supportsHttpsTrafficOnly": true, + "accessTier": "Hot", + "networkAcls": { + "bypass": "AzureServices", + "virtualNetworkRules": [ + { + "id": "[parameters('databricksPublicSubnetId')]", + "action": "Allow", + "state": "succeeded" + } + ], + "ipRules": [], + "defaultAction": "Deny" + }, + "encryption": { + "keySource": "Microsoft.Storage", + "services": { + "blob": { + "enabled": "[parameters('encryptionEnabled')]" + }, + "file": { + "enabled": "[parameters('encryptionEnabled')]" + } + } + } + }, + "sku": { + "name": "[parameters('storageAccountSku')]" + } + }, + { + "type": "Microsoft.Storage/storageAccounts/blobServices/containers", + "apiVersion": "2019-06-01", + "name": "[format('{0}/default/{1}', parameters('storageAccountName'), parameters('storageContainerName'))]", + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]" + ] + } + ], + "outputs": { + "key1": { + "type": "string", + "value": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-04-01').keys[0].value]" + }, + "key2": { + "type": "string", + "value": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-04-01').keys[1].value]" + }, + "storageaccount_id": { + "type": "string", + "value": "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]" + } + } + } + }, + "dependsOn": [ + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'HubandSpokeVnets')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "DatabricksWorkspace", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "vnetName": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'HubandSpokeVnets'), '2019-10-01').outputs.spokeVnetName.value]" + }, + "adbWorkspaceSkuTier": { + "value": "premium" + }, + "adbWorkspaceName": { + "value": "[variables('adbWorkspaceName')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "9573554296807436207" + } + }, + "parameters": { + "vnetName": { + "type": "string", + "metadata": { + "description": "" + } + }, + "adbWorkspaceSkuTier": { + "type": "string", + "metadata": { + "description": "" + }, + "allowedValues": [ + "standard", + "premium" + ] + }, + "publicSubnetName": { + "type": "string", + "defaultValue": "public-subnet", + "metadata": { + "description": "" + } + }, + "privateSubnetName": { + "type": "string", + "defaultValue": "private-subnet", + "metadata": { + "description": "" + } + }, + "disablePublicIp": { + "type": "bool", + "defaultValue": true, + "metadata": { + "description": "" + } + }, + "adbWorkspaceLocation": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "" + } + }, + "adbWorkspaceName": { + "type": "string", + "metadata": { + "description": "" + } + }, + "tagValues": { + "type": "object", + "defaultValue": {}, + "metadata": { + "description": "" + } + } + }, + "functions": [], + "variables": { + "managedResourceGroupName": "[format('databricks-rg-{0}-{1}', parameters('adbWorkspaceName'), uniqueString(parameters('adbWorkspaceName'), resourceGroup().id))]", + "managedResourceGroupId": "[format('{0}/resourceGroups/{1}', subscription().id, variables('managedResourceGroupName'))]", + "vnetId": "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]" + }, + "resources": [ + { + "type": "Microsoft.Databricks/workspaces", + "apiVersion": "2018-04-01", + "name": "[parameters('adbWorkspaceName')]", + "location": "[parameters('adbWorkspaceLocation')]", + "sku": { + "name": "[parameters('adbWorkspaceSkuTier')]" + }, + "properties": { + "managedResourceGroupId": "[variables('managedResourceGroupId')]", + "parameters": { + "customVirtualNetworkId": { + "value": "[variables('vnetId')]" + }, + "customPublicSubnetName": { + "value": "[parameters('publicSubnetName')]" + }, + "customPrivateSubnetName": { + "value": "[parameters('privateSubnetName')]" + }, + "enableNoPublicIp": { + "value": "[parameters('disablePublicIp')]" + } + } + }, + "tags": "[parameters('tagValues')]" + } + ], + "outputs": { + "databricks_workspace_id": { + "type": "string", + "value": "[resourceId('Microsoft.Databricks/workspaces', parameters('adbWorkspaceName'))]" + }, + "databricks_workspaceUrl": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Databricks/workspaces', parameters('adbWorkspaceName'))).workspaceUrl]" + }, + "databricks_dbfs_storage_accountName": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Databricks/workspaces', parameters('adbWorkspaceName'))).parameters.storageAccountName.value]" + } + } + } + }, + "dependsOn": [ + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'HubandSpokeVnets')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "HubFirewall", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "firewallName": { + "value": "[variables('firewallName')]" + }, + "publicIpAddressName": { + "value": "[variables('firewallPublicIpName')]" + }, + "vnetName": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'HubandSpokeVnets'), '2019-10-01').outputs.hubVnetName.value]" + }, + "webappDestinationAddresses": { + "value": "[parameters('webappDestinationAddresses')]" + }, + "logBlobstorageDomains": { + "value": "[parameters('logBlobstorageDomains')]" + }, + "infrastructureDestinationAddresses": { + "value": "[parameters('extendedInfraIp')]" + }, + "sccRelayDomains": { + "value": "[parameters('sccReplayDomain')]" + }, + "metastoreDomains": { + "value": "[parameters('metastoreDomains')]" + }, + "eventHubEndpointDomains": { + "value": "[parameters('eventHubEndpointDomain')]" + }, + "artifactBlobStoragePrimaryDomains": { + "value": "[parameters('artifactBlobStoragePrimaryDomains')]" + }, + "dbfsBlobStrageDomain": { + "value": "[array(format('{0}.blob.{1}', reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'DatabricksWorkspace'), '2019-10-01').outputs.databricks_dbfs_storage_accountName.value, environment().suffixes.storage))]" + }, + "clientPrivateIpAddr": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'ClientPC'), '2019-10-01').outputs.clientPrivateIpaddr.value]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "3290483879050623264" + } + }, + "parameters": { + "firewallLocation": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Azure datacentre Location to deploy the Firewall and IP Address" + } + }, + "publicIpAddressName": { + "type": "string", + "metadata": { + "description": "Name of the IP Address" + } + }, + "firewallName": { + "type": "string", + "metadata": { + "description": "Name of the Azure Firewall" + } + }, + "firewallSKU": { + "type": "string", + "defaultValue": "Standard", + "metadata": { + "description": "Firewall SKU" + } + }, + "clientPrivateIpAddr": { + "type": "string", + "metadata": { + "description": "Client Private ip address" + } + }, + "vnetName": { + "type": "string", + "metadata": { + "description": "Name of the vnet associated witht he Firewall" + } + }, + "webappDestinationAddresses": { + "type": "array", + "defaultValue": [], + "metadata": { + "description": "List of destination IP addresses for Web App" + } + }, + "logBlobstorageDomains": { + "type": "array", + "defaultValue": [], + "metadata": { + "description": "List of Log Blob storage domain name" + } + }, + "infrastructureDestinationAddresses": { + "type": "array", + "defaultValue": [], + "metadata": { + "description": "List of destination IP addresses for Extended Infrastructure" + } + }, + "sccRelayDomains": { + "type": "array", + "defaultValue": [], + "metadata": { + "description": "List of SCC relay domain name" + } + }, + "metastoreDomains": { + "type": "array", + "defaultValue": [], + "metadata": { + "description": "List of Metastore domain name" + } + }, + "eventHubEndpointDomains": { + "type": "array", + "defaultValue": [], + "metadata": { + "description": "List of Event Hub endpoint domain name" + } + }, + "artifactBlobStoragePrimaryDomains": { + "type": "array", + "defaultValue": [], + "metadata": { + "description": "List of Artifact Blob storage primary domain name" + } + }, + "dbfsBlobStrageDomain": { + "type": "array", + "defaultValue": [], + "metadata": { + "description": "the domain name of DBFS root Blob storage" + } + }, + "fwpublicipcount": { + "type": "int", + "defaultValue": 1, + "metadata": { + "description": "Specifies the number of public IPs to allocate to the firewall" + } + } + }, + "functions": [], + "resources": [ + { + "type": "Microsoft.Network/publicIPAddresses", + "apiVersion": "2021-02-01", + "name": "[parameters('publicIpAddressName')]", + "location": "[parameters('firewallLocation')]", + "sku": { + "name": "Standard" + }, + "properties": { + "publicIPAllocationMethod": "Static" + } + }, + { + "type": "Microsoft.Network/azureFirewalls", + "apiVersion": "2021-02-01", + "name": "[parameters('firewallName')]", + "location": "[parameters('firewallLocation')]", + "properties": { + "ipConfigurations": [ + { + "name": "[parameters('publicIpAddressName')]", + "properties": { + "subnet": { + "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), 'AzureFirewallSubnet')]" + }, + "publicIPAddress": { + "id": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIpAddressName'))]" + } + } + } + ], + "hubIPAddresses": { + "publicIPs": { + "count": "[parameters('fwpublicipcount')]" + } + }, + "sku": { + "tier": "[parameters('firewallSKU')]" + }, + "threatIntelMode": "Alert", + "additionalProperties": { + "Network.DNS.EnableProxy": "true" + }, + "natRuleCollections": [ + { + "name": "Allow-RDP-DNAT", + "properties": { + "priority": 100, + "action": { + "type": "Dnat" + }, + "rules": [ + { + "name": "rdp-dnat", + "protocols": [ + "TCP" + ], + "sourceAddresses": [ + "*" + ], + "destinationAddresses": [ + "[reference(resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIpAddressName'))).ipAddress]" + ], + "destinationPorts": [ + "3389" + ], + "translatedAddress": "[parameters('clientPrivateIpAddr')]", + "translatedPort": "3389" + } + ] + } + } + ], + "networkRuleCollections": [ + { + "name": "Allow-Databricks-Services", + "properties": { + "priority": 100, + "action": { + "type": "Allow" + }, + "rules": [ + { + "name": "Webapp IP", + "protocols": [ + "TCP" + ], + "sourceAddresses": [ + "*" + ], + "destinationAddresses": "[parameters('webappDestinationAddresses')]", + "sourceIpGroups": [], + "destinationIpGroups": [], + "destinationFqdns": [], + "destinationPorts": [ + "*" + ] + }, + { + "name": "Extended infrastructure IP", + "protocols": [ + "TCP" + ], + "sourceAddresses": [ + "*" + ], + "destinationAddresses": "[parameters('infrastructureDestinationAddresses')]", + "sourceIpGroups": [], + "destinationIpGroups": [], + "destinationFqdns": [], + "destinationPorts": [ + "*" + ] + }, + { + "name": "Metastore IP", + "protocols": [ + "TCP" + ], + "sourceAddresses": [ + "*" + ], + "destinationAddresses": [], + "sourceIpGroups": [], + "destinationIpGroups": [], + "destinationFqdns": "[parameters('metastoreDomains')]", + "destinationPorts": [ + "*" + ] + }, + { + "name": "Event Hub endpoint", + "protocols": [ + "TCP" + ], + "sourceAddresses": [ + "*" + ], + "destinationAddresses": [], + "sourceIpGroups": [], + "destinationIpGroups": [], + "destinationFqdns": "[parameters('eventHubEndpointDomains')]", + "destinationPorts": [ + "*" + ] + } + ] + } + } + ], + "applicationRuleCollections": [ + { + "name": "Allow-Databricks-Services", + "properties": { + "priority": 100, + "action": { + "type": "Allow" + }, + "rules": [ + { + "name": "Log Blob storage IP", + "protocols": [ + { + "protocolType": "Http", + "port": 80 + }, + { + "protocolType": "Https", + "port": 443 + } + ], + "fqdnTags": [], + "targetFqdns": "[parameters('logBlobstorageDomains')]", + "sourceAddresses": [ + "*" + ], + "sourceIpGroups": [] + }, + { + "name": "SCC Relay IP", + "protocols": [ + { + "protocolType": "Http", + "port": 80 + }, + { + "protocolType": "Https", + "port": 443 + } + ], + "fqdnTags": [], + "targetFqdns": "[parameters('sccRelayDomains')]", + "sourceAddresses": [ + "*" + ], + "sourceIpGroups": [] + }, + { + "name": "Artifact Blob storage IP", + "protocols": [ + { + "protocolType": "Http", + "port": 80 + }, + { + "protocolType": "Https", + "port": 443 + } + ], + "fqdnTags": [], + "targetFqdns": "[parameters('artifactBlobStoragePrimaryDomains')]", + "sourceAddresses": [ + "*" + ], + "sourceIpGroups": [] + }, + { + "name": "DBFS root Blob storage IP", + "protocols": [ + { + "protocolType": "Http", + "port": 80 + }, + { + "protocolType": "Https", + "port": 443 + } + ], + "fqdnTags": [], + "targetFqdns": "[parameters('dbfsBlobStrageDomain')]", + "sourceAddresses": [ + "*" + ], + "sourceIpGroups": [] + } + ] + } + }, + { + "name": "Allow-Websites", + "properties": { + "priority": 200, + "action": { + "type": "Allow" + }, + "rules": [ + { + "name": "Pypi", + "protocols": [ + { + "protocolType": "Http", + "port": 80 + }, + { + "protocolType": "Https", + "port": 443 + } + ], + "fqdnTags": [], + "targetFqdns": [ + "pypi.org", + "*.pypi.org", + "*.pythonhosted.org" + ], + "sourceAddresses": [ + "*" + ], + "sourceIpGroups": [] + }, + { + "name": "Maven", + "protocols": [ + { + "protocolType": "Http", + "port": 80 + }, + { + "protocolType": "Https", + "port": 443 + } + ], + "fqdnTags": [], + "targetFqdns": [ + "*.mvnrepository.com", + "*.maven.org" + ], + "sourceAddresses": [ + "*" + ], + "sourceIpGroups": [] + }, + { + "name": "GitHubScripts", + "protocols": [ + { + "protocolType": "Http", + "port": 80 + }, + { + "protocolType": "Https", + "port": 443 + } + ], + "fqdnTags": [], + "targetFqdns": [ + "*.githubusercontent.com", + "github.com" + ], + "sourceAddresses": [ + "*" + ], + "sourceIpGroups": [] + }, + { + "name": "LogAnalytics", + "protocols": [ + { + "protocolType": "Http", + "port": 80 + }, + { + "protocolType": "Https", + "port": 443 + } + ], + "fqdnTags": [], + "targetFqdns": [ + "*.ods.opinsights.azure.com", + "*.oms.opinsights.azure.com" + ], + "sourceAddresses": [ + "*" + ], + "sourceIpGroups": [] + }, + { + "name": "AzureManagement", + "protocols": [ + { + "protocolType": "Http", + "port": 80 + }, + { + "protocolType": "Https", + "port": 443 + } + ], + "fqdnTags": [], + "targetFqdns": [ + "[replace(replace(environment().authentication.loginEndpoint, 'https:', ''), '/', '')]", + "[replace(replace(environment().resourceManager, 'https:', ''), '/', '')]", + "[format('*.blob.{0}', environment().suffixes.storage)]", + "*.azure-automation.net", + "ml.azure.com", + "*.msauth.net" + ], + "sourceAddresses": [ + "*" + ], + "sourceIpGroups": [] + } + ] + } + } + ] + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIpAddressName'))]" + ] + } + ], + "outputs": { + "firewallPrivateIp": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Network/azureFirewalls', parameters('firewallName'))).ipConfigurations[0].properties.privateIPAddress]" + } + } + } + }, + "dependsOn": [ + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'DatabricksWorkspace')]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'ClientPC')]", + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'HubandSpokeVnets')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "RouteTableUpdate", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "routeTableName": { + "value": "[variables('fwRoutingTable')]" + }, + "firewallPrivateIp": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'HubFirewall'), '2019-10-01').outputs.firewallPrivateIp.value]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "1265305905541722464" + } + }, + "parameters": { + "routeTableName": { + "type": "string" + }, + "firewallPrivateIp": { + "type": "string" + } + }, + "functions": [], + "resources": [ + { + "type": "Microsoft.Network/routeTables/routes", + "apiVersion": "2020-08-01", + "name": "[format('{0}/Firewall-Route', parameters('routeTableName'))]", + "properties": { + "addressPrefix": "0.0.0.0/0", + "nextHopType": "VirtualAppliance", + "nextHopIpAddress": "[parameters('firewallPrivateIp')]", + "hasBgpOverride": false + } + } + ] + } + }, + "dependsOn": [ + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'HubFirewall')]", + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "KeyVault", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "keyVaultName": { + "value": "[variables('keyVaultName')]" + }, + "objectId": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'ManagedIdentity'), '2019-10-01').outputs.mIdentityClientId.value]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "1226844121658064294" + } + }, + "parameters": { + "keyVaultName": { + "type": "string", + "metadata": { + "description": "Specifies the name of the key vault." + } + }, + "keyVaultLocation": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Specifies the Azure location where the key vault should be created." + } + }, + "enabledForDeployment": { + "type": "bool", + "defaultValue": false, + "metadata": { + "description": "Specifies whether Azure Virtual Machines are permitted to retrieve certificates stored as secrets from the key vault." + }, + "allowedValues": [ + true, + false + ] + }, + "enabledForTemplateDeployment": { + "type": "bool", + "defaultValue": false, + "metadata": { + "description": "Specifies whether Azure Resource Manager is permitted to retrieve secrets from the key vault." + }, + "allowedValues": [ + true, + false + ] + }, + "tenantId": { + "type": "string", + "defaultValue": "[subscription().tenantId]", + "metadata": { + "description": "Specifies the Azure Active Directory tenant ID that should be used for authenticating requests to the key vault. Get it by using Get-AzSubscription cmdlet." + } + }, + "objectId": { + "type": "string", + "metadata": { + "description": "Specifies the object ID of a user, service principal or security group in the Azure Active Directory tenant for the vault. The object ID must be unique for the list of access policies. Get it by using Get-AzADUser or Get-AzADServicePrincipal cmdlets." + } + }, + "keyVaultSkuTier": { + "type": "string", + "defaultValue": "standard", + "metadata": { + "description": "Specifies whether the key vault is a standard vault or a premium vault." + }, + "allowedValues": [ + "standard", + "premium" + ] + }, + "tagValues": { + "type": "object", + "defaultValue": {} + } + }, + "functions": [], + "resources": [ + { + "type": "Microsoft.KeyVault/vaults", + "apiVersion": "2019-09-01", + "name": "[parameters('keyVaultName')]", + "location": "[parameters('keyVaultLocation')]", + "properties": { + "enabledForDeployment": "[parameters('enabledForDeployment')]", + "enabledForTemplateDeployment": "[parameters('enabledForTemplateDeployment')]", + "tenantId": "[parameters('tenantId')]", + "accessPolicies": [ + { + "objectId": "[parameters('objectId')]", + "tenantId": "[parameters('tenantId')]", + "permissions": { + "secrets": [ + "list", + "get", + "set" + ] + } + } + ], + "sku": { + "name": "[parameters('keyVaultSkuTier')]", + "family": "A" + }, + "softDeleteRetentionInDays": 7, + "networkAcls": { + "defaultAction": "Deny", + "bypass": "AzureServices", + "ipRules": [], + "virtualNetworkRules": [] + } + }, + "tags": "[parameters('tagValues')]" + } + ], + "outputs": { + "keyvault_id": { + "type": "string", + "value": "[resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))]" + }, + "keyvault_uri": { + "type": "string", + "value": "[reference(resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))).vaultUri]" + }, + "keyvaultResource": { + "type": "object", + "value": "[reference(resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName')), '2019-09-01', 'full')]" + } + } + } + }, + "dependsOn": [ + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'ManagedIdentity')]", + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "ClientPC", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "adminUsername": { + "value": "[parameters('adminUsername')]" + }, + "adminPassword": { + "value": "[parameters('adminPassword')]" + }, + "vnetName": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'HubandSpokeVnets'), '2019-10-01').outputs.hubVnetName.value]" + }, + "clientPcName": { + "value": "[variables('clientPcName')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "15240521664149869021" + } + }, + "parameters": { + "clientPcName": { + "type": "string", + "metadata": { + "description": "" + } + }, + "osDiskType": { + "type": "string", + "defaultValue": "Premium_LRS", + "metadata": { + "description": "" + } + }, + "virtualMachineSize": { + "type": "string", + "defaultValue": "Standard_DS1_v2", + "metadata": { + "description": "" + } + }, + "patchMode": { + "type": "string", + "defaultValue": "AutomaticByOS", + "metadata": { + "description": "" + } + }, + "vnetName": { + "type": "string", + "metadata": { + "description": "" + } + }, + "adminUsername": { + "type": "string", + "metadata": { + "description": "" + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "" + } + }, + "adminPassword": { + "type": "secureString", + "metadata": { + "description": "" + } + } + }, + "functions": [], + "variables": { + "networkInterfaceName": "[format('{0}-Iface', parameters('clientPcName'))]", + "virtualMachineName": "[parameters('clientPcName')]", + "subnetRef": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), 'ClientDevices')]" + }, + "resources": [ + { + "type": "Microsoft.Network/networkInterfaces", + "apiVersion": "2018-10-01", + "name": "[variables('networkInterfaceName')]", + "location": "[parameters('location')]", + "properties": { + "ipConfigurations": [ + { + "name": "ipconfig1", + "properties": { + "subnet": { + "id": "[variables('subnetRef')]" + }, + "privateIPAllocationMethod": "Dynamic" + } + } + ] + } + }, + { + "type": "Microsoft.Compute/virtualMachines", + "apiVersion": "2021-03-01", + "name": "[variables('virtualMachineName')]", + "location": "[parameters('location')]", + "properties": { + "hardwareProfile": { + "vmSize": "[parameters('virtualMachineSize')]" + }, + "storageProfile": { + "osDisk": { + "createOption": "FromImage", + "managedDisk": { + "storageAccountType": "[parameters('osDiskType')]" + } + }, + "imageReference": { + "publisher": "MicrosoftWindowsDesktop", + "offer": "Windows-10", + "sku": "20h2-pro-g2", + "version": "latest" + } + }, + "networkProfile": { + "networkInterfaces": [ + { + "id": "[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]" + } + ] + }, + "osProfile": { + "computerName": "[variables('virtualMachineName')]", + "adminUsername": "[parameters('adminUsername')]", + "adminPassword": "[parameters('adminPassword')]", + "windowsConfiguration": { + "enableAutomaticUpdates": true, + "provisionVMAgent": true, + "patchSettings": { + "enableHotpatching": false, + "patchMode": "[parameters('patchMode')]" + } + } + }, + "licenseType": "Windows_Client", + "diagnosticsProfile": { + "bootDiagnostics": { + "enabled": true + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]" + ] + } + ], + "outputs": { + "clientPrivateIpaddr": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))).ipConfigurations[0].properties.privateIPAddress]" + } + } + } + }, + "dependsOn": [ + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'HubandSpokeVnets')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "LogAnalytics", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "8904458932555451638" + } + }, + "parameters": { + "logAnalyticsWkspName": { + "type": "string", + "defaultValue": "[toLower(format('spark-monitoring-{0}', uniqueString(resourceGroup().name)))]" + }, + "logAnalyticsWkspLocation": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + }, + "logAnalyticsWkspSku": { + "type": "string", + "defaultValue": "Standalone", + "metadata": { + "description": "Service Tier: Free, Standalone, PerNode, or PerGB2018" + }, + "allowedValues": [ + "Free", + "Standalone", + "PerNode", + "PerGB2018" + ] + }, + "logAnalyticsWkspRentationDays": { + "type": "int", + "defaultValue": 30, + "metadata": { + "description": "Number of days of retention. Free plans can only have 7 days, Standalone and Log Analytics plans include 30 days for free" + }, + "maxValue": 730, + "minValue": 7 + } + }, + "functions": [], + "variables": { + "queries": [ + { + "displayName": "Stage Latency Per Stage (Stage Duration)", + "query": "let results=SparkListenerEvent_CL\n| where Event_s contains \"SparkListenerStageSubmitted\"\n| extend metricsns=columnifexists(\"Properties_spark_metrics_namespace_s\",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,apptag,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains \"SparkListenerStageCompleted\" \n | extend stageDuration=Stage_Info_Completion_Time_d - Stage_Info_Submission_Time_d\n) on Stage_Info_Stage_ID_d;\nresults\n | extend slice = strcat(Properties_spark_databricks_clusterUsageTags_clusterName_s,\"-\",apptag,\" \",Stage_Info_Stage_Name_s) \n| extend stageDuration=Stage_Info_Completion_Time_d - Stage_Info_Submission_Time_d \n| summarize percentiles(stageDuration,10,30,50,90) by bin(TimeGenerated, 1m), slice\n| order by TimeGenerated asc nulls last\n\n" + }, + { + "displayName": "Stage Throughput Per Stage", + "query": "let results=SparkListenerEvent_CL\n| where Event_s contains \"SparkListenerStageSubmitted\"\n| extend metricsns=columnifexists(\"Properties_spark_metrics_namespace_s\",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project \nStage_Info_Stage_ID_d,apptag,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains \"SparkListenerStageCompleted\" \n) on Stage_Info_Stage_ID_d;\nresults\n | extend slice = strcat(\"# StagesCompleted \",Properties_spark_databricks_clusterUsageTags_clusterName_s,\"-\",\napptag,\" \",Stage_Info_Stage_Name_s) \n| summarize StagesCompleted=count(Event_s) by bin(TimeGenerated,1m), slice\n| order by TimeGenerated asc nulls last\n\n" + }, + { + "displayName": "Tasks Per Stage", + "query": "let results=SparkListenerEvent_CL\n| where Event_s contains \"SparkListenerStageSubmitted\"\n| extend metricsns=columnifexists(\"Properties_spark_metrics_namespace_s\",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project \nStage_Info_Stage_ID_d,apptag,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains \"SparkListenerStageCompleted\" \n) on Stage_Info_Stage_ID_d;\nresults\n | extend slice = strcat(\"# StagesCompleted \",Properties_spark_databricks_clusterUsageTags_clusterName_s,\"-\",apptag,\" \",Stage_Info_Stage_Name_s)\n| extend slice=strcat(Properties_spark_databricks_clusterUsageTags_clusterName_s,\"-\",apptag,\" \",Stage_Info_Stage_Name_s) \n| project Stage_Info_Number_of_Tasks_d,slice,TimeGenerated \n| order by TimeGenerated asc nulls last\n\n" + }, + { + "displayName": "% Serialize Time Per Executor", + "query": "let results = SparkMetric_CL\n| where name_s contains \"executor.resultserializationtime\" \n| extend sname=split(name_s, \".\") \n| extend executor=strcat(sname[0],\".\",sname[1])\n| project TimeGenerated , setime=count_d , executor ,name_s\n| join kind= inner (\nSparkMetric_CL\n| where name_s contains \"executor.RunTime\"\n| extend sname=split(name_s, \".\") \n| extend executor=strcat(sname[0],\".\",sname[1])\n| project TimeGenerated , runTime=count_d , executor ,name_s\n) on executor, TimeGenerated;\nresults\n| extend serUsage=(setime/runTime)*100\n| summarize SerializationCpuTime=percentile(serUsage,90) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last\n| render timechart " + }, + { + "displayName": "Shuffle Bytes Read Per Executor", + "query": "let results=SparkMetric_CL\n| where name_s contains \"executor.shuffleTotalBytesRead\"\n| extend sname=split(name_s, \".\") \n| extend executor=strcat(sname[0],\".\",sname[1])\n| summarize MaxShuffleWrites=max(count_d) by bin(TimeGenerated, 1m), executor \n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkMetric_CL\n | where name_s contains \"executor.shuffleTotalBytesRead\"\n | extend sname=split(name_s, \".\") \n | extend executor=strcat(sname[0],\".\",sname[1])\n| summarize MinShuffleWrites=min(count_d) by bin(TimeGenerated, 1m), executor\n) on executor, TimeGenerated;\nresults\n| extend ShuffleBytesWritten=MaxShuffleWrites-MinShuffleWrites \n| summarize max(ShuffleBytesWritten) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last\n" + }, + { + "displayName": "Error Traces (Bad Record Or Bad Files)", + "query": "SparkListenerEvent_CL\r\n| where Level contains \"Error\"\r\n| project TimeGenerated , Message \r\n" + }, + { + "displayName": "Task Shuffle Bytes Written", + "query": "let result=SparkListenerEvent_CL\n| where Event_s contains \"SparkListenerStageSubmitted\"\n| extend metricsns=columnifexists(\"Properties_spark_metrics_namespace_s\",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains \"SparkListenerTaskEnd\"\n | where Task_End_Reason_Reason_s contains \"Success\"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\n Task_Metrics_JVM_GC_Time_d,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend schedulerdelay = Task_Info_Launch_Time_d - Stage_Info_Submission_Time_d\n| extend name=strcat(\"SchuffleBytesWritten \",Properties_spark_databricks_clusterUsageTags_clusterName_s,\"-\",apptag,\" \",Stage_Info_Stage_Name_s)\n| summarize percentile(Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,90) by bin(TimeGenerated,1m),name\n| order by TimeGenerated asc nulls last;\n\n" + }, + { + "displayName": "Task Input Bytes Read", + "query": "let result=SparkListenerEvent_CL\n| where Event_s contains \"SparkListenerStageSubmitted\"\n| extend metricsns=columnifexists(\"Properties_spark_metrics_namespace_s\",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains \"SparkListenerTaskEnd\"\n | where Task_End_Reason_Reason_s contains \"Success\"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\n Task_Metrics_JVM_GC_Time_d,Task_Metrics_Input_Metrics_Bytes_Read_d,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend name=strcat(\"InputBytesRead \",Properties_spark_databricks_clusterUsageTags_clusterName_s,\"-\",apptag,\" \",Stage_Info_Stage_Name_s)\n| summarize percentile(Task_Metrics_Input_Metrics_Bytes_Read_d,90) by bin(TimeGenerated,1m),name\n| order by TimeGenerated asc nulls last;\n\n" + }, + { + "displayName": "Sum Task Execution Per Host", + "query": "SparkListenerEvent_CL\n| where Event_s contains \"taskend\" \n| extend taskDuration=Task_Info_Finish_Time_d-Task_Info_Launch_Time_d \n| summarize sum(taskDuration) by bin(TimeGenerated, 1m), Task_Info_Host_s\n| order by TimeGenerated asc nulls last " + }, + { + "displayName": "% CPU Time Per Executor", + "query": "let results = SparkMetric_CL \n| where name_s contains \"executor.cpuTime\" \n| extend sname=split(name_s, \".\")\n| extend executor=strcat(sname[0],\".\",sname[1])\n| project TimeGenerated , cpuTime=count_d/1000000 , executor ,name_s\n| join kind= inner (\n SparkMetric_CL\n| where name_s contains \"executor.RunTime\"\n| extend sname=split(name_s, \".\") \n| extend executor=strcat(sname[0],\".\",sname[1])\n| project TimeGenerated , runTime=count_d , executor ,name_s\n) on executor, TimeGenerated;\nresults\n| extend cpuUsage=(cpuTime/runTime)*100\n| summarize ExecutorCpuTime = percentile(cpuUsage,90) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last \n" + }, + { + "displayName": "Job Throughput", + "query": "let results=SparkListenerEvent_CL\n| where Event_s contains \"SparkListenerJobStart\"\n| extend metricsns=columnifexists(\"Properties_spark_metrics_namespace_s\",Properties_spark_app_id_s)\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\n| project Job_ID_d,apptag,Properties_spark_databricks_clusterUsageTags_clusterName_s,TimeGenerated\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains \"SparkListenerJobEnd\"\n | where Job_Result_Result_s contains \"JobSucceeded\"\n | project Event_s,Job_ID_d,TimeGenerated\n) on Job_ID_d;\nresults\n| extend slice=strcat(\"#JobsCompleted \",Properties_spark_databricks_clusterUsageTags_clusterName_s,\"-\",apptag)\n| summarize count(Event_s) by bin(TimeGenerated, 1m),slice\n| order by TimeGenerated asc nulls last" + }, + { + "displayName": "Shuffle Disk Bytes Spilled Per Executor", + "query": "let results=SparkMetric_CL\r\n| where name_s contains \"executor.diskBytesSpilled\"\r\n| extend sname=split(name_s, \".\") \r\n| extend executor=strcat(\"executorid:\",sname[1])\r\n| summarize MaxShuffleWrites=max(count_d) by bin(TimeGenerated, 1m), executor \r\n| order by TimeGenerated asc nulls last \r\n| join kind= inner (\r\n SparkMetric_CL\r\n | where name_s contains \"executor.diskBytesSpilled\"\r\n | extend sname=split(name_s, \".\") \r\n | extend executor=strcat(\"executorid:\",sname[1])\r\n| summarize MinShuffleWrites=min(count_d) by bin(TimeGenerated, 1m), executor\r\n) on executor, TimeGenerated;\r\nresults\r\n| extend ShuffleBytesWritten=MaxShuffleWrites-MinShuffleWrites \r\n| summarize any(ShuffleBytesWritten) by bin(TimeGenerated, 1m), executor\r\n| order by TimeGenerated asc nulls last\r\n" + }, + { + "displayName": "Task Shuffle Read Time", + "query": "let result=SparkListenerEvent_CL\n| where Event_s contains \"SparkListenerStageSubmitted\"\n| extend metricsns=columnifexists(\"Properties_spark_metrics_namespace_s\",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains \"SparkListenerTaskEnd\"\n | where Task_End_Reason_Reason_s contains \"Success\"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\n Task_Metrics_JVM_GC_Time_d,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend name=strcat(\"TaskShuffleReadTime \",Properties_spark_databricks_clusterUsageTags_clusterName_s,\"-\",apptag,\" \",Stage_Info_Stage_Name_s)\n| summarize percentile(Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,90) by bin(TimeGenerated,1m),name\n| order by TimeGenerated asc nulls last;\n\n" + }, + { + "displayName": "Shuffle Heap Memory Per Executor", + "query": "SparkMetric_CL\n| where name_s contains \"shuffle-client.usedHeapMemory\"\n| extend sname=split(name_s, \".\")\n| extend executor=strcat(sname[0],\".\",sname[1])\n| summarize percentile(value_d,90) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last" + }, + { + "displayName": "Job Errors Per Job", + "query": "let results=SparkListenerEvent_CL\r\n| where Event_s contains \"SparkListenerJobStart\"\r\n| project Job_ID_d,Properties_callSite_short_s,TimeGenerated\r\n| order by TimeGenerated asc nulls last \r\n| join kind= inner (\r\n SparkListenerEvent_CL\r\n | where Event_s contains \"SparkListenerJobEnd\"\r\n | where Job_Result_Result_s !contains \"JobSucceeded\"\r\n | project Event_s,Job_ID_d,TimeGenerated\r\n) on Job_ID_d;\r\nresults\r\n| extend slice=strcat(\"JobErrors \",Properties_callSite_short_s)\r\n| summarize count(Event_s) by bin(TimeGenerated, 1m),slice\r\n| order by TimeGenerated asc nulls last" + }, + { + "displayName": "Task Errors Per Stage", + "query": "let result=SparkListenerEvent_CL\n| where Event_s contains \"SparkListenerStageCompleted\"\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Event_s,TimeGenerated\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains \"SparkListenerTaskEnd\"\n | where Task_End_Reason_Reason_s !contains \"Success\"\n | project Stage_ID_d,Task_Info_Task_ID_d,Task_End_Reason_Reason_s,\n TaskEvent=Event_s,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend slice=strcat(\"#TaskErrors \",Stage_Info_Stage_Name_s)\n| summarize count(TaskEvent) by bin(TimeGenerated,1m),slice\n| order by TimeGenerated asc nulls last\n" + }, + { + "displayName": "Streaming Latency Per Stream", + "query": "\r\n\r\nSparkListenerEvent_CL\r\n| where Event_s contains \"queryprogressevent\"\r\n| extend sname=strcat(progress_name_s,\"-\",\"triggerexecution\") \r\n| summarize percentile(progress_durationMs_triggerExecution_d,90) by bin(TimeGenerated, 1m), sname\r\n| order by TimeGenerated asc nulls last \r\n" + }, + { + "displayName": "Task Shuffle Write Time", + "query": "let result=SparkListenerEvent_CL\r\n| where Event_s contains \"SparkListenerStageCompleted\"\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated\r\n| order by TimeGenerated asc nulls last \r\n| join kind= inner (\r\n SparkListenerEvent_CL\r\n | where Event_s contains \"SparkListenerTaskEnd\"\r\n | where Task_End_Reason_Reason_s contains \"Success\"\r\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\r\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\r\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\r\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\r\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\r\n Task_Metrics_JVM_GC_Time_d,TimeGenerated\r\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\r\nresult\r\n| extend ShuffleWriteTime=Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d/1000000\r\n| extend name=strcat(\"TaskShuffleWriteTime \",Stage_Info_Stage_Name_s)\r\n| summarize percentile(ShuffleWriteTime,90) by bin(TimeGenerated,1m),name\r\n| order by TimeGenerated asc nulls last;\r\n\r\n" + }, + { + "displayName": "Task Deserialization Time", + "query": "let result=SparkListenerEvent_CL\n| where Event_s contains \"SparkListenerStageSubmitted\"\n| extend metricsns=columnifexists(\"Properties_spark_metrics_namespace_s\",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains \"SparkListenerTaskEnd\"\n | where Task_End_Reason_Reason_s contains \"Success\"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\n Task_Metrics_JVM_GC_Time_d,Task_Metrics_Input_Metrics_Bytes_Read_d,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend name=strcat(\"TaskDeserializationTime \",Properties_spark_databricks_clusterUsageTags_clusterName_s,\"-\",apptag,\" \",Stage_Info_Stage_Name_s)\n| summarize percentile(Task_Metrics_Executor_Deserialize_Time_d,90) by bin(TimeGenerated,1m),name\n| order by TimeGenerated asc nulls last;\n\n" + }, + { + "displayName": "Task Result Serialization Time", + "query": "let result=SparkListenerEvent_CL\n| where Event_s contains \"SparkListenerStageSubmitted\"\n| extend metricsns=columnifexists(\"Properties_spark_metrics_namespace_s\",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains \"SparkListenerTaskEnd\"\n | where Task_End_Reason_Reason_s contains \"Success\"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\n Task_Metrics_JVM_GC_Time_d,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend name=strcat(\"TaskResultSerializationTime \",Properties_spark_databricks_clusterUsageTags_clusterName_s,\"-\",apptag,\" \",Stage_Info_Stage_Name_s)\n| summarize percentile(Task_Metrics_Result_Serialization_Time_d,90) by bin(TimeGenerated,1m),name\n| order by TimeGenerated asc nulls last;\n\n" + }, + { + "displayName": "File System Bytes Read Per Executor", + "query": "SparkMetric_CL\n| extend sname=split(name_s, \".\")\n| extend executor=strcat(sname[0],\".\",sname[1])\n| where name_s contains \"executor.filesystem.file.read_bytes\" \n| summarize FileSystemReadBytes=percentile(value_d,90) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last" + }, + { + "displayName": "Streaming Throughput Processed Rows/Sec", + "query": "SparkListenerEvent_CL\r\n| where Event_s contains \"progress\"\r\n| extend sname=strcat(progress_name_s,\"-ProcRowsPerSecond\") \r\n| extend status = todouble(extractjson(\"$.[0].processedRowsPerSecond\", progress_sources_s))\r\n| summarize percentile(status,90) by bin(TimeGenerated, 1m) , sname\r\n| order by TimeGenerated asc nulls last " + }, + { + "displayName": "% Deserialize Time Per Executor", + "query": "let results = SparkMetric_CL \n| where name_s contains \"executor.deserializetime\" \n| extend sname=split(name_s, \".\") \n| extend executor=strcat(sname[0],\".\",sname[1])\n| project TimeGenerated , desetime=count_d , executor ,name_s\n| join kind= inner (\nSparkMetric_CL\n| where name_s contains \"executor.RunTime\"\n| extend sname=split(name_s, \".\") \n| extend executor=strcat(sname[0],\".\",sname[1])\n| project TimeGenerated , runTime=count_d , executor ,name_s\n) on executor, TimeGenerated;\nresults\n| extend deseUsage=(desetime/runTime)*100\n| summarize deSerializationCpuTime=percentiles(deseUsage,90) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last " + }, + { + "displayName": "Tasks Per Executor (Sum Of Tasks Per Executor)", + "query": "SparkMetric_CL\n| extend sname=split(name_s, \".\")\n| extend executor=strcat(sname[0],\".\",sname[1]) \n| where name_s contains \"threadpool.activeTasks\" \n| summarize percentile(value_d,90) by bin(TimeGenerated, 1m),executor\n| order by TimeGenerated asc nulls last" + }, + { + "displayName": "File System Bytes Write Per Executor", + "query": "SparkMetric_CL\n| extend sname=split(name_s, \".\")\n| extend executor=strcat(sname[0],\".\",sname[1])\n| where name_s contains \"executor.filesystem.file.write_bytes\" \n| summarize FileSystemWriteBytes=percentile(value_d,90) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last " + }, + { + "displayName": "Task Scheduler Delay Latency", + "query": "let result=SparkListenerEvent_CL\n| where Event_s contains \"SparkListenerStageSubmitted\"\n| extend metricsns=columnifexists(\"Properties_spark_metrics_namespace_s\",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains \"SparkListenerTaskEnd\"\n | where Task_End_Reason_Reason_s contains \"Success\"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\n Task_Metrics_JVM_GC_Time_d,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend schedulerdelay = Task_Info_Launch_Time_d - Stage_Info_Submission_Time_d\n| extend name=strcat(\"SchedulerDelayTime \",Properties_spark_databricks_clusterUsageTags_clusterName_s,\"-\",apptag,\" \",Stage_Info_Stage_Name_s)\n| summarize percentile(schedulerdelay,90) , percentile(Task_Metrics_Executor_Run_Time_d,90) by bin(TimeGenerated,1m),name\n| order by TimeGenerated asc nulls last;\n\n" + }, + { + "displayName": "Streaming Errors Per Stream", + "query": "SparkListenerEvent_CL\r\n| extend slice = strcat(\"CountExceptions\",progress_name_s) \r\n| where Level contains \"Error\"\r\n| summarize count(Level) by bin(TimeGenerated, 1m), slice \r\n" + }, + { + "displayName": "Shuffle Client Memory Per Executor", + "query": "SparkMetric_CL\r\n| where name_s contains \"shuffle-client.usedDirectMemory\"\r\n| extend sname=split(name_s, \".\")\r\n| extend executor=strcat(\"executorid:\",sname[1])\r\n| summarize percentile(value_d,90) by bin(TimeGenerated, 1m), executor\r\n| order by TimeGenerated asc nulls last" + }, + { + "displayName": "Job Latency Per Job (Batch Duration)", + "query": "let results=SparkListenerEvent_CL\r\n| where Event_s contains \"SparkListenerJobStart\"\r\n| extend metricsns=columnifexists(\"Properties_spark_metrics_namespace_s\",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Job_ID_d,apptag,Properties_spark_databricks_clusterUsageTags_clusterName_s,\r\nSubmission_Time_d,TimeGenerated\r\n| order by TimeGenerated asc nulls last \r\n| join kind= inner (\r\n SparkListenerEvent_CL\r\n | where Event_s contains \"SparkListenerJobEnd\"\r\n | where Job_Result_Result_s contains \"JobSucceeded\"\r\n | project Event_s,Job_ID_d,Completion_Time_d,TimeGenerated\r\n) on Job_ID_d;\r\nresults\r\n| extend slice=strcat(Properties_spark_databricks_clusterUsageTags_clusterName_s,\"-\",apptag)\r\n| extend jobDuration=Completion_Time_d - Submission_Time_d \r\n| summarize percentiles(jobDuration,10,30,50,90) by bin(TimeGenerated, 1m), slice\r\n| order by TimeGenerated asc nulls last" + }, + { + "displayName": "Task Executor Compute Time (Data Skew Time)", + "query": "let result=SparkListenerEvent_CL\n| where Event_s contains \"SparkListenerStageSubmitted\"\n| extend metricsns=columnifexists(\"Properties_spark_metrics_namespace_s\",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last\n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains \"SparkListenerTaskEnd\"\n | where Task_End_Reason_Reason_s contains \"Success\"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\n Task_Metrics_JVM_GC_Time_d,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend name=strcat(\"ExecutorComputeTime \",Properties_spark_databricks_clusterUsageTags_clusterName_s,\"-\",apptag,\" \",Stage_Info_Stage_Name_s)\n| summarize percentile(Task_Metrics_Executor_Run_Time_d,90) by bin(TimeGenerated,1m),name\n| order by TimeGenerated asc nulls last;\n\n" + }, + { + "displayName": "Streaming Throughput Input Rows/Sec", + "query": "SparkListenerEvent_CL\r\n| where Event_s contains \"progress\"\r\n| extend sname=strcat(progress_name_s,\"-inputRowsPerSecond\") \r\n| extend status = todouble(extractjson(\"$.[0].inputRowsPerSecond\", progress_sources_s))\r\n| summarize percentile(status,90) by bin(TimeGenerated, 1m) , sname\r\n| order by TimeGenerated asc nulls last \n" + }, + { + "displayName": "Task Shuffle Bytes Read", + "query": "let result=SparkListenerEvent_CL\n| where Event_s contains \"SparkListenerStageSubmitted\"\n| extend metricsns=columnifexists(\"Properties_spark_metrics_namespace_s\",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last\n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains \"SparkListenerTaskEnd\"\n | where Task_End_Reason_Reason_s contains \"Success\"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\n Task_Metrics_JVM_GC_Time_d,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend name=strcat(\"SchuffleBytesRead \",Properties_spark_databricks_clusterUsageTags_clusterName_s,\"-\",apptag,\" \",Stage_Info_Stage_Name_s)\n| summarize percentile(Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,90) by bin(TimeGenerated,1m),name\n| order by TimeGenerated asc nulls last;\n\n" + }, + { + "displayName": "Shuffle Memory Bytes Spilled Per Executor", + "query": "let results=SparkMetric_CL\n| where name_s contains \"executor.memoryBytesSpilled\"\n| extend sname=split(name_s, \".\") \n| extend executor=strcat(sname[0],\".\",sname[1])\n| summarize MaxShuffleWrites=max(count_d) by bin(TimeGenerated, 1m), executor \n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkMetric_CL\n | where name_s contains \"executor.memoryBytesSpilled\"\n | extend sname=split(name_s, \".\") \n | extend executor=strcat(sname[0],\".\",sname[1])\n| summarize MinShuffleWrites=min(count_d) by bin(TimeGenerated, 1m), executor\n) on executor, TimeGenerated;\nresults\n| extend ShuffleBytesWritten=MaxShuffleWrites-MinShuffleWrites \n| summarize any(ShuffleBytesWritten) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last\n" + }, + { + "displayName": "% JVM Time Per Executor", + "query": "let results = SparkMetric_CL\n| where name_s contains \"executor.jvmGCTime\" \n| extend sname=split(name_s, \".\")\n| extend executor=strcat(sname[0],\".\",sname[1])\n| project TimeGenerated , jvmgcTime=count_d , executor ,name_s\n| join kind= inner (\nSparkMetric_CL\n| where name_s contains \"executor.RunTime\"\n| extend sname=split(name_s, \".\")\n| extend executor=strcat(sname[0],\".\",sname[1])\n| project TimeGenerated , runTime=count_d , executor ,name_s\n) on executor, TimeGenerated;\nresults\n| extend JvmcpuUsage=(jvmgcTime/runTime)*100\n| summarize JvmCpuTime = percentile(JvmcpuUsage,90) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last\n| render timechart \n" + }, + { + "displayName": "Running Executors", + "query": "SparkMetric_CL\n| where name_s !contains \"driver\" \n| where name_s contains \"executor\"\n| extend sname=split(name_s, \".\")\n| extend executor=strcat(sname[1]) \n| extend app=strcat(sname[0])\n| summarize NumExecutors=dcount(executor) by bin(TimeGenerated, 1m),app\n| order by TimeGenerated asc nulls last" + }, + { + "displayName": "Shuffle Bytes Read To Disk Per Executor", + "query": "let results=SparkMetric_CL\r\n| where name_s contains \"executor.shuffleRemoteBytesReadToDisk\"\r\n| extend sname=split(name_s, \".\") \r\n| extend executor=strcat(\"executorid:\",sname[1])\r\n| summarize MaxShuffleWrites=max(count_d) by bin(TimeGenerated, 1m), executor \r\n| order by TimeGenerated asc nulls last \r\n| join kind= inner (\r\n SparkMetric_CL\r\n | where name_s contains \"executor.shuffleRemoteBytesReadToDisk\"\r\n | extend sname=split(name_s, \".\") \r\n | extend executor=strcat(\"executorid:\",sname[1])\r\n| summarize MinShuffleWrites=min(count_d) by bin(TimeGenerated, 1m), executor\r\n) on executor, TimeGenerated;\r\nresults\r\n| extend ShuffleBytesWritten=MaxShuffleWrites-MinShuffleWrites \r\n| summarize any(ShuffleBytesWritten) by bin(TimeGenerated, 1m), executor\r\n| order by TimeGenerated asc nulls last\r\n" + }, + { + "displayName": "Task Latency Per Stage (Tasks Duration)", + "query": "let result=SparkListenerEvent_CL\n| where Event_s contains \"SparkListenerStageSubmitted\"\n| extend metricsns=columnifexists(\"Properties_spark_metrics_namespace_s\",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,apptag,Properties_spark_databricks_clusterUsageTags_clusterName_s,Event_s,TimeGenerated\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains \"SparkListenerTaskEnd\"\n | where Task_End_Reason_Reason_s contains \"Success\"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Info_Finish_Time_d\n ) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend TaskLatency = Task_Info_Finish_Time_d - Task_Info_Launch_Time_d\n| extend slice=strcat(Properties_spark_databricks_clusterUsageTags_clusterName_s,\"-\",apptag,\"-\",Stage_Info_Stage_Name_s)\n| summarize percentile(TaskLatency,90) by bin(TimeGenerated,1m),slice\n| order by TimeGenerated asc nulls last;\n" + }, + { + "displayName": "Task Throughput (Sum Of Tasks Per Stage)", + "query": "let result=SparkListenerEvent_CL\n| where Event_s contains \"SparkListenerStageSubmitted\"\n| extend metricsns=columnifexists(\"Properties_spark_metrics_namespace_s\",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains \"SparkListenerTaskEnd\"\n | where Task_End_Reason_Reason_s contains \"Success\"\n | project Stage_ID_d,Task_Info_Task_ID_d,\n TaskEvent=Event_s,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend slice=strcat(\"#TasksCompleted \",Properties_spark_databricks_clusterUsageTags_clusterName_s,\"-\",apptag,\" \",Stage_Info_Stage_Name_s)\n| summarize count(TaskEvent) by bin(TimeGenerated,1m),slice\n| order by TimeGenerated asc nulls last\n" + }, + { + "displayName": "Shuffle Client Direct Memory", + "query": "SparkMetric_CL\n| where name_s contains \"shuffle-client.usedDirectMemory\"\n| extend sname=split(name_s, \".\")\n| extend executor=strcat(sname[0],\".\",sname[1])\n| summarize percentile(value_d,90) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last" + }, + { + "displayName": "Disk Bytes Spilled", + "query": "let results=SparkMetric_CL\n| where name_s contains \"executor.diskBytesSpilled\"\n| extend sname=split(name_s, \".\") \n| extend executor=strcat(sname[0],\".\",sname[1])\n| summarize MaxShuffleWrites=max(count_d) by bin(TimeGenerated, 1m), executor \n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkMetric_CL\n | where name_s contains \"executor.diskBytesSpilled\"\n | extend sname=split(name_s, \".\") \n | extend executor=strcat(sname[0],\".\",sname[1])\n| summarize MinShuffleWrites=min(count_d) by bin(TimeGenerated, 1m), executor\n) on executor, TimeGenerated;\nresults\n| extend ShuffleBytesWritten=MaxShuffleWrites-MinShuffleWrites \n| summarize any(ShuffleBytesWritten) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last\n" + }, + { + "displayName": "Shuffle Bytes Read", + "query": "let results=SparkMetric_CL\n| where name_s contains \"executor.shuffleRemoteBytesReadToDisk\"\n| extend sname=split(name_s, \".\") \n| extend executor=strcat(sname[0],\".\",sname[1])\n| summarize MaxShuffleWrites=max(count_d) by bin(TimeGenerated, 1m), executor \n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkMetric_CL\n | where name_s contains \"executor.shuffleRemoteBytesReadToDisk\"\n | extend sname=split(name_s, \".\") \n | extend executor=strcat(sname[0],\".\",sname[1])\n| summarize MinShuffleWrites=min(count_d) by bin(TimeGenerated, 1m), executor\n) on executor, TimeGenerated;\nresults\n| extend ShuffleBytesWritten=MaxShuffleWrites-MinShuffleWrites \n| summarize any(ShuffleBytesWritten) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last\n" + } + ] + }, + "resources": [ + { + "type": "Microsoft.OperationalInsights/workspaces", + "apiVersion": "2020-10-01", + "name": "[parameters('logAnalyticsWkspName')]", + "location": "[parameters('logAnalyticsWkspLocation')]", + "properties": { + "sku": { + "name": "[parameters('logAnalyticsWkspSku')]" + }, + "retentionInDays": "[parameters('logAnalyticsWkspRentationDays')]", + "features": { + "enableDataExport": true + } + } + }, + { + "copy": { + "name": "WkspSearch", + "count": "[length(variables('queries'))]" + }, + "type": "Microsoft.OperationalInsights/workspaces/savedSearches", + "apiVersion": "2020-08-01", + "name": "[format('{0}/{1}', parameters('logAnalyticsWkspName'), guid(format('{0}{1}{2}', resourceGroup().id, deployment().name, copyIndex())))]", + "properties": { + "category": "Spark Metrics", + "displayName": "[variables('queries')[copyIndex()].displayName]", + "query": "[variables('queries')[copyIndex()].query]", + "etag": "*" + }, + "dependsOn": [ + "[resourceId('Microsoft.OperationalInsights/workspaces', parameters('logAnalyticsWkspName'))]" + ] + } + ], + "outputs": { + "logAnalyticsWkspId": { + "type": "string", + "value": "[reference(resourceId('Microsoft.OperationalInsights/workspaces', parameters('logAnalyticsWkspName'))).customerId]" + }, + "primarySharedKey": { + "type": "string", + "value": "[listKeys(resourceId('Microsoft.OperationalInsights/workspaces', parameters('logAnalyticsWkspName')), '2020-10-01').primarySharedKey]" + }, + "secondarySharedKey": { + "type": "string", + "value": "[listKeys(resourceId('Microsoft.OperationalInsights/workspaces', parameters('logAnalyticsWkspName')), '2020-10-01').secondarySharedKey]" + } + } + } + }, + "dependsOn": [ + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "EventHub", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "namespaceName": { + "value": "[variables('eHNameSpace')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "11175130669690033926" + } + }, + "parameters": { + "namespaceName": { + "type": "string", + "metadata": { + "description": "Name for the Event Hub cluster." + } + }, + "eventHubName": { + "type": "string", + "defaultValue": "[parameters('namespaceName')]", + "metadata": { + "description": "Name for the Event Hub to be created in the Event Hub namespace within the Event Hub cluster." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Specifies the Azure location for all resources." + } + }, + "eHRuleName": { + "type": "string", + "defaultValue": "rule", + "metadata": { + "description": "" + } + } + }, + "functions": [], + "resources": [ + { + "type": "Microsoft.EventHub/namespaces", + "apiVersion": "2021-01-01-preview", + "name": "[parameters('namespaceName')]", + "location": "[parameters('location')]", + "sku": { + "name": "Standard", + "tier": "Standard", + "capacity": 1 + }, + "properties": { + "isAutoInflateEnabled": false, + "maximumThroughputUnits": 0 + } + }, + { + "type": "Microsoft.EventHub/namespaces/eventhubs", + "apiVersion": "2021-01-01-preview", + "name": "[format('{0}/{1}', parameters('namespaceName'), parameters('eventHubName'))]", + "properties": { + "messageRetentionInDays": 7, + "partitionCount": 1 + }, + "dependsOn": [ + "[resourceId('Microsoft.EventHub/namespaces', parameters('namespaceName'))]" + ] + }, + { + "type": "Microsoft.EventHub/namespaces/eventhubs/authorizationRules", + "apiVersion": "2021-01-01-preview", + "name": "[format('{0}/{1}/{2}', parameters('namespaceName'), parameters('eventHubName'), parameters('eHRuleName'))]", + "properties": { + "rights": [ + "Send", + "Listen" + ] + }, + "dependsOn": [ + "[resourceId('Microsoft.EventHub/namespaces/eventhubs', parameters('namespaceName'), parameters('eventHubName'))]" + ] + } + ], + "outputs": { + "eHNamespaceId": { + "type": "string", + "value": "[resourceId('Microsoft.EventHub/namespaces', parameters('namespaceName'))]" + }, + "eHubNameId": { + "type": "string", + "value": "[resourceId('Microsoft.EventHub/namespaces/eventhubs', parameters('namespaceName'), parameters('eventHubName'))]" + }, + "eHAuthRulesId": { + "type": "string", + "value": "[resourceId('Microsoft.EventHub/namespaces/eventhubs/authorizationRules', split(format('{0}/{1}/{2}', parameters('namespaceName'), parameters('eventHubName'), parameters('eHRuleName')), '/')[0], split(format('{0}/{1}/{2}', parameters('namespaceName'), parameters('eventHubName'), parameters('eHRuleName')), '/')[1], split(format('{0}/{1}/{2}', parameters('namespaceName'), parameters('eventHubName'), parameters('eHRuleName')), '/')[2])]" + }, + "eHPConnString": { + "type": "string", + "value": "[listKeys(resourceId('Microsoft.EventHub/namespaces/eventhubs/authorizationRules', parameters('namespaceName'), parameters('eventHubName'), parameters('eHRuleName')), '2021-01-01-preview').primaryConnectionString]" + }, + "eHName": { + "type": "string", + "value": "[parameters('eventHubName')]" + } + } + } + }, + "dependsOn": [ + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "PrivateEndPoints", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "keyvaultPrivateLinkResource": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'KeyVault'), '2019-10-01').outputs.keyvault_id.value]" + }, + "privateLinkSubnetId": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'HubandSpokeVnets'), '2019-10-01').outputs.privatelinksubnet_id.value]" + }, + "storageAccountName": { + "value": "StorageAccount" + }, + "storageAccountPrivateLinkResource": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'StorageAccount'), '2019-10-01').outputs.storageaccount_id.value]" + }, + "eventHubName": { + "value": "[variables('eventHubName')]" + }, + "eventHubPrivateLinkResource": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'EventHub'), '2019-10-01').outputs.eHNamespaceId.value]" + }, + "AmlName": { + "value": "MLWorkspace" + }, + "amlPrivateLinkResource": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'MLWorkspace'), '2019-10-01').outputs.amlId.value]" + }, + "vnetName": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'HubandSpokeVnets'), '2019-10-01').outputs.spokeVnetName.value]" + }, + "containerRegistryName": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'MLWorkspace'), '2019-10-01').outputs.ctrRegistryName.value]" + }, + "crPrivateLinkResource": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'MLWorkspace'), '2019-10-01').outputs.ctrRegistryId.value]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "2805453972849292259" + } + }, + "parameters": { + "storageAccountPrivateLinkResource": { + "type": "string", + "metadata": { + "description": "Storage Account Privatelink Resource" + } + }, + "storageAccountName": { + "type": "string", + "metadata": { + "description": "Storage Account name" + } + }, + "keyvaultPrivateLinkResource": { + "type": "string", + "metadata": { + "description": "Keyvault Private Link resource." + } + }, + "keyvaultName": { + "type": "string", + "defaultValue": "KeyVault", + "metadata": { + "description": "keyvault name." + } + }, + "eventHubName": { + "type": "string", + "metadata": { + "description": "event hub name." + } + }, + "eventHubPrivateLinkResource": { + "type": "string", + "metadata": { + "description": "EventHub Private Link resource." + } + }, + "vnetName": { + "type": "string", + "metadata": { + "description": "Vnet name for private link" + } + }, + "privateLinkSubnetId": { + "type": "string", + "metadata": { + "description": "Privatelink subnet Id" + } + }, + "privateLinkLocation": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Privatelink subnet Id" + } + }, + "AmlName": { + "type": "string" + }, + "amlPrivateLinkResource": { + "type": "string" + }, + "containerRegistryName": { + "type": "string" + }, + "crPrivateLinkResource": { + "type": "string" + } + }, + "functions": [], + "variables": { + "privateDnsNameStorageDfs_var": "[format('privatelink.dfs.{0}', environment().suffixes.storage)]", + "privateDnsNameStorageBlob_var": "[format('privatelink.blob.{0}', environment().suffixes.storage)]", + "privateDnsNameStorageFile_var": "[format('privatelink.file.{0}', environment().suffixes.storage)]", + "adlsPrivateDnsZoneName_var": "[format('{0}-dfs-Privateendpoint', toLower(parameters('storageAccountName')))]", + "filePrivateDnsZoneName_var": "[format('{0}-file-Privateendpoint', toLower(parameters('storageAccountName')))]", + "blobPrivateDnsZoneName_var": "[format('{0}-blob-Privateendpoint', toLower(parameters('storageAccountName')))]", + "privateDnsNameVault_var": "privatelink.vaultcore.azure.net", + "keyvaultPrivateEndpointName_var": "[format('{0}-Privateendpoint', toLower(parameters('keyvaultName')))]", + "privateDnsNameEventHub_var": "privatelink.servicebus.windows.net", + "eventHubPrivateEndpointName_var": "[format('{0}-Privateendpoint', parameters('eventHubName'))]", + "privateDnsNameAmlApi_var": "privatelink.api.azureml.ms", + "privateDnsNameAmlNotebook_var": "privatelink.notebooks.azure.net", + "amlPrivateEndpointName_var": "[format('{0}-Privateendpoint', parameters('AmlName'))]", + "privateDnsNameCr_var": "privatelink.azurecr.io", + "crPrivateEndpointName_var": "[format('{0}-Privateendpoint', parameters('containerRegistryName'))]" + }, + "resources": [ + { + "type": "Microsoft.Network/privateEndpoints", + "apiVersion": "2021-02-01", + "name": "[variables('adlsPrivateDnsZoneName_var')]", + "location": "[parameters('privateLinkLocation')]", + "properties": { + "privateLinkServiceConnections": [ + { + "name": "[variables('adlsPrivateDnsZoneName_var')]", + "properties": { + "privateLinkServiceId": "[parameters('storageAccountPrivateLinkResource')]", + "groupIds": [ + "dfs" + ] + } + } + ], + "subnet": { + "id": "[parameters('privateLinkSubnetId')]" + } + } + }, + { + "type": "Microsoft.Network/privateEndpoints", + "apiVersion": "2021-02-01", + "name": "[variables('filePrivateDnsZoneName_var')]", + "location": "[parameters('privateLinkLocation')]", + "properties": { + "privateLinkServiceConnections": [ + { + "name": "[variables('filePrivateDnsZoneName_var')]", + "properties": { + "privateLinkServiceId": "[parameters('storageAccountPrivateLinkResource')]", + "groupIds": [ + "file" + ] + } + } + ], + "subnet": { + "id": "[parameters('privateLinkSubnetId')]" + } + } + }, + { + "type": "Microsoft.Network/privateEndpoints", + "apiVersion": "2021-02-01", + "name": "[variables('blobPrivateDnsZoneName_var')]", + "location": "[parameters('privateLinkLocation')]", + "properties": { + "privateLinkServiceConnections": [ + { + "name": "[variables('blobPrivateDnsZoneName_var')]", + "properties": { + "privateLinkServiceId": "[parameters('storageAccountPrivateLinkResource')]", + "groupIds": [ + "blob" + ] + } + } + ], + "subnet": { + "id": "[parameters('privateLinkSubnetId')]" + } + } + }, + { + "type": "Microsoft.Network/privateDnsZones", + "apiVersion": "2020-06-01", + "name": "[variables('privateDnsNameStorageDfs_var')]", + "location": "global", + "tags": {}, + "properties": {}, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', variables('adlsPrivateDnsZoneName_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateDnsZones", + "apiVersion": "2020-06-01", + "name": "[variables('privateDnsNameStorageFile_var')]", + "location": "global", + "tags": {}, + "properties": {}, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', variables('filePrivateDnsZoneName_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateDnsZones", + "apiVersion": "2020-06-01", + "name": "[variables('privateDnsNameStorageBlob_var')]", + "location": "global", + "tags": {}, + "properties": {}, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', variables('blobPrivateDnsZoneName_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks", + "apiVersion": "2020-06-01", + "name": "[format('{0}/{1}', variables('privateDnsNameStorageDfs_var'), format('dfs_link_to_{0}', toLower(parameters('vnetName'))))]", + "location": "global", + "properties": { + "virtualNetwork": { + "id": "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]" + }, + "registrationEnabled": false + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameStorageDfs_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks", + "apiVersion": "2020-06-01", + "name": "[format('{0}/{1}', variables('privateDnsNameStorageFile_var'), format('file_link_to_{0}', toLower(parameters('vnetName'))))]", + "location": "global", + "properties": { + "virtualNetwork": { + "id": "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]" + }, + "registrationEnabled": false + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameStorageFile_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks", + "apiVersion": "2020-06-01", + "name": "[format('{0}/{1}', variables('privateDnsNameStorageBlob_var'), format('file_link_to_{0}', toLower(parameters('vnetName'))))]", + "location": "global", + "properties": { + "virtualNetwork": { + "id": "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]" + }, + "registrationEnabled": false + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameStorageBlob_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", + "apiVersion": "2021-02-01", + "name": "[format('{0}/{1}', variables('adlsPrivateDnsZoneName_var'), 'default')]", + "properties": { + "privateDnsZoneConfigs": [ + { + "name": "privatelink-dfs-core-windows-net", + "properties": { + "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameStorageDfs_var'))]" + } + } + ] + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameStorageDfs_var'))]", + "[resourceId('Microsoft.Network/privateEndpoints', variables('adlsPrivateDnsZoneName_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", + "apiVersion": "2021-02-01", + "name": "[format('{0}/{1}', variables('filePrivateDnsZoneName_var'), 'default')]", + "properties": { + "privateDnsZoneConfigs": [ + { + "name": "privatelink-file-core-windows-net", + "properties": { + "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameStorageFile_var'))]" + } + } + ] + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', variables('filePrivateDnsZoneName_var'))]", + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameStorageFile_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", + "apiVersion": "2021-02-01", + "name": "[format('{0}/{1}', variables('blobPrivateDnsZoneName_var'), 'default')]", + "properties": { + "privateDnsZoneConfigs": [ + { + "name": "privatelink-blob-core-windows-net", + "properties": { + "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameStorageBlob_var'))]" + } + } + ] + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', variables('blobPrivateDnsZoneName_var'))]", + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameStorageBlob_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateEndpoints", + "apiVersion": "2021-02-01", + "name": "[variables('keyvaultPrivateEndpointName_var')]", + "location": "[parameters('privateLinkLocation')]", + "properties": { + "privateLinkServiceConnections": [ + { + "name": "[variables('keyvaultPrivateEndpointName_var')]", + "properties": { + "privateLinkServiceId": "[parameters('keyvaultPrivateLinkResource')]", + "groupIds": [ + "vault" + ] + } + } + ], + "subnet": { + "id": "[parameters('privateLinkSubnetId')]" + } + }, + "tags": {} + }, + { + "type": "Microsoft.Network/privateDnsZones", + "apiVersion": "2020-06-01", + "name": "[variables('privateDnsNameVault_var')]", + "location": "global", + "tags": {}, + "properties": {}, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', variables('keyvaultPrivateEndpointName_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks", + "apiVersion": "2020-06-01", + "name": "[format('{0}/{1}', variables('privateDnsNameVault_var'), parameters('vnetName'))]", + "location": "global", + "properties": { + "virtualNetwork": { + "id": "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]" + }, + "registrationEnabled": false + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameVault_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", + "apiVersion": "2021-02-01", + "name": "[format('{0}/{1}', variables('keyvaultPrivateEndpointName_var'), 'default')]", + "properties": { + "privateDnsZoneConfigs": [ + { + "name": "privatelink-vaultcore-azure-net", + "properties": { + "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameVault_var'))]" + } + } + ] + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', variables('keyvaultPrivateEndpointName_var'))]", + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameVault_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateEndpoints", + "apiVersion": "2021-02-01", + "name": "[variables('eventHubPrivateEndpointName_var')]", + "location": "[parameters('privateLinkLocation')]", + "properties": { + "privateLinkServiceConnections": [ + { + "name": "[variables('eventHubPrivateEndpointName_var')]", + "properties": { + "privateLinkServiceId": "[parameters('eventHubPrivateLinkResource')]", + "groupIds": [ + "namespace" + ] + } + } + ], + "subnet": { + "id": "[parameters('privateLinkSubnetId')]" + } + } + }, + { + "type": "Microsoft.Network/privateDnsZones", + "apiVersion": "2020-06-01", + "name": "[variables('privateDnsNameEventHub_var')]", + "location": "global", + "tags": {}, + "properties": {}, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', variables('eventHubPrivateEndpointName_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks", + "apiVersion": "2020-06-01", + "name": "[format('{0}/{1}', variables('privateDnsNameEventHub_var'), parameters('vnetName'))]", + "location": "global", + "properties": { + "virtualNetwork": { + "id": "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]" + }, + "registrationEnabled": false + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameEventHub_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", + "apiVersion": "2021-02-01", + "name": "[format('{0}/{1}', variables('eventHubPrivateEndpointName_var'), 'default')]", + "properties": { + "privateDnsZoneConfigs": [ + { + "name": "privatelink-servicebus-windows-net", + "properties": { + "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameEventHub_var'))]" + } + } + ] + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', variables('eventHubPrivateEndpointName_var'))]", + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameEventHub_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateEndpoints", + "apiVersion": "2021-02-01", + "name": "[variables('amlPrivateEndpointName_var')]", + "location": "[parameters('privateLinkLocation')]", + "properties": { + "privateLinkServiceConnections": [ + { + "name": "[variables('amlPrivateEndpointName_var')]", + "properties": { + "privateLinkServiceId": "[parameters('amlPrivateLinkResource')]", + "groupIds": [ + "amlworkspace" + ] + } + } + ], + "subnet": { + "id": "[parameters('privateLinkSubnetId')]" + } + } + }, + { + "type": "Microsoft.Network/privateDnsZones", + "apiVersion": "2018-09-01", + "name": "[variables('privateDnsNameAmlApi_var')]", + "location": "global", + "properties": {} + }, + { + "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks", + "apiVersion": "2018-09-01", + "name": "[format('{0}/{1}', variables('privateDnsNameAmlApi_var'), 'privatelink_api_azureml_ms')]", + "location": "global", + "properties": { + "virtualNetwork": { + "id": "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]" + }, + "registrationEnabled": false + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameAmlApi_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateDnsZones", + "apiVersion": "2018-09-01", + "name": "[variables('privateDnsNameAmlNotebook_var')]", + "location": "global", + "properties": {} + }, + { + "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks", + "apiVersion": "2018-09-01", + "name": "[format('{0}/{1}', variables('privateDnsNameAmlNotebook_var'), 'privatelink_notebooks_azure_net')]", + "location": "global", + "properties": { + "virtualNetwork": { + "id": "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]" + }, + "registrationEnabled": false + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameAmlNotebook_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", + "apiVersion": "2020-03-01", + "name": "[format('{0}/{1}', variables('amlPrivateEndpointName_var'), 'default')]", + "properties": { + "privateDnsZoneConfigs": [ + { + "name": "privatelink-api-azureml-ms", + "properties": { + "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameAmlApi_var'))]" + } + }, + { + "name": "privatelink-notebooks-azure-net", + "properties": { + "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameAmlNotebook_var'))]" + } + } + ] + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', variables('amlPrivateEndpointName_var'))]", + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameAmlApi_var'))]", + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameAmlNotebook_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateEndpoints", + "apiVersion": "2021-02-01", + "name": "[variables('crPrivateEndpointName_var')]", + "location": "[parameters('privateLinkLocation')]", + "properties": { + "privateLinkServiceConnections": [ + { + "name": "[variables('crPrivateEndpointName_var')]", + "properties": { + "privateLinkServiceId": "[parameters('crPrivateLinkResource')]", + "groupIds": [ + "registry" + ] + } + } + ], + "subnet": { + "id": "[parameters('privateLinkSubnetId')]" + } + } + }, + { + "type": "Microsoft.Network/privateDnsZones", + "apiVersion": "2020-06-01", + "name": "[variables('privateDnsNameCr_var')]", + "location": "global", + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', variables('crPrivateEndpointName_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks", + "apiVersion": "2020-06-01", + "name": "[format('{0}/{1}', variables('privateDnsNameCr_var'), parameters('vnetName'))]", + "location": "global", + "properties": { + "virtualNetwork": { + "id": "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]" + }, + "registrationEnabled": false + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameCr_var'))]" + ] + }, + { + "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", + "apiVersion": "2021-02-01", + "name": "[format('{0}/{1}', variables('crPrivateEndpointName_var'), 'default')]", + "properties": { + "privateDnsZoneConfigs": [ + { + "name": "privatelink-azurecr-io", + "properties": { + "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameCr_var'))]" + } + } + ] + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', variables('crPrivateEndpointName_var'))]", + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsNameCr_var'))]" + ] + } + ] + } + }, + "dependsOn": [ + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'StorageAccount')]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'MLWorkspace')]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'EventHub')]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'KeyVault')]", + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'HubandSpokeVnets')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "DatabricksCluster", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "location": { + "value": "[parameters('location')]" + }, + "identity": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'ManagedIdentity'), '2019-10-01').outputs.mIdentityId.value]" + }, + "adb_workspace_url": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'DatabricksWorkspace'), '2019-10-01').outputs.databricks_workspaceUrl.value]" + }, + "adb_workspace_id": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'DatabricksWorkspace'), '2019-10-01').outputs.databricks_workspace_id.value]" + }, + "adb_secret_scope_name": { + "value": "[variables('adbAkvLinkName')]" + }, + "akv_id": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'KeyVault'), '2019-10-01').outputs.keyvault_id.value]" + }, + "akv_uri": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'KeyVault'), '2019-10-01').outputs.keyvault_uri.value]" + }, + "LogAWkspId": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'LogAnalytics'), '2019-10-01').outputs.logAnalyticsWkspId.value]" + }, + "LogAWkspKey": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'LogAnalytics'), '2019-10-01').outputs.primarySharedKey.value]" + }, + "storageKey": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'StorageAccount'), '2019-10-01').outputs.key1.value]" + }, + "evenHubKey": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'EventHub'), '2019-10-01').outputs.eHPConnString.value]" + }, + "eventHubId": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'EventHub'), '2019-10-01').outputs.eHubNameId.value]" + }, + "deployADBCluster": { + "value": "[parameters('deployADBCluster')]" + }, + "adb_pat_lifetime": { + "value": "[parameters('adb_pat_lifetime')]" + }, + "adb_cluster_name": { + "value": "[parameters('adb_cluster_name')]" + }, + "adb_spark_version": { + "value": "[parameters('adb_spark_version')]" + }, + "adb_node_type": { + "value": "[parameters('adb_node_type')]" + }, + "adb_num_worker": { + "value": "[parameters('adb_num_worker')]" + }, + "adb_auto_terminate_min": { + "value": "[parameters('adb_auto_terminate_min')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "14732904098596994959" + } + }, + "parameters": { + "location": { + "type": "string" + }, + "force_update": { + "type": "string", + "defaultValue": "[utcNow()]" + }, + "identity": { + "type": "string" + }, + "akv_id": { + "type": "string" + }, + "akv_uri": { + "type": "string" + }, + "adb_pat_lifetime": { + "type": "string" + }, + "adb_workspace_url": { + "type": "string" + }, + "adb_workspace_id": { + "type": "string" + }, + "adb_secret_scope_name": { + "type": "string" + }, + "adb_cluster_name": { + "type": "string" + }, + "adb_spark_version": { + "type": "string" + }, + "adb_node_type": { + "type": "string" + }, + "adb_num_worker": { + "type": "string" + }, + "adb_auto_terminate_min": { + "type": "string" + }, + "LogAWkspId": { + "type": "string" + }, + "LogAWkspKey": { + "type": "string" + }, + "storageKey": { + "type": "string" + }, + "evenHubKey": { + "type": "string" + }, + "eventHubId": { + "type": "string" + }, + "deployADBCluster": { + "type": "bool" + } + }, + "functions": [], + "resources": [ + { + "condition": "[parameters('deployADBCluster')]", + "type": "Microsoft.Resources/deploymentScripts", + "apiVersion": "2020-10-01", + "name": "createAdbPATToken", + "location": "[parameters('location')]", + "kind": "AzureCLI", + "identity": { + "type": "UserAssigned", + "userAssignedIdentities": { + "[parameters('identity')]": {} + } + }, + "properties": { + "azCliVersion": "2.26.0", + "timeout": "PT5M", + "cleanupPreference": "OnExpiration", + "retentionInterval": "PT1H", + "environmentVariables": [ + { + "name": "ADB_WORKSPACE_URL", + "value": "[parameters('adb_workspace_url')]" + }, + { + "name": "ADB_WORKSPACE_ID", + "value": "[parameters('adb_workspace_id')]" + }, + { + "name": "PAT_LIFETIME", + "value": "[parameters('adb_pat_lifetime')]" + } + ], + "scriptContent": "#/bin/bash -e\npat_token_config=$(jq -n -c \\\n --arg ls \"$PAT_LIFETIME\" \\\n --arg co \"Example Token created by Bicep deployment\" \\\n '{lifetime_seconds: ($ls|tonumber),\n comment: $co}')\n\nadbGlobalToken=$(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --output json | jq -r .accessToken)\nazureApiToken=$(az account get-access-token --resource https://management.core.windows.net/ --output json | jq -r .accessToken)\n\nauthHeader=\"Authorization: Bearer $adbGlobalToken\"\nadbSPMgmtToken=\"X-Databricks-Azure-SP-Management-Token:$azureApiToken\"\nadbResourceId=\"X-Databricks-Azure-Workspace-Resource-Id:$ADB_WORKSPACE_ID\"\njson=$(echo \"$pat_token_config\" | curl -sS -X POST -H \"$authHeader\" -H \"$adbSPMgmtToken\" -H \"$adbResourceId\" --data-binary \"@-\" \"https://${ADB_WORKSPACE_URL}/api/2.0/token/create\")\n\necho \"$json\" >\"$AZ_SCRIPTS_OUTPUT_PATH\"\n" + } + }, + { + "condition": "[parameters('deployADBCluster')]", + "type": "Microsoft.Resources/deploymentScripts", + "apiVersion": "2020-10-01", + "name": "secretScopeLink", + "location": "[parameters('location')]", + "kind": "AzureCLI", + "identity": { + "type": "UserAssigned", + "userAssignedIdentities": { + "[parameters('identity')]": {} + } + }, + "properties": { + "azCliVersion": "2.26.0", + "timeout": "PT1H", + "cleanupPreference": "OnExpiration", + "retentionInterval": "PT1H", + "environmentVariables": [ + { + "name": "ADB_WORKSPACE_URL", + "value": "[parameters('adb_workspace_url')]" + }, + { + "name": "ADB_WORKSPACE_ID", + "value": "[parameters('adb_workspace_id')]" + }, + { + "name": "ADB_SECRET_SCOPE_NAME", + "value": "[parameters('adb_secret_scope_name')]" + }, + { + "name": "AKV_ID", + "value": "[parameters('akv_id')]" + }, + { + "name": "AKV_URI", + "value": "[parameters('akv_uri')]" + }, + { + "name": "ADB_LOG_WKSP_ID", + "value": "[parameters('LogAWkspId')]" + }, + { + "name": "ADB_LOG_WKSP_KEY", + "value": "[parameters('LogAWkspKey')]" + }, + { + "name": "STORAGE_ACCESS_KEY", + "value": "[parameters('storageKey')]" + }, + { + "name": "EVENT_HUB_KEY", + "value": "[parameters('evenHubKey')]" + }, + { + "name": "ADB_PAT_TOKEN", + "value": "[reference(resourceId('Microsoft.Resources/deploymentScripts', 'createAdbPATToken')).outputs.token_value]" + } + ], + "scriptContent": "#/bin/bash -e\n\n# TODO: Create AKV backed secret scope using User assigned managed identity. Currently not supported\n# akv_backed='{\"resource_id\": \"'${AKV_ID}'\",\"dns_name\": \"'${AKV_URI}'\"}'\n# akv_secret_scope_payload=$(\n# jq -n -c \\\n# --arg sc \"akv_test\" \\\n# --arg bak \"$akv_backed\" \\\n# '{\n# scope: $sc,\n# scope_backend_type: \"AZURE_KEYVAULT\",\n# initial_manage_principal: \"users\",\n# backend_azure_keyvault: ($bak|fromjson)\n# }'\n# )\n\n# Create secret scope backed by ADB\nadb_secret_scope_payload=$(\n jq -n -c \\\n --arg sc \"$ADB_SECRET_SCOPE_NAME\" \\\n '{\n scope: $sc,\n initial_manage_principal: \"users\"\n }'\n)\n\nadbGlobalToken=$(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --output json | jq -r .accessToken)\nazureApiToken=$(az account get-access-token --resource https://management.core.windows.net/ --output json | jq -r .accessToken)\n\nauthHeader=\"Authorization: Bearer $adbGlobalToken\"\nadbSPMgmtToken=\"X-Databricks-Azure-SP-Management-Token:$azureApiToken\"\nadbResourceId=\"X-Databricks-Azure-Workspace-Resource-Id:$ADB_WORKSPACE_ID\"\n\necho \"Create ADB secret scope backed by Databricks key vault\"\njson=$(echo $adb_secret_scope_payload | curl -sS -X POST -H \"$authHeader\" -H \"$adbSPMgmtToken\" -H \"$adbResourceId\" --data-binary \"@-\" \"https://${ADB_WORKSPACE_URL}/api/2.0/secrets/scopes/create\")\n\nfunction createKey() {\n local keyName=$1\n local secretValue=$2\n json_payload=$(\n jq -n -c \\\n --arg sc \"$ADB_SECRET_SCOPE_NAME\" \\\n --arg k \"$keyName\" \\\n --arg v \"$secretValue\" \\\n '{\n scope: $sc,\n key: $k,\n string_value: $v\n }'\n )\n response=$(echo $json_payload | curl -sS -X POST -H \"$authHeader\" -H \"$adbSPMgmtToken\" -H \"$adbResourceId\" --data-binary \"@-\" \"https://${ADB_WORKSPACE_URL}/api/2.0/secrets/put\")\n echo $response\n\n}\n\ncreateKey \"LogAWkspId\" \"$ADB_LOG_WKSP_ID\"\ncreateKey \"LogAWkspkey\" \"$ADB_LOG_WKSP_KEY\"\nC_ADB_PAT_TOKEN=$(sed -e 's/[\\\"\\\\]//g' <<<$ADB_PAT_TOKEN)\ncreateKey \"dbPATKey\" \"$C_ADB_PAT_TOKEN\"\ncreateKey \"ehKey\" \"$EVENT_HUB_KEY\"\ncreateKey \"stgAccessKey\" \"$STORAGE_ACCESS_KEY\"\n\necho \"$json\" >\"$AZ_SCRIPTS_OUTPUT_PATH\"\n\n# tail -f /dev/null" + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deploymentScripts', 'createAdbPATToken')]" + ] + }, + { + "condition": "[parameters('deployADBCluster')]", + "type": "Microsoft.Resources/deploymentScripts", + "apiVersion": "2020-10-01", + "name": "uploadFilesToAdb", + "location": "[parameters('location')]", + "kind": "AzureCLI", + "identity": { + "type": "UserAssigned", + "userAssignedIdentities": { + "[parameters('identity')]": {} + } + }, + "properties": { + "azCliVersion": "2.26.0", + "timeout": "PT5M", + "cleanupPreference": "OnExpiration", + "retentionInterval": "PT1H", + "environmentVariables": [ + { + "name": "ADB_WORKSPACE_URL", + "value": "[parameters('adb_workspace_url')]" + }, + { + "name": "ADB_WORKSPACE_ID", + "value": "[parameters('adb_workspace_id')]" + }, + { + "name": "EVENT_HUB_ID", + "value": "[parameters('eventHubId')]" + } + ], + "scriptContent": "#/bin/bash -e\nUSER_FOLDER=$(pwd)\n\nadbGlobalToken=$(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --output json | jq -r .accessToken)\nazureApiToken=$(az account get-access-token --resource https://management.core.windows.net/ --output json | jq -r .accessToken)\n\nauthHeader=\"Authorization: Bearer $adbGlobalToken\"\nadbSPMgmtToken=\"X-Databricks-Azure-SP-Management-Token:$azureApiToken\"\nadbResourceId=\"X-Databricks-Azure-Workspace-Resource-Id:$ADB_WORKSPACE_ID\"\n\necho \"Download init script\"\nmkdir -p init_scripts && cd init_scripts\ncurl -L \\\n -O \"https://raw.githubusercontent.com/lordlinus/databricks-all-in-one-bicep-template/main/databricks/init_scripts/capture_log_metrics.sh\"\ncd $USER_FOLDER\n\necho \"Upload init script to /databricks/init/capture_log_metrics.sh\"\ncurl -sS -X POST -H \"$authHeader\" -H \"$adbSPMgmtToken\" -H \"$adbResourceId\" \\\n https://${ADB_WORKSPACE_URL}/api/2.0/dbfs/put \\\n --form contents=@init_scripts/capture_log_metrics.sh \\\n --form path=\"/databricks/init/capture_log_metrics.sh\" \\\n --form overwrite=true\n\necho \"Download Sample notebooks\"\nmkdir -p notebooks && cd notebooks\ncurl -L \\\n -O \"https://raw.githubusercontent.com/lordlinus/databricks-all-in-one-bicep-template/00a2978db789d1f1edf63603666d37a1ab72c86f/databricks/notebooks/azure_runner_docs_example.ipynb\" \\\n -O \"https://raw.githubusercontent.com/lordlinus/databricks-all-in-one-bicep-template/00a2978db789d1f1edf63603666d37a1ab72c86f/databricks/notebooks/timezone_test.ipynb\"\ncd $USER_FOLDER\n\necho \"Upload Sample notebooks\"\nfor notebook in notebooks/*.ipynb; do\n filename=$(basename $notebook)\n echo \"Upload sample notebook $notebook to workspace\"\n curl -sS -X POST -H \"$authHeader\" -H \"$adbSPMgmtToken\" -H \"$adbResourceId\" \\\n https://${ADB_WORKSPACE_URL}/api/2.0/workspace/import \\\n --form contents=@\"$notebook\" \\\n --form path=\"/Shared/$filename\" \\\n --form format=JUPYTER \\\n --form language=SCALA \\\n --form overwrite=true\ndone\n\necho \"Download Loganalytics jar files\"\nmkdir -p jars && cd jars\ncurl -L \\\n -O \"https://raw.githubusercontent.com/lordlinus/databricks-all-in-one-bicep-template/00a2978db789d1f1edf63603666d37a1ab72c86f/databricks/jars/spark-listeners-loganalytics_3.0.1_2.12-1.0.0.jar\" \\\n -O \"https://raw.githubusercontent.com/lordlinus/databricks-all-in-one-bicep-template/00a2978db789d1f1edf63603666d37a1ab72c86f/databricks/jars/spark-listeners_3.0.1_2.12-1.0.0.jar\"\ncd $USER_FOLDER\n\necho \"Upload jar files\"\nfor jar_file in jars/*.jar; do\n filename=$(basename $jar_file)\n echo \"Upload $jar_file file to DBFS path\"\n curl -sS -X POST -H \"$authHeader\" -H \"$adbSPMgmtToken\" -H \"$adbResourceId\" \\\n https://${ADB_WORKSPACE_URL}/api/2.0/dbfs/put \\\n --form filedata=@\"$jar_file\" \\\n --form path=\"/FileStore/jars/$filename\" \\\n --form overwrite=true\ndone\n\n# Get ADB log categories\nadb_logs_types=$(az monitor diagnostic-settings categories list --resource $ADB_WORKSPACE_ID | jq -c '.value[] | {category: .name, enabled:true}' | jq --slurp .)\n\n# Enable monitoring for all the categories\nadb_monitoring=$(az monitor diagnostic-settings create \\\n --name sparkmonitor \\\n --event-hub $EVENT_HUB_ID \\\n --event-hub-rule \"RootManageSharedAccessKey\" \\\n --resource $ADB_WORKSPACE_ID \\\n --logs \"$adb_logs_types\")" + } + }, + { + "condition": "[parameters('deployADBCluster')]", + "type": "Microsoft.Resources/deploymentScripts", + "apiVersion": "2020-10-01", + "name": "createAdbCluster", + "location": "[parameters('location')]", + "kind": "AzureCLI", + "identity": { + "type": "UserAssigned", + "userAssignedIdentities": { + "[parameters('identity')]": {} + } + }, + "properties": { + "azCliVersion": "2.26.0", + "timeout": "PT5M", + "retentionInterval": "PT1H", + "cleanupPreference": "OnExpiration", + "forceUpdateTag": "[parameters('force_update')]", + "environmentVariables": [ + { + "name": "ADB_WORKSPACE_URL", + "value": "[parameters('adb_workspace_url')]" + }, + { + "name": "ADB_WORKSPACE_ID", + "value": "[parameters('adb_workspace_id')]" + }, + { + "name": "ADB_SECRET_SCOPE_NAME", + "value": "[parameters('adb_secret_scope_name')]" + }, + { + "name": "DATABRICKS_CLUSTER_NAME", + "value": "[parameters('adb_cluster_name')]" + }, + { + "name": "DATABRICKS_SPARK_VERSION", + "value": "[parameters('adb_spark_version')]" + }, + { + "name": "DATABRICKS_NODE_TYPE", + "value": "[parameters('adb_node_type')]" + }, + { + "name": "DATABRICKS_NUM_WORKERS", + "value": "[parameters('adb_num_worker')]" + }, + { + "name": "DATABRICKS_AUTO_TERMINATE_MINUTES", + "value": "[parameters('adb_auto_terminate_min')]" + } + ], + "scriptContent": "#/bin/bash -e\n\n# Databricks cluster config variables\nDATABRICKS_SPARK_CONF='{\n \"spark.databricks.delta.preview.enabled\": \"true\",\n \"spark.eventLog.unknownRecord.maxSize\":\"16m\"\n }'\nDATABRICKS_INIT_CONFIG='{\n \"dbfs\": {\n \"destination\": \"dbfs:/databricks/init/capture_log_metrics.sh\"\n }\n }'\nDATABRICKS_ENV_VARS='{\n \"LOG_ANALYTICS_WORKSPACE_ID\": \"{{secrets/'$ADB_SECRET_SCOPE_NAME'/LogAWkspId}}\",\n \"LOG_ANALYTICS_WORKSPACE_KEY\": \"{{secrets/'$ADB_SECRET_SCOPE_NAME'/LogAWkspkey}}\"\n }'\nDATABRICKS_CLUSTER_LOG='{\n \"dbfs\": {\n \"destination\": \"dbfs:/logs\"\n }\n}'\n\n# Databricks Auth headers\nadbGlobalToken=$(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --output json | jq -r .accessToken)\nazureApiToken=$(az account get-access-token --resource https://management.core.windows.net/ --output json | jq -r .accessToken)\n\n# Create Auth header for Databricks\nauthHeader=\"Authorization: Bearer $adbGlobalToken\"\nadbSPMgmtToken=\"X-Databricks-Azure-SP-Management-Token:$azureApiToken\"\nadbResourceId=\"X-Databricks-Azure-Workspace-Resource-Id:$ADB_WORKSPACE_ID\"\n\necho \"Create Cluster\"\n\nCLUSTER_CREATE_JSON_STRING=$(jq -n -c \\\n --arg cn \"$DATABRICKS_CLUSTER_NAME\" \\\n --arg sv \"$DATABRICKS_SPARK_VERSION\" \\\n --arg nt \"$DATABRICKS_NODE_TYPE\" \\\n --arg nw \"$DATABRICKS_NUM_WORKERS\" \\\n --arg spc \"$DATABRICKS_SPARK_CONF\" \\\n --arg at \"$DATABRICKS_AUTO_TERMINATE_MINUTES\" \\\n --arg is \"$DATABRICKS_INIT_CONFIG\" \\\n --arg ev \"$DATABRICKS_ENV_VARS\" \\\n --arg cl \"$DATABRICKS_CLUSTER_LOG\" \\\n '{cluster_name: $cn,\n idempotency_token: $cn,\n spark_version: $sv,\n node_type_id: $nt,\n num_workers: ($nw|tonumber),\n autotermination_minutes: ($at|tonumber),\n spark_conf: ($spc|fromjson),\n init_scripts: ($is|fromjson),\n spark_env_vars: ($ev|fromjson),\n cluster_log_conf: ($cl|fromjson)\n }')\n\njson=$(echo $CLUSTER_CREATE_JSON_STRING | curl -sS -X POST -H \"$authHeader\" -H \"$adbSPMgmtToken\" -H \"$adbResourceId\" --data-binary \"@-\" \"https://${ADB_WORKSPACE_URL}/api/2.0/clusters/create\")\necho \"$json\" >$AZ_SCRIPTS_OUTPUT_PATH\n" + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deploymentScripts', 'secretScopeLink')]", + "[resourceId('Microsoft.Resources/deploymentScripts', 'uploadFilesToAdb')]" + ] + }, + { + "condition": "[parameters('deployADBCluster')]", + "type": "Microsoft.Resources/deploymentScripts", + "apiVersion": "2020-10-01", + "name": "configAdbCluster", + "location": "[parameters('location')]", + "kind": "AzureCLI", + "identity": { + "type": "UserAssigned", + "userAssignedIdentities": { + "[parameters('identity')]": {} + } + }, + "properties": { + "azCliVersion": "2.26.0", + "timeout": "PT5M", + "retentionInterval": "PT1H", + "cleanupPreference": "OnExpiration", + "forceUpdateTag": "[parameters('force_update')]", + "environmentVariables": [ + { + "name": "ADB_WORKSPACE_URL", + "value": "[parameters('adb_workspace_url')]" + }, + { + "name": "ADB_WORKSPACE_ID", + "value": "[parameters('adb_workspace_id')]" + }, + { + "name": "ADB_CLUSTER_ID", + "value": "[reference(resourceId('Microsoft.Resources/deploymentScripts', 'createAdbCluster')).outputs.cluster_id]" + } + ], + "scriptContent": "#/bin/bash -e\n\nadbGlobalToken=$(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --output json | jq -r .accessToken)\nazureApiToken=$(az account get-access-token --resource https://management.core.windows.net/ --output json | jq -r .accessToken)\n\nauthHeader=\"Authorization: Bearer $adbGlobalToken\"\nadbSPMgmtToken=\"X-Databricks-Azure-SP-Management-Token:$azureApiToken\"\nadbResourceId=\"X-Databricks-Azure-Workspace-Resource-Id:$ADB_WORKSPACE_ID\"\n\nlibraries='[\n {\n \"jar\": \"dbfs:/FileStore/jars/spark-listeners_3.0.1_2.12-1.0.0.jar\"\n },\n {\n \"jar\": \"dbfs:/FileStore/jars/spark-listeners-loganalytics_3.0.1_2.12-1.0.0.jar\"\n },\n {\n \"maven\": {\n \"coordinates\": \"com.databricks.labs:overwatch_2.12:0.5.0.4\"\n }\n },\n {\n \"maven\": {\n \"coordinates\": \"com.microsoft.azure:azure-eventhubs-spark_2.12:2.3.18\"\n }\n }\n ]'\n\nlibrary_config=$(\n jq -n -c \\\n --arg aci \"$ADB_CLUSTER_ID\" \\\n --arg li \"$libraries\" \\\n '{\n cluster_id: $aci,\n libraries: ($li|fromjson)\n }'\n)\n\njson=$(echo $library_config | curl -sS -X POST -H \"$authHeader\" -H \"$adbSPMgmtToken\" -H \"$adbResourceId\" --data-binary \"@-\" \"https://${ADB_WORKSPACE_URL}/api/2.0/libraries/install\")\n\necho \"$json\" >\"$AZ_SCRIPTS_OUTPUT_PATH\"\n\n# echo \"Create Overwatch Job\"\n# JOB_CREATE_JSON_STRING=$(jq -n -c \\\n# --arg ci \"$cluster_id\" \\\n# '{name: \"overwatch-job\",\n# existing_cluster_id: $ci,\n# notebook_task: {\n# \"notebook_path\": \"/Shared/azure_runner_docs_example.ipynb\"\n# }\n# }')\n# create_notebook_job=$(echo $JOB_CREATE_JSON_STRING | d_curl \"https://${adbWorkspaceUrl}/api/2.0/jobs/create\")\n# echo $create_notebook_job\n\necho \"Configuring services done\"\n" + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deploymentScripts', 'createAdbCluster')]" + ] + } + ], + "outputs": { + "patToken": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deploymentScripts', 'createAdbPATToken')).outputs.token_value]" + } + } + } + }, + "dependsOn": [ + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'DatabricksWorkspace')]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'StorageAccount')]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'EventHub')]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'KeyVault')]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'LogAnalytics')]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'ManagedIdentity')]", + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "CreateAksCluster", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "aksSubnetId": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'HubandSpokeVnets'), '2019-10-01').outputs.aksSubnet_id.value]" + }, + "aksAgentCount": { + "value": "[parameters('aksAgentCount')]" + }, + "aksAgentVMSize": { + "value": "[parameters('aksAgentVMSize')]" + }, + "dnsPrefix": { + "value": "[variables('aksDNSPrefix')]" + }, + "clusterName": { + "value": "[variables('aksAmlComputeName')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "1743251093094924688" + } + }, + "parameters": { + "aksAgentCount": { + "type": "int" + }, + "aksAgentVMSize": { + "type": "string" + }, + "aksSubnetId": { + "type": "string" + }, + "dnsPrefix": { + "type": "string" + }, + "maxPods": { + "type": "int", + "defaultValue": 110 + }, + "clusterName": { + "type": "string", + "metadata": { + "description": "The name of the Managed Cluster resource." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + } + }, + "functions": [], + "resources": [ + { + "type": "Microsoft.ContainerService/managedClusters", + "apiVersion": "2021-07-01", + "name": "[parameters('clusterName')]", + "location": "[parameters('location')]", + "identity": { + "type": "SystemAssigned" + }, + "properties": { + "dnsPrefix": "[parameters('dnsPrefix')]", + "networkProfile": { + "networkPlugin": "kubenet", + "loadBalancerSku": "standard", + "dnsServiceIP": "10.0.0.10", + "dockerBridgeCidr": "172.17.0.1/16", + "podCidr": "10.244.0.0/16" + }, + "agentPoolProfiles": [ + { + "name": "agentpool", + "count": "[parameters('aksAgentCount')]", + "vmSize": "[parameters('aksAgentVMSize')]", + "type": "VirtualMachineScaleSets", + "mode": "System", + "osType": "Linux", + "vnetSubnetID": "[parameters('aksSubnetId')]", + "maxPods": "[parameters('maxPods')]" + } + ], + "nodeResourceGroup": "[format('MC_{0}_{1}_{2}', resourceGroup().name, parameters('clusterName'), parameters('location'))]" + } + } + ], + "outputs": { + "aksClusterResourceId": { + "type": "string", + "value": "[resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName'))]" + }, + "kubeletidentity": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName'))).identityProfile.kubeletidentity.objectId]" + } + } + } + }, + "dependsOn": [ + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'HubandSpokeVnets')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "MLWorkspace", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "amlWorkspaceName": { + "value": "[variables('amlWorkspaceName')]" + }, + "containerRegistryName": { + "value": "[variables('containerRegistryName')]" + }, + "keyVaultIdentifierId": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'KeyVault'), '2019-10-01').outputs.keyvault_id.value]" + }, + "storageAccount": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'StorageAccount'), '2019-10-01').outputs.storageaccount_id.value]" + }, + "applicationInsightsName": { + "value": "[variables('applicationInsightsName')]" + }, + "aksClusterId": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'CreateAksCluster'), '2019-10-01').outputs.aksClusterResourceId.value]" + }, + "aksAmlComputeName": { + "value": "[variables('aksAmlComputeName')]" + }, + "aksClusterPrincipleId": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'CreateAksCluster'), '2019-10-01').outputs.kubeletidentity.value]" + }, + "sslLeafName": { + "value": "[variables('sslLeafName')]" + }, + "linkAkstoAml": { + "value": "[parameters('linkAkstoAml')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "11483396000871316490" + } + }, + "parameters": { + "keyVaultIdentifierId": { + "type": "string" + }, + "storageAccount": { + "type": "string" + }, + "amlWorkspaceName": { + "type": "string" + }, + "containerRegistryName": { + "type": "string" + }, + "applicationInsightsName": { + "type": "string" + }, + "aksClusterPrincipleId": { + "type": "string" + }, + "aksAmlComputeName": { + "type": "string" + }, + "aksClusterId": { + "type": "string" + }, + "sslLeafName": { + "type": "string" + }, + "linkAkstoAml": { + "type": "bool" + } + }, + "functions": [], + "variables": { + "acrPullRoleDefId": "7f951dda-4ed3-4680-a7ca-43fe172d538d", + "location": "[resourceGroup().location]" + }, + "resources": [ + { + "type": "Microsoft.ContainerRegistry/registries", + "apiVersion": "2021-06-01-preview", + "name": "[parameters('containerRegistryName')]", + "location": "[variables('location')]", + "sku": { + "name": "Premium" + }, + "properties": { + "anonymousPullEnabled": false, + "dataEndpointEnabled": true, + "adminUserEnabled": true, + "publicNetworkAccess": "Enabled", + "networkRuleBypassOptions": "AzureServices" + } + }, + { + "type": "Microsoft.Authorization/roleAssignments", + "apiVersion": "2020-08-01-preview", + "scope": "[format('Microsoft.ContainerRegistry/registries/{0}', parameters('containerRegistryName'))]", + "name": "[parameters('aksClusterPrincipleId')]", + "properties": { + "principalId": "[parameters('aksClusterPrincipleId')]", + "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', variables('acrPullRoleDefId'))]" + }, + "dependsOn": [ + "[resourceId('Microsoft.ContainerRegistry/registries', parameters('containerRegistryName'))]" + ] + }, + { + "type": "Microsoft.Insights/components", + "apiVersion": "2018-05-01-preview", + "name": "[parameters('applicationInsightsName')]", + "location": "[variables('location')]", + "kind": "web", + "properties": { + "Application_Type": "web" + } + }, + { + "type": "Microsoft.MachineLearningServices/workspaces", + "apiVersion": "2021-04-01", + "name": "[parameters('amlWorkspaceName')]", + "location": "[variables('location')]", + "identity": { + "type": "SystemAssigned" + }, + "properties": { + "friendlyName": "[parameters('amlWorkspaceName')]", + "storageAccount": "[parameters('storageAccount')]", + "keyVault": "[parameters('keyVaultIdentifierId')]", + "applicationInsights": "[resourceId('Microsoft.Insights/components', parameters('applicationInsightsName'))]", + "containerRegistry": "[resourceId('Microsoft.ContainerRegistry/registries', parameters('containerRegistryName'))]", + "allowPublicAccessWhenBehindVnet": true + }, + "dependsOn": [ + "[resourceId('Microsoft.Insights/components', parameters('applicationInsightsName'))]", + "[resourceId('Microsoft.ContainerRegistry/registries', parameters('containerRegistryName'))]" + ] + }, + { + "condition": "[parameters('linkAkstoAml')]", + "type": "Microsoft.MachineLearningServices/workspaces/computes", + "apiVersion": "2021-07-01", + "name": "[format('{0}/{1}', parameters('amlWorkspaceName'), parameters('aksAmlComputeName'))]", + "location": "[variables('location')]", + "properties": { + "computeType": "AKS", + "computeLocation": "[variables('location')]", + "resourceId": "[parameters('aksClusterId')]", + "description": "External AKS cluster to provide inference REST endpoint", + "properties": { + "clusterPurpose": "FastProd", + "sslConfiguration": { + "status": "Auto", + "leafDomainLabel": "[parameters('sslLeafName')]", + "overwriteExistingDomain": true + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.MachineLearningServices/workspaces', parameters('amlWorkspaceName'))]" + ] + } + ], + "outputs": { + "amlId": { + "type": "string", + "value": "[resourceId('Microsoft.MachineLearningServices/workspaces', parameters('amlWorkspaceName'))]" + }, + "amlWkspName": { + "type": "string", + "value": "[parameters('amlWorkspaceName')]" + }, + "amlProperties": { + "type": "object", + "value": "[reference(resourceId('Microsoft.MachineLearningServices/workspaces', parameters('amlWorkspaceName')))]" + }, + "ctrRegistryName": { + "type": "string", + "value": "[parameters('containerRegistryName')]" + }, + "ctrRegistryId": { + "type": "string", + "value": "[resourceId('Microsoft.ContainerRegistry/registries', parameters('containerRegistryName'))]" + } + } + } + }, + "dependsOn": [ + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'StorageAccount')]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'CreateAksCluster')]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'KeyVault')]", + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2019-10-01", + "name": "UpdateSecretsKeyVault", + "resourceGroup": "[variables('resourceGroupName')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "EventHubPK": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'EventHub'), '2019-10-01').outputs.eHPConnString.value]" + }, + "keyVaultName": { + "value": "[variables('keyVaultName')]" + }, + "LogAWkspId": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'LogAnalytics'), '2019-10-01').outputs.logAnalyticsWkspId.value]" + }, + "LogAWkspkey": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'LogAnalytics'), '2019-10-01').outputs.primarySharedKey.value]" + }, + "StorageAccountKey1": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'StorageAccount'), '2019-10-01').outputs.key1.value]" + }, + "StorageAccountKey2": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'StorageAccount'), '2019-10-01').outputs.key2.value]" + }, + "DbPATKey": { + "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'DatabricksCluster'), '2019-10-01').outputs.patToken.value]" + }, + "updateAKVKeys": { + "value": "[parameters('updateAKVKeys')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.4.613.9944", + "templateHash": "417945022343519357" + } + }, + "parameters": { + "keyVaultName": { + "type": "string" + }, + "LogAWkspId": { + "type": "string" + }, + "LogAWkspkey": { + "type": "secureString" + }, + "StorageAccountKey1": { + "type": "secureString" + }, + "StorageAccountKey2": { + "type": "secureString" + }, + "EventHubPK": { + "type": "secureString" + }, + "DbPATKey": { + "type": "secureString" + }, + "updateAKVKeys": { + "type": "bool" + } + }, + "functions": [], + "resources": [ + { + "condition": "[parameters('updateAKVKeys')]", + "type": "Microsoft.KeyVault/vaults/secrets", + "apiVersion": "2021-04-01-preview", + "name": "[format('{0}/{1}', parameters('keyVaultName'), 'LogAWkspId')]", + "properties": { + "contentType": "text/plain", + "value": "[parameters('LogAWkspId')]" + } + }, + { + "condition": "[parameters('updateAKVKeys')]", + "type": "Microsoft.KeyVault/vaults/secrets", + "apiVersion": "2021-04-01-preview", + "name": "[format('{0}/{1}', parameters('keyVaultName'), 'LogAWkspkey')]", + "properties": { + "contentType": "text/plain", + "value": "[parameters('LogAWkspkey')]" + } + }, + { + "condition": "[parameters('updateAKVKeys')]", + "type": "Microsoft.KeyVault/vaults/secrets", + "apiVersion": "2021-04-01-preview", + "name": "[format('{0}/{1}', parameters('keyVaultName'), 'StorageAccountKey1')]", + "properties": { + "contentType": "text/plain", + "value": "[parameters('StorageAccountKey1')]" + } + }, + { + "condition": "[parameters('updateAKVKeys')]", + "type": "Microsoft.KeyVault/vaults/secrets", + "apiVersion": "2021-04-01-preview", + "name": "[format('{0}/{1}', parameters('keyVaultName'), 'StorageAccountKey2')]", + "properties": { + "contentType": "text/plain", + "value": "[parameters('StorageAccountKey2')]" + } + }, + { + "condition": "[parameters('updateAKVKeys')]", + "type": "Microsoft.KeyVault/vaults/secrets", + "apiVersion": "2021-04-01-preview", + "name": "[format('{0}/{1}', parameters('keyVaultName'), 'EventHubPK')]", + "properties": { + "contentType": "text/plain", + "value": "[parameters('EventHubPK')]" + } + }, + { + "condition": "[parameters('updateAKVKeys')]", + "type": "Microsoft.KeyVault/vaults/secrets", + "apiVersion": "2021-04-01-preview", + "name": "[format('{0}/{1}', parameters('keyVaultName'), 'DbPATKey')]", + "properties": { + "contentType": "text/plain", + "value": "[parameters('DbPATKey')]" + } + } + ] + } + }, + "dependsOn": [ + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'StorageAccount')]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'DatabricksCluster')]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'EventHub')]", + "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, variables('resourceGroupName')), 'Microsoft.Resources/deployments', 'LogAnalytics')]", + "[subscriptionResourceId('Microsoft.Resources/resourceGroups', variables('resourceGroupName'))]" + ] + } + ] +} \ No newline at end of file diff --git a/archive/single_tech_samples/databricks_all_in_one/azuredeploy.parameters.json b/archive/single_tech_samples/databricks_all_in_one/azuredeploy.parameters.json new file mode 100644 index 000000000..7f351e336 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/azuredeploy.parameters.json @@ -0,0 +1,121 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "prefix": { + "value": "abc" + }, + "adminUsername": { + "value": "adminuser" // Do not use admin + }, + "adminPassword": { + "value": "" // TODO: Fill in parameter value + }, + "linkAkstoAml": { + "value": true + }, + "deployADBCluster": { + "value": true + }, + "updateAKVKeys": { + "value": true + }, + "adb_pat_lifetime": { + "value": "3600" + }, + "adb_cluster_name": { + "value": "test-cluster-01" + }, + "adb_spark_version": { + "value": "7.3.x-scala2.12" + }, + "adb_node_type": { + "value": "Standard_D3_v2" + }, + "adb_num_worker": { + "value": "3" + }, + "adb_auto_terminate_min": { + "value": "30" + }, + "aksAgentCount": { + "value": 3 + }, + "aksAgentVMSize": { + "value": "Standard_A4_v2" + }, + "location": { + "value": "southeastasia" + }, + "hubVnetName": { + "value": "hubvnet" + }, + "spokeVnetName": { + "value": "spokevnet" + }, + "HubVnetCidr": { + "value": "10.0.0.0/16" + }, + "FirewallSubnetCidr": { + "value": "10.0.1.0/26" + }, + "clientDevicesSubnetCidr": { + "value": "10.0.200.0/24" + }, + "SpokeVnetCidr": { + "value": "10.179.0.0/16" + }, + "PrivateSubnetCidr": { + "value": "10.179.0.0/18" + }, + "PublicSubnetCidr": { + "value": "10.179.64.0/18" + }, + "AksSubnetCidr": { + "value": "10.179.128.0/18" + }, + "PrivateLinkSubnetCidr": { + "value": "10.179.192.0/18" + }, + "webappDestinationAddresses": { + "value": [ + "52.187.145.107/32", + "52.187.0.85/32" + ] + }, + "logBlobstorageDomains": { + "value": [ + "[format('dblogprodseasia.blob.{0}', environment().suffixes.storage)]" + ] + }, + "extendedInfraIp": { + "value": [ + "20.195.104.64/28" + ] + }, + "sccReplayDomain": { + "value": [ + "tunnel.southeastasia.azuredatabricks.net" + ] + }, + "metastoreDomains": { + "value": [ + "consolidated-southeastasia-prod-metastore.mysql.database.azure.com" + ] + }, + "eventHubEndpointDomain": { + "value": [ + "prod-southeastasia-observabilityeventhubs.servicebus.windows.net" + ] + }, + "artifactBlobStoragePrimaryDomains": { + "value": [ + "[format('dbartifactsprodseap.blob.{0}', environment().suffixes.storage)]", + "[format('arprodseapa1.blob.{0}', environment().suffixes.storage)]", + "[format('arprodseapa2.blob.{0}', environment().suffixes.storage)]", + "[format('arprodseapa3.blob.{0}', environment().suffixes.storage)]", + "[format('dbartifactsprodeap.blob.{0}', environment().suffixes.storage)]" + ] + } + } +} \ No newline at end of file diff --git a/archive/single_tech_samples/databricks_all_in_one/build.sh b/archive/single_tech_samples/databricks_all_in_one/build.sh new file mode 100644 index 000000000..6dad26a3b --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/build.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +unset username +unset password + +read -p 'Client PC Username: ' username +while true; do + read -s -p "Client PC Password: " password + echo + read -s -p "Client PC Password (again): " password2 + echo + [ "$password" = "$password2" ] && break + echo "Please try again" +done +echo "Ok" + +echo "Running Bicep Main deployment file" +bicep_output=$(az deployment sub create \ + --location "southeastasia" \ + --template-file main.bicep \ + --parameters adminUsername=$username \ + --parameters adminPassword=$password \ + --parameters linkAkstoAml=true \ + --parameters deployADBCluster=true \ + --parameters updateAKVKeys=true \ + --only-show-errors) + +if [[ -z "$bicep_output" ]]; then + echo "Deployment failed, check errors on Azure portal" + exit 1 +fi + +echo "$bicep_output" >output.json # save output +echo "Bicep deployment. Done" diff --git a/archive/single_tech_samples/databricks_all_in_one/databricks/deployment.template.bicep b/archive/single_tech_samples/databricks_all_in_one/databricks/deployment.template.bicep new file mode 100644 index 000000000..6509593cc --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/databricks/deployment.template.bicep @@ -0,0 +1,248 @@ +param location string +param force_update string = utcNow() +param identity string +param akv_id string +param akv_uri string +param adb_pat_lifetime string +param adb_workspace_url string +param adb_workspace_id string +param adb_secret_scope_name string +param adb_cluster_name string +param adb_spark_version string +param adb_node_type string +param adb_num_worker string +param adb_auto_terminate_min string +param LogAWkspId string +param LogAWkspKey string +param storageKey string +param evenHubKey string +param eventHubId string +param deployADBCluster bool + +resource createAdbPATToken 'Microsoft.Resources/deploymentScripts@2020-10-01' = if(deployADBCluster) { + name: 'createAdbPATToken' + location: location + kind: 'AzureCLI' + identity: { + type: 'UserAssigned' + userAssignedIdentities: { + '${identity}': {} + } + } + properties: { + azCliVersion: '2.26.0' + timeout: 'PT5M' + cleanupPreference: 'OnExpiration' + retentionInterval: 'PT1H' + environmentVariables: [ + { + name: 'ADB_WORKSPACE_URL' + value: adb_workspace_url + } + { + name: 'ADB_WORKSPACE_ID' + value: adb_workspace_id + } + { + name: 'PAT_LIFETIME' + value: adb_pat_lifetime + } + ] + scriptContent: loadTextContent('deployment/create_pat.sh') + } +} + +resource secretScopeLink 'Microsoft.Resources/deploymentScripts@2020-10-01' = if(deployADBCluster) { + name: 'secretScopeLink' + location: location + kind: 'AzureCLI' + identity: { + type: 'UserAssigned' + userAssignedIdentities: { + '${identity}': {} + } + } + properties: { + azCliVersion: '2.26.0' + timeout: 'PT1H' + cleanupPreference: 'OnExpiration' + retentionInterval: 'PT1H' + environmentVariables: [ + { + name: 'ADB_WORKSPACE_URL' + value: adb_workspace_url + } + { + name: 'ADB_WORKSPACE_ID' + value: adb_workspace_id + } + { + name: 'ADB_SECRET_SCOPE_NAME' + value: adb_secret_scope_name + } + { + name: 'AKV_ID' + value: akv_id + } + { + name: 'AKV_URI' + value: akv_uri + } + { + name: 'ADB_LOG_WKSP_ID' + value: LogAWkspId + } + { + name: 'ADB_LOG_WKSP_KEY' + value: LogAWkspKey + } + { + name: 'STORAGE_ACCESS_KEY' + value: storageKey + } + { + name: 'EVENT_HUB_KEY' + value: evenHubKey + } + { + name: 'ADB_PAT_TOKEN' + value: createAdbPATToken.properties.outputs.token_value + } + ] + scriptContent: loadTextContent('deployment/create_secret_scope.sh') + } + dependsOn: [ + createAdbPATToken + ] +} + +resource uploadFilesToAdb 'Microsoft.Resources/deploymentScripts@2020-10-01' = if(deployADBCluster) { + name: 'uploadFilesToAdb' + location: location + kind: 'AzureCLI' + identity: { + type: 'UserAssigned' + userAssignedIdentities: { + '${identity}': {} + } + } + properties: { + azCliVersion: '2.26.0' + timeout: 'PT5M' + cleanupPreference: 'OnExpiration' + retentionInterval: 'PT1H' + environmentVariables: [ + { + name: 'ADB_WORKSPACE_URL' + value: adb_workspace_url + } + { + name: 'ADB_WORKSPACE_ID' + value: adb_workspace_id + } + { + name: 'EVENT_HUB_ID' + value: eventHubId + } + ] + scriptContent: loadTextContent('deployment/pre_cluster_create.sh') + } +} + +resource createAdbCluster 'Microsoft.Resources/deploymentScripts@2020-10-01' = if(deployADBCluster) { + name: 'createAdbCluster' + location: location + kind: 'AzureCLI' + identity: { + type: 'UserAssigned' + userAssignedIdentities: { + '${identity}': {} + } + } + properties: { + azCliVersion: '2.26.0' + timeout: 'PT5M' + retentionInterval: 'PT1H' + cleanupPreference: 'OnExpiration' + forceUpdateTag: force_update + environmentVariables: [ + { + name: 'ADB_WORKSPACE_URL' + value: adb_workspace_url + } + { + name: 'ADB_WORKSPACE_ID' + value: adb_workspace_id + } + { + name: 'ADB_SECRET_SCOPE_NAME' + value: adb_secret_scope_name + } + { + name: 'DATABRICKS_CLUSTER_NAME' + value: adb_cluster_name + } + { + name: 'DATABRICKS_SPARK_VERSION' + value: adb_spark_version + } + { + name: 'DATABRICKS_NODE_TYPE' + value: adb_node_type + } + { + name: 'DATABRICKS_NUM_WORKERS' + value: adb_num_worker + } + { + name: 'DATABRICKS_AUTO_TERMINATE_MINUTES' + value: adb_auto_terminate_min + } + ] + scriptContent: loadTextContent('deployment/create_cluster.sh') + } + dependsOn: [ + secretScopeLink + uploadFilesToAdb + ] +} + +resource configAdbCluster 'Microsoft.Resources/deploymentScripts@2020-10-01' = if(deployADBCluster) { + name: 'configAdbCluster' + location: location + kind: 'AzureCLI' + identity: { + type: 'UserAssigned' + userAssignedIdentities: { + '${identity}': {} + } + } + properties: { + azCliVersion: '2.26.0' + timeout: 'PT5M' + retentionInterval: 'PT1H' + cleanupPreference: 'OnExpiration' + forceUpdateTag: force_update + environmentVariables: [ + { + name: 'ADB_WORKSPACE_URL' + value: adb_workspace_url + } + { + name: 'ADB_WORKSPACE_ID' + value: adb_workspace_id + } + { + name: 'ADB_CLUSTER_ID' + value: createAdbCluster.properties.outputs.cluster_id + } + ] + scriptContent: loadTextContent('deployment/post_cluster_create.sh') + } + dependsOn: [ + createAdbCluster + ] +} + +output patToken string = createAdbPATToken.properties.outputs.token_value +// output adbCluster object = createAdbCluster.properties diff --git a/archive/single_tech_samples/databricks_all_in_one/databricks/deployment/create_cluster.sh b/archive/single_tech_samples/databricks_all_in_one/databricks/deployment/create_cluster.sh new file mode 100644 index 000000000..d9023d096 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/databricks/deployment/create_cluster.sh @@ -0,0 +1,57 @@ +#/bin/bash -e + +# Databricks cluster config variables +DATABRICKS_SPARK_CONF='{ + "spark.databricks.delta.preview.enabled": "true", + "spark.eventLog.unknownRecord.maxSize":"16m" + }' +DATABRICKS_INIT_CONFIG='{ + "dbfs": { + "destination": "dbfs:/databricks/init/capture_log_metrics.sh" + } + }' +DATABRICKS_ENV_VARS='{ + "LOG_ANALYTICS_WORKSPACE_ID": "{{secrets/'$ADB_SECRET_SCOPE_NAME'/LogAWkspId}}", + "LOG_ANALYTICS_WORKSPACE_KEY": "{{secrets/'$ADB_SECRET_SCOPE_NAME'/LogAWkspkey}}" + }' +DATABRICKS_CLUSTER_LOG='{ + "dbfs": { + "destination": "dbfs:/logs" + } +}' + +# Databricks Auth headers +adbGlobalToken=$(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --output json | jq -r .accessToken) +azureApiToken=$(az account get-access-token --resource https://management.core.windows.net/ --output json | jq -r .accessToken) + +# Create Auth header for Databricks +authHeader="Authorization: Bearer $adbGlobalToken" +adbSPMgmtToken="X-Databricks-Azure-SP-Management-Token:$azureApiToken" +adbResourceId="X-Databricks-Azure-Workspace-Resource-Id:$ADB_WORKSPACE_ID" + +echo "Create Cluster" + +CLUSTER_CREATE_JSON_STRING=$(jq -n -c \ + --arg cn "$DATABRICKS_CLUSTER_NAME" \ + --arg sv "$DATABRICKS_SPARK_VERSION" \ + --arg nt "$DATABRICKS_NODE_TYPE" \ + --arg nw "$DATABRICKS_NUM_WORKERS" \ + --arg spc "$DATABRICKS_SPARK_CONF" \ + --arg at "$DATABRICKS_AUTO_TERMINATE_MINUTES" \ + --arg is "$DATABRICKS_INIT_CONFIG" \ + --arg ev "$DATABRICKS_ENV_VARS" \ + --arg cl "$DATABRICKS_CLUSTER_LOG" \ + '{cluster_name: $cn, + idempotency_token: $cn, + spark_version: $sv, + node_type_id: $nt, + num_workers: ($nw|tonumber), + autotermination_minutes: ($at|tonumber), + spark_conf: ($spc|fromjson), + init_scripts: ($is|fromjson), + spark_env_vars: ($ev|fromjson), + cluster_log_conf: ($cl|fromjson) + }') + +json=$(echo $CLUSTER_CREATE_JSON_STRING | curl -sS -X POST -H "$authHeader" -H "$adbSPMgmtToken" -H "$adbResourceId" --data-binary "@-" "https://${ADB_WORKSPACE_URL}/api/2.0/clusters/create") +echo "$json" >$AZ_SCRIPTS_OUTPUT_PATH diff --git a/archive/single_tech_samples/databricks_all_in_one/databricks/deployment/create_pat.sh b/archive/single_tech_samples/databricks_all_in_one/databricks/deployment/create_pat.sh new file mode 100644 index 000000000..1a5b8ddd5 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/databricks/deployment/create_pat.sh @@ -0,0 +1,16 @@ +#/bin/bash -e +pat_token_config=$(jq -n -c \ + --arg ls "$PAT_LIFETIME" \ + --arg co "Example Token created by Bicep deployment" \ + '{lifetime_seconds: ($ls|tonumber), + comment: $co}') + +adbGlobalToken=$(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --output json | jq -r .accessToken) +azureApiToken=$(az account get-access-token --resource https://management.core.windows.net/ --output json | jq -r .accessToken) + +authHeader="Authorization: Bearer $adbGlobalToken" +adbSPMgmtToken="X-Databricks-Azure-SP-Management-Token:$azureApiToken" +adbResourceId="X-Databricks-Azure-Workspace-Resource-Id:$ADB_WORKSPACE_ID" +json=$(echo "$pat_token_config" | curl -sS -X POST -H "$authHeader" -H "$adbSPMgmtToken" -H "$adbResourceId" --data-binary "@-" "https://${ADB_WORKSPACE_URL}/api/2.0/token/create") + +echo "$json" >"$AZ_SCRIPTS_OUTPUT_PATH" diff --git a/archive/single_tech_samples/databricks_all_in_one/databricks/deployment/create_secret_scope.sh b/archive/single_tech_samples/databricks_all_in_one/databricks/deployment/create_secret_scope.sh new file mode 100644 index 000000000..3aaf2e4bf --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/databricks/deployment/create_secret_scope.sh @@ -0,0 +1,65 @@ +#/bin/bash -e + +# TODO: Create AKV backed secret scope using User assigned managed identity. Currently not supported +# akv_backed='{"resource_id": "'${AKV_ID}'","dns_name": "'${AKV_URI}'"}' +# akv_secret_scope_payload=$( +# jq -n -c \ +# --arg sc "akv_test" \ +# --arg bak "$akv_backed" \ +# '{ +# scope: $sc, +# scope_backend_type: "AZURE_KEYVAULT", +# initial_manage_principal: "users", +# backend_azure_keyvault: ($bak|fromjson) +# }' +# ) + +# Create secret scope backed by ADB +adb_secret_scope_payload=$( + jq -n -c \ + --arg sc "$ADB_SECRET_SCOPE_NAME" \ + '{ + scope: $sc, + initial_manage_principal: "users" + }' +) + +adbGlobalToken=$(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --output json | jq -r .accessToken) +azureApiToken=$(az account get-access-token --resource https://management.core.windows.net/ --output json | jq -r .accessToken) + +authHeader="Authorization: Bearer $adbGlobalToken" +adbSPMgmtToken="X-Databricks-Azure-SP-Management-Token:$azureApiToken" +adbResourceId="X-Databricks-Azure-Workspace-Resource-Id:$ADB_WORKSPACE_ID" + +echo "Create ADB secret scope backed by Databricks key vault" +json=$(echo $adb_secret_scope_payload | curl -sS -X POST -H "$authHeader" -H "$adbSPMgmtToken" -H "$adbResourceId" --data-binary "@-" "https://${ADB_WORKSPACE_URL}/api/2.0/secrets/scopes/create") + +function createKey() { + local keyName=$1 + local secretValue=$2 + json_payload=$( + jq -n -c \ + --arg sc "$ADB_SECRET_SCOPE_NAME" \ + --arg k "$keyName" \ + --arg v "$secretValue" \ + '{ + scope: $sc, + key: $k, + string_value: $v + }' + ) + response=$(echo $json_payload | curl -sS -X POST -H "$authHeader" -H "$adbSPMgmtToken" -H "$adbResourceId" --data-binary "@-" "https://${ADB_WORKSPACE_URL}/api/2.0/secrets/put") + echo $response + +} + +createKey "LogAWkspId" "$ADB_LOG_WKSP_ID" +createKey "LogAWkspkey" "$ADB_LOG_WKSP_KEY" +C_ADB_PAT_TOKEN=$(sed -e 's/[\"\\]//g' <<<$ADB_PAT_TOKEN) +createKey "dbPATKey" "$C_ADB_PAT_TOKEN" +createKey "ehKey" "$EVENT_HUB_KEY" +createKey "stgAccessKey" "$STORAGE_ACCESS_KEY" + +echo "$json" >"$AZ_SCRIPTS_OUTPUT_PATH" + +# tail -f /dev/null \ No newline at end of file diff --git a/archive/single_tech_samples/databricks_all_in_one/databricks/deployment/post_cluster_create.sh b/archive/single_tech_samples/databricks_all_in_one/databricks/deployment/post_cluster_create.sh new file mode 100644 index 000000000..7b68f140c --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/databricks/deployment/post_cluster_create.sh @@ -0,0 +1,55 @@ +#/bin/bash -e + +adbGlobalToken=$(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --output json | jq -r .accessToken) +azureApiToken=$(az account get-access-token --resource https://management.core.windows.net/ --output json | jq -r .accessToken) + +authHeader="Authorization: Bearer $adbGlobalToken" +adbSPMgmtToken="X-Databricks-Azure-SP-Management-Token:$azureApiToken" +adbResourceId="X-Databricks-Azure-Workspace-Resource-Id:$ADB_WORKSPACE_ID" + +libraries='[ + { + "jar": "dbfs:/FileStore/jars/spark-listeners_3.0.1_2.12-1.0.0.jar" + }, + { + "jar": "dbfs:/FileStore/jars/spark-listeners-loganalytics_3.0.1_2.12-1.0.0.jar" + }, + { + "maven": { + "coordinates": "com.databricks.labs:overwatch_2.12:0.5.0.4" + } + }, + { + "maven": { + "coordinates": "com.microsoft.azure:azure-eventhubs-spark_2.12:2.3.18" + } + } + ]' + +library_config=$( + jq -n -c \ + --arg aci "$ADB_CLUSTER_ID" \ + --arg li "$libraries" \ + '{ + cluster_id: $aci, + libraries: ($li|fromjson) + }' +) + +json=$(echo $library_config | curl -sS -X POST -H "$authHeader" -H "$adbSPMgmtToken" -H "$adbResourceId" --data-binary "@-" "https://${ADB_WORKSPACE_URL}/api/2.0/libraries/install") + +echo "$json" >"$AZ_SCRIPTS_OUTPUT_PATH" + +# echo "Create Overwatch Job" +# JOB_CREATE_JSON_STRING=$(jq -n -c \ +# --arg ci "$cluster_id" \ +# '{name: "overwatch-job", +# existing_cluster_id: $ci, +# notebook_task: { +# "notebook_path": "/Shared/azure_runner_docs_example.ipynb" +# } +# }') +# create_notebook_job=$(echo $JOB_CREATE_JSON_STRING | d_curl "https://${adbWorkspaceUrl}/api/2.0/jobs/create") +# echo $create_notebook_job + +echo "Configuring services done" diff --git a/archive/single_tech_samples/databricks_all_in_one/databricks/deployment/pre_cluster_create.sh b/archive/single_tech_samples/databricks_all_in_one/databricks/deployment/pre_cluster_create.sh new file mode 100644 index 000000000..c1a86a280 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/databricks/deployment/pre_cluster_create.sh @@ -0,0 +1,71 @@ +#/bin/bash -e +USER_FOLDER=$(pwd) + +adbGlobalToken=$(az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --output json | jq -r .accessToken) +azureApiToken=$(az account get-access-token --resource https://management.core.windows.net/ --output json | jq -r .accessToken) + +authHeader="Authorization: Bearer $adbGlobalToken" +adbSPMgmtToken="X-Databricks-Azure-SP-Management-Token:$azureApiToken" +adbResourceId="X-Databricks-Azure-Workspace-Resource-Id:$ADB_WORKSPACE_ID" + +echo "Download init script" +mkdir -p init_scripts && cd init_scripts +curl -L \ + -O "https://raw.githubusercontent.com/lordlinus/databricks-all-in-one-bicep-template/main/databricks/init_scripts/capture_log_metrics.sh" +cd $USER_FOLDER + +echo "Upload init script to /databricks/init/capture_log_metrics.sh" +curl -sS -X POST -H "$authHeader" -H "$adbSPMgmtToken" -H "$adbResourceId" \ + https://${ADB_WORKSPACE_URL}/api/2.0/dbfs/put \ + --form contents=@init_scripts/capture_log_metrics.sh \ + --form path="/databricks/init/capture_log_metrics.sh" \ + --form overwrite=true + +echo "Download Sample notebooks" +mkdir -p notebooks && cd notebooks +curl -L \ + -O "https://raw.githubusercontent.com/lordlinus/databricks-all-in-one-bicep-template/00a2978db789d1f1edf63603666d37a1ab72c86f/databricks/notebooks/azure_runner_docs_example.ipynb" \ + -O "https://raw.githubusercontent.com/lordlinus/databricks-all-in-one-bicep-template/00a2978db789d1f1edf63603666d37a1ab72c86f/databricks/notebooks/timezone_test.ipynb" +cd $USER_FOLDER + +echo "Upload Sample notebooks" +for notebook in notebooks/*.ipynb; do + filename=$(basename $notebook) + echo "Upload sample notebook $notebook to workspace" + curl -sS -X POST -H "$authHeader" -H "$adbSPMgmtToken" -H "$adbResourceId" \ + https://${ADB_WORKSPACE_URL}/api/2.0/workspace/import \ + --form contents=@"$notebook" \ + --form path="/Shared/$filename" \ + --form format=JUPYTER \ + --form language=SCALA \ + --form overwrite=true +done + +echo "Download Loganalytics jar files" +mkdir -p jars && cd jars +curl -L \ + -O "https://raw.githubusercontent.com/lordlinus/databricks-all-in-one-bicep-template/00a2978db789d1f1edf63603666d37a1ab72c86f/databricks/jars/spark-listeners-loganalytics_3.0.1_2.12-1.0.0.jar" \ + -O "https://raw.githubusercontent.com/lordlinus/databricks-all-in-one-bicep-template/00a2978db789d1f1edf63603666d37a1ab72c86f/databricks/jars/spark-listeners_3.0.1_2.12-1.0.0.jar" +cd $USER_FOLDER + +echo "Upload jar files" +for jar_file in jars/*.jar; do + filename=$(basename $jar_file) + echo "Upload $jar_file file to DBFS path" + curl -sS -X POST -H "$authHeader" -H "$adbSPMgmtToken" -H "$adbResourceId" \ + https://${ADB_WORKSPACE_URL}/api/2.0/dbfs/put \ + --form filedata=@"$jar_file" \ + --form path="/FileStore/jars/$filename" \ + --form overwrite=true +done + +# Get ADB log categories +adb_logs_types=$(az monitor diagnostic-settings categories list --resource $ADB_WORKSPACE_ID | jq -c '.value[] | {category: .name, enabled:true}' | jq --slurp .) + +# Enable monitoring for all the categories +adb_monitoring=$(az monitor diagnostic-settings create \ + --name sparkmonitor \ + --event-hub $EVENT_HUB_ID \ + --event-hub-rule "RootManageSharedAccessKey" \ + --resource $ADB_WORKSPACE_ID \ + --logs "$adb_logs_types") \ No newline at end of file diff --git a/archive/single_tech_samples/databricks_all_in_one/databricks/init_scripts/capture_log_metrics.sh b/archive/single_tech_samples/databricks_all_in_one/databricks/init_scripts/capture_log_metrics.sh new file mode 100644 index 000000000..475239f20 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/databricks/init_scripts/capture_log_metrics.sh @@ -0,0 +1,153 @@ +#!/usr/bin/env bash +set -e +set -o pipefail + +echo $DB_IS_DRIVER +if [[ $DB_IS_DRIVER = "TRUE" ]]; then + echo "This will run on Driver node" +else + echo "This will run on workers nodes" +fi +echo "This will run on all nodes" + +# if [[ -z "$LOG_ANALYTICS_WKSP_ID" ]]; then +# echo "LOG_ANALYTICS_WKSP_ID variable is not available" +# exit 1 +# fi + +# if [[ -z "$LOG_ANALYTICS_WKSP_KEY" ]]; then +# echo "LOG_ANALYTICS_WKSP_KEY variable is not available" +# exit 1 +# fi + +# Source Script: https://raw.githubusercontent.com/mspnp/spark-monitoring/master/src/spark-listeners/scripts/spark-monitoring.sh + +# These environment variables would normally be set by Spark scripts +# However, for a Databricks init script, they have not been set yet. +# We will keep the names the same here, but not export them. +# These must be changed if the associated Spark environment variables +# are changed. +DB_HOME=/databricks +SPARK_HOME=$DB_HOME/spark +SPARK_CONF_DIR=$SPARK_HOME/conf + +# Add your Log Analytics Workspace information below so all clusters use the same +# Log Analytics Workspace +# Also if it is available use AZ_* variables to include x-ms-AzureResourceId +# header as part of the request +tee -a "$SPARK_CONF_DIR/spark-env.sh" << EOF +export DB_CLUSTER_ID=$DB_CLUSTER_ID +export DB_CLUSTER_NAME=$DB_CLUSTER_NAME +# export LOG_ANALYTICS_WORKSPACE_ID=$LOG_ANALYTICS_WKSP_ID +# export LOG_ANALYTICS_WORKSPACE_KEY=$LOG_ANALYTICS_WKSP_KEY +export AZ_SUBSCRIPTION_ID= +export AZ_RSRC_GRP_NAME= +export AZ_RSRC_PROV_NAMESPACE= +export AZ_RSRC_TYPE= +export AZ_RSRC_NAME= + +# Note: All REGEX filters below are implemented with java.lang.String.matches(...). This implementation essentially appends ^...$ around +# the regular expression, so the entire string must match the regex. If you need to allow for other values you should include .* before and/or +# after your expression. + +# Add a quoted regex value to filter the events for SparkListenerEvent_CL, the log will only include events where Event_s matches the regex. +# Commented example below will only log events for SparkListenerJobStart, SparkListenerJobEnd, or where "org.apache.spark.sql.execution.ui." +# is is the start of the event name. +# export LA_SPARKLISTENEREVENT_REGEX="SparkListenerJobStart|SparkListenerJobEnd|org\.apache\.spark\.sql\.execution\.ui\..*" + +# Add a quoted regex value to filter the events for SparkMetric_CL, the log will only include events where name_s matches the regex. +# Commented example below will only log metrics where the name begins with app and ends in .jvmCpuTime or .heap.max. +# export LA_SPARKMETRIC_REGEX="app.*\.jvmCpuTime|app.*\.heap.max" +EOF + +STAGE_DIR=/dbfs/FileStore/jars +SPARK_LISTENERS_VERSION=${SPARK_LISTENERS_VERSION:-1.0.0} +SPARK_LISTENERS_LOG_ANALYTICS_VERSION=${SPARK_LISTENERS_LOG_ANALYTICS_VERSION:-1.0.0} +SPARK_VERSION=$(cat /databricks/spark/VERSION 2> /dev/null || echo "") +SPARK_VERSION=${SPARK_VERSION:-3.0.1} +SPARK_SCALA_VERSION=$(ls /databricks/spark/assembly/target | cut -d '-' -f2 2> /dev/null || echo "") +SPARK_SCALA_VERSION=${SPARK_SCALA_VERSION:-2.11} + +# This variable configures the spark-monitoring library metrics sink. +# Any valid Spark metric.properties entry can be added here as well. +# It will get merged with the metrics.properties on the cluster. +METRICS_PROPERTIES=$(cat << EOF +# This will enable the sink for all of the instances. +*.sink.loganalytics.class=org.apache.spark.metrics.sink.loganalytics.LogAnalyticsMetricsSink +*.sink.loganalytics.period=5 +*.sink.loganalytics.unit=seconds + +# Enable JvmSource for instance master, worker, driver and executor +master.source.jvm.class=org.apache.spark.metrics.source.JvmSource + +worker.source.jvm.class=org.apache.spark.metrics.source.JvmSource + +driver.source.jvm.class=org.apache.spark.metrics.source.JvmSource + +executor.source.jvm.class=org.apache.spark.metrics.source.JvmSource + +EOF +) + +echo "Copying Spark Monitoring jars" +JAR_FILENAME="spark-listeners_${SPARK_VERSION}_${SPARK_SCALA_VERSION}-${SPARK_LISTENERS_VERSION}.jar" +echo "Copying $JAR_FILENAME" +cp -f "$STAGE_DIR/$JAR_FILENAME" /mnt/driver-daemon/jars +JAR_FILENAME="spark-listeners-loganalytics_${SPARK_VERSION}_${SPARK_SCALA_VERSION}-${SPARK_LISTENERS_LOG_ANALYTICS_VERSION}.jar" +echo "Copying $JAR_FILENAME" +cp -f "$STAGE_DIR/$JAR_FILENAME" /mnt/driver-daemon/jars +echo "Copied Spark Monitoring jars successfully" + +echo "Merging metrics.properties" +echo "$(echo "$METRICS_PROPERTIES"; cat "$SPARK_CONF_DIR/metrics.properties")" > "$SPARK_CONF_DIR/metrics.properties" || { echo "Error writing metrics.properties"; exit 1; } +echo "Merged metrics.properties successfully" + +# This will enable master/worker metrics +cat << EOF >> "$SPARK_CONF_DIR/spark-defaults.conf" +spark.metrics.conf ${SPARK_CONF_DIR}/metrics.properties +EOF + +log4jDirectories=( "executor" "driver" "master-worker" ) +for log4jDirectory in "${log4jDirectories[@]}" +do + +LOG4J_CONFIG_FILE="$SPARK_HOME/dbconf/log4j/$log4jDirectory/log4j.properties" +echo "BEGIN: Updating $LOG4J_CONFIG_FILE with Log Analytics appender" +sed -i 's/log4j.rootCategory=.*/&, logAnalyticsAppender/g' ${LOG4J_CONFIG_FILE} +tee -a ${LOG4J_CONFIG_FILE} << EOF +# logAnalytics +log4j.appender.logAnalyticsAppender=com.microsoft.pnp.logging.loganalytics.LogAnalyticsAppender +log4j.appender.logAnalyticsAppender.filter.spark=com.microsoft.pnp.logging.SparkPropertyEnricher +# Commented line below shows how to set the threshhold for logging to only capture events that are +# level ERROR or more severe. +# log4j.appender.logAnalyticsAppender.Threshold=ERROR + +# Adding custom propertied to log Python applications +log4j.appender.pythonapp=com.databricks.logging.RedactionRollingFileAppender +log4j.appender.pythonapp.layout=org.apache.log4j.PatternLayout +log4j.appender.pythonapp.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n +log4j.appender.pythonapp.rollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy +log4j.appender.pythonapp.rollingPolicy.FileNamePattern=logs/pythonapp-%d{yyyy-MM-dd-HH}.log.gz +log4j.appender.pythonapp.rollingPolicy.ActiveFileName=logs/pythonapp-active.log +EOF + +echo "END: Updating $LOG4J_CONFIG_FILE with Log Analytics appender" + +done + +# The spark.extraListeners property has an entry from Databricks by default. +# We have to readd it here because we did not find a way to get this setting when the init script is running. +# If Databricks changes the default value of this property, it needs to be changed here. +cat << EOF > "$DB_HOME/driver/conf/00-custom-spark-driver-defaults.conf" +[driver] { + "spark.extraListeners" = "com.databricks.backend.daemon.driver.DBCEventLoggingListener,org.apache.spark.listeners.UnifiedSparkListener" + "spark.unifiedListener.sink" = "org.apache.spark.listeners.sink.loganalytics.LogAnalyticsListenerSink" +} +EOF + +env + +echo "Install Linux agent" +sed -i "s/^exit 101$/exit 0/" /usr/sbin/policy-rc.d +curl https://raw.githubusercontent.com/Microsoft/OMS-Agent-for-Linux/master/installer/scripts/onboard_agent.sh > onboard_agent.sh && sh onboard_agent.sh -w $LOG_ANALYTICS_WORKSPACE_ID -s $LOG_ANALYTICS_WORKSPACE_KEY -d opinsights.azure.com +echo "Done. Installing Linux agent" \ No newline at end of file diff --git a/archive/single_tech_samples/databricks_all_in_one/databricks/jars/spark-listeners-loganalytics_3.0.1_2.12-1.0.0.jar b/archive/single_tech_samples/databricks_all_in_one/databricks/jars/spark-listeners-loganalytics_3.0.1_2.12-1.0.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..1ada982ea196ff35f9d44a09d7c717970bbb0a0d GIT binary patch literal 51809 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 literal 0 HcmV?d00001 diff --git a/archive/single_tech_samples/databricks_all_in_one/databricks/jars/spark-listeners_3.0.1_2.12-1.0.0.jar b/archive/single_tech_samples/databricks_all_in_one/databricks/jars/spark-listeners_3.0.1_2.12-1.0.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..0e93e52a675cc3e601a7de0f73135e3d1eda8a70 GIT binary patch literal 150667 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 z zPfClb+_+d?Y7EzaES?=fxq)Izx7}I&<7@+v&UOPV&s>1gzg=< zr{j6&t$ECKM2T$ccm;y!gOQv-3rlGOka;ec@1898#eL9JefR#AfWzt;`#P>OYJH8s zA9X~sD5MYCE3kemu>G{>+Q)hh6TdCM?Yl>_c?RC(Poj-uZm(a5IQg89790dlo>Shc zeFLT)6xMAHQ?=`YeoO%7Al@hQKDrARc)W*5NI2ve`2vf6IcMdt@pH2TJN;T$Cyy9Is(A1pElL+QlKV*VF$JVZ;M zx)6~4*~srDs43E35KSjB-Ndx9I378lw3OwP0YmV+Vg#ma$3nzM{_tE}jaO5XSvr1i zpD$GYWbR|v%oAd~dAIh|-W*3SUVITI1d0h#e)5Nba{JCG$pvcMF-V-JS^6+J$iBZm zg3E}$?A-|m27>$Rd?_Z92;|sNO zy^heg58Tl~N{`o?@LX)_RwtgzUS5SuVvmVBff*S&MilbV>SV1MXpt9)D(I|lPu~>% zK1KRX6}@tpJ(ab}Bj2hZGBt)%`bgJ|o%CT_ySr@3>()$<`DcB&De;Qd?}uUO$1jTB zfGn7ww~38fi>tCf62@E+%J%hHF(Th#@kl*2F}CIqXN->01gzqxZspI1e_6mUl3bQC z*1FPxZ%8>eipzW!Z_Y?vL*f?1~0g z*a2tj%pBKSignC9qIm1(5R}DPzQ}l|`Ikbz+7EhrIVP*N+Qo%0qw>TK3!1FG0L=b> zVV+hUV4}MHz=Sx*Lj#rde1UpXw@Nea z#LQ%%-lg-(p6Q)APnn^G+(>sU&D70_=gv@8TeHcdlbN}pp_36wdnl}ty@$NsZf)e` zeLmu&z>b<|SkY(t%Nq$k#Ms%;pqEK{7E_I>h; zX-CH%ZD{);Vi>X0e*desQZ`In4G%!PD49n)IauG3bVxf9f66pcYFs77qpRj2 zS-}YUAbKkLFj&7-p~IXsMXY@@T-%x8k*UZl9 zVvl&8QDbvs2e~ky?ld3_0m+^kl+dH6#)3{S{ogV|3^Jqn3ZV(UoCbwfK_$*J zL@>QkKXy808$Z( zZ>epF^e9z3RoZXwvPiK#nh;}zdQ5N%8$J6pJvVZSKO$hg$jF+-bv~Q-RvYI%fa5Rw z5zJ^+M_N*Vh(cM=@%Cc}IHVxuwr@bjQ9R3O<7M@62cM zNs^Zp-v&|Vn{*4UrJnaDTr3!>seozV4YUo@?{#(IRAZfhexxXtd6(k4g!MP~sJai) zYjB4~P=CU3!1E3R4~7K%5c?w;k~v2SLcu7^p%AMV{CVAlddzX`wn+-ssN)w65>CKraDnFFW6pyU_;+-F$@L zgvan9cv$U~1-UMYF8aoG`EU;+(9WK-2^Q7d7;_bo5+#)k#IZ*RdWT~o8#WZ0G99IL z_(n_7W&neMM`;tfky1mk(A^SlyoWLkc_|8#NDCGOlC=u)t1sWGck}1SA8@r?`Hf1X z-yJ$0)vtO~2!iDAm0h+7XE;O-;d=#FFz_GAH06=CbeZ!Np*@pywX7#ut>~hR*PpIP0jf+dG`pIlYp9`e*2X=)P9+r-2sbK=BQ5@z*|*F-UOT zwO@9iR46|eM&7(QObeIVZjnQH6&9%`P?7N!y5Mv8a$5KgGRa7Ck<2UP9j#Wjy5qKP zhcTOoHCp7v`&2Gky&@tkCcSqo<(~c#y_?|`v0WIKqgOBM;uEP%9E+!Me0cWC*d~p) zt=2CwAws;w{_J>mMsfrJI?M8f02-skdhyua05IVOjx3ZX+$|8qB7^KGz)rK0~HDY}~sbC7u4$-qXM3Pxkhm8Dg>7O=+kpNoqY=RV8EHu;31t}=5 zJ@m(mbcw!yx%K)LL6QalITH<_Y9&8qkey}b+U%vb(hB26{ z*|~J~B{LIdEaO80M-K&j=d`=Ntc}@kQ6TeXv+azG9*(Z*#dV&aOfEz)V^1V*R`U#R zr1>#_2*;wUZSxYC9ylsDR)m~5v9vt+i$5GJWq`ol$BtpE$)U1ySaxZ+%rd{B;%67` zSfY~KJKm@2tNr+{2Npr?0-;ktke%=QC!|;u#)S_nj5Yk0cex#?Y>)gJbcOcErb(q& zNQxUFIi>9UZjai8r7+AN(nbCwW7yUQd@=301`4F7Xn$c25qE9`m0nGJ7M7nReLxCJ zun)-(cM8F=4LdC@mCNI9wWMg?#x`xAl7yo3Mgu)YrR8fB0q%%eaa>nUMF)*wAwu>z zxc5&$AYEeCmPoN94@YfIh%T}4T_;+f-d94lJjDZ)B=AkRz?24rn8!zVk6b;KnZUzT z#P<%ltKCO!eBi;|0aqXSd)%F>on9hGj$ zxdp68LF4Bc*sArU2oe!$o8GG{cce9e?=nmkkYBqhSbrjhBEU`{b=vdF+)7m4xAO|y z2SQfjIH#~kbRrpj3SfQ)y7y8s&&L$Y^=K{LVjq>(qGb<^m4f6T4veUYVZ!Qq0rDWhd*^`@oGq4`Gu7$d0 z9R8F#2HLZ-`o*0o?%Sd?dOCA46rEZR9<;V-{Zu_!&tVwq`KB_@w$#h5ofmtt=kmFe z@tqX)^Hn;$ZH^KD$>Bn#Q8OASQuRwr#utM}Fb=dSP&F;VUpPSom%j$UTLLQn?8FU( zbT)0hSug3D_w8%Vn!OoZbs~55oMPSnw=`NHGQX4`%#UOdY{!BZLq#W-&~BJpnxOGr&YE9wA9!QOv@=RT_D6mP38!NmY^pbU@! z|Fw_$-{XL_otYT`&-gnY0Jw|*IEJ%_h%G>X#rz*FvlJBxB>*GVCnqsRx-^P{0>8)) z1_K9ed)OKTW_0_A!lP=84SM#BjLZ!ATcvkU-7a^98-0&Q^B1csM~^M!S@Ftfj!CbN z<=UP3m-mA~F`xzaDkHXA&Jl(JBP1nG*}g@4#vl|~6MIZEM)bj^_v|Hm+V40gEZXt+ zg|SlP=IL|x83a5=ovzLy1w?6jrsC6{a-f5k4HuCmo;D&N@XwJ#iMb7C4rUqPE!=Fu zb zM(qt~$}*Qu^Wv?iEKK({jo9GiHPCF7hf**UhJmn!!|9kLE2#ZdgM;!2;U7mVJ=0U3 z#$3mQPhu&kB#ha7zzoq%2{8gm_2iLN!bc8zZqR8{HLvj+S zP#&!t-8OvJB!{X`4h!VX^Hu+#*5axgZl{*NYPs$PN1N!wdopXY*u$={Y|_(56^3Sk z*#p_gYjUn2ewrQp-e~@s|&itVwFvyTSktSqGTecWWL|wsjp;?VP zzRvo}*EVPv&@kt~quemDe3lvhSLwobje}j%i|WM@ zVfC%OL|6FY+ikEej2h0o^5sTgYFkpe$>pMjeAs7uI!uPVu$GM(d#;t4#9<@ryl4h} zu&t-^5#2XZwV)oaQ)46(VWoqszHRac-q+F;`lye47Q^rN`#=hzLBFlo{RF_r145p} zyTnGdi1`Sb+1n$S2T7SjODbfX8M}mY(`iHHX6Z=CUK6v%#)1gitM<1ISAOQ{ap@{G z6${S(B*Y_z@ktlti$u?#;;BN2Nt!}AeLc-ie!*HLb^{3trj43lmrRq@S09#SJ{KF~ zU5-gSM?ZBXxWVzkRKy(VnZuI-9#uhgWEXAGtt>!P77*E-8ihA1aH+i4CC0=zuCE1>mNm-=uP zw6oQ^x>Nm$epaD9-w9= zmRu0#p9}$`Sb@u0fe@I=UYJbv(qDCqrZv9*1V;RIaI%*1C?|k}dj*75{(pOLGQvVa z)^<)Nf5{_?8W=g-IeHNP^RvHGt{kNa+Xa3Uo}@Mg23p7xx?ex}f!IK!i!$_j{oX<9f-X3J z*pCXqy76odmg-z~y8kXb+D84S?^BFCw`o|3`b3FFnD-P{dW)f^lcW9HsHm|i9bLard{pZz^9-9;z*y?}2W zDzqdw(!+DCxyfCSbD1TGZ!3GZlNy;*(jyl-()Gk?Df8I8>(6iUmQd4f#;R#dPK+;> z2TRswFE}MxN1q~zW~O0pbQlq9&d$ZU?KFuInSzSZvt31*b4c2uW$qU^>f6`K+4|MA z<+WGP1Kw5}Z*76CurOG(I3I3-U89LW*1@caJY1nWza$u|uk!AJ@`^)|k|cV$IJeLi zrakR+aT8H*7H1G=&_HNfm>8-yQ+L38oAta?c|bp?73;80%=vU=6{7qt*D#e%><~opMKejsQP05UL(&#Bos)yx>&Ink| z>V2tK>sTkSlcs1boZ9ntX-le-5f41GLWTZn$L^Rj6IvVy-1w|tc>mS=Rk;Uhe*%nW z5%Bs;Ui1I#{gO&@vj2ngo5a*Z4bY(R_k8n+jv-#gH5~5@yhb4xPyVm{S0Xt$117e@`2Rm$6(V=@0VxLIaEUZ{! zdX@<+5ULukkri#t&6gugzPY#5FaJ-N@9(fr|IhMDtFR^&!e*)%)2EC%?nbVe&zlnf zUk^VduVC9kbcZRMIb5N^V&oKHdR@$6mH{j1>;S)K@f)J4-b<}d<3X5>)7N{7^$4eY z@V(5h*Sb?TZ&XCX7v)$FdR`omi`h7_?-oRLcW3Hwh<=j!bv#w_vbdVKmz2F{ z?$0O~39%>9K50)51@GPMisF|Fg=Xn{COuofr=7$Oapw7cGQ*T*;;+HFHM+K-`n77S z1B$Hsd-zd;LjAb5G&k}o_qE~exskCACt=sj_6rf#q^-MQOQhbPx2a2vN4Zj%c!NcEZ@rx zAnCX2TJ#+$zYi{7y!dUg)xFN8gCu>3hn12&!u(U8{Y7h%+)Cx$ooqB0mD1fT3+l`D zqKR4Ljbij=q(kxPR*lIx6c=?n*syU$H@zp1_am^3p^Q_J&MrJ{tFd~;@tCRmw7BxZ zYhWL8ptjws-M3-wRRK2VrCav|v!Kb7X@#t)4g*}_x%~rIe{C4+FvoGRZpT_}!sH2W zkG+V!(zUSQeuitl=8NlIRq1gWTzDg7I5I+r(6#YY$HCq@$NFSy?Du@Eu6qlQMAZ}uWI)PJ4?o%Xxg4f za9_0%M|xp#9BEE3Bxhys3SOv#e5$xWgM8g#$U*YQQ8(p?akm|CYW)0u_liG8g86m% zvUk6bk6!5FKb$Yr(!V?sowYCmDAcjTAfmGXiko%Jko4-RzLHCl+IL^~1WVG(@-O91ABK_8;XV&*J^*omEDQk3Q zQoO$$i%JW$c7OL5V|s#g5P5#HarOOUc&aVCtA5J5`~%dJlzQbR`#PH6(cL)0k#ups z59rl}I37_vqdBva;QHBKVl6k%)?M}Y^LEiN57xnOg1ea(yh@dv^be>K9JE}E;LqZ- z6&t6u<|s7HxI%l>nI?)%^=#@~iv?0QG`eg3+GWUQsVm^lOE%z%9|%;y-#aVPt2;s9 zF7~ESVebjEMz-3-cKcoPHnf@P!@XSQcgU`1?K`=MF0?RU5Xm?e?z&S#)0DnV$3RP; ztFY;AvN__MvxkBkPvc_$2D{^9ec!n=y_QeJUpb6Iz>SWbaNSL>x$8Kbqo=&)$3l`a zb!j(5iaU<92=T2e*bCjcLdtj+M)>yIH>;dWTd@WzBa4|2j@0PZ_#19 z25A%e8}ZO3d#DHo@gT=4?n!(jcJiu1U=8^9>SddSdm?JTq#KdO6X!AheK=f!KURRhn#Z0_vOWqh9AVLnFT*?)Mhw9|z;Z{-Oai+3@4LvQ zLVUKuxob70+BpgAA0I_pZK{gBDE)de9@N1QZ=rN?g8NQjxuY;DuA`KnNdl4vzodwn z)Q?#f>Iqx|-A&>n(Q}QLsxZ`J_&Y?yn}JquyXmjD-m|Y{vIH=0s*3>e6WHEScIBkjWk$On&pLj=T#=UM}anx>H_7|&^f5m9VK>XZ5 z{l1e-2K}7MZwDO+Dd4r$kTS=VD;U(5gENerNmIPBHa8a%9bJ%M8rUOOs6AXWnzI)B zO4s>u3Wwv`>9>&*UggvcdoiLc%-LKdI2Z>qKhcA?JjmbD?)C*g)fKe5;rxhqK*qTZ z5F(_!YVhmu+M>U9>f#9}_U#|xI#o*#4M;p#bBg)XfJ6NYW{mcL30;cRqb-(g!NhEd zDMKM+a;)%Vs;_Fj00$w&=V-Qx_6|6FJO*Q?F-T&CnA*K6P30@Y^-$yZ+!dXOgBy>0 z;(7)!GGUaYd9xO@1UHg#N$Y_}MAJxDYc~BlJCmd5-~ul8QsxspB!lg#NAnvPJ~2{1 z7uYzB^ZpwzOG`u%S<5v@UBo`DE$OvYPiIOruJ*y(XE-{tWLoxC#7y~}5PKlg;d9JB zSM-jfG?{z$o&af5icbQ#;t4wjaTMz-K`H3=PEm!L1tTF6chHPO^1NaoG(`j~UFtn? z1X7}pb8UM8#G#r3vEq9a?&HlfU6B#qz9Dc3Ek*{7 zw}9x8d5aY^mE*DYXjX_atIF?BAl()(WC4K*%PjR?FsWF*5AYvQJVw9z7r z4>(DoPpv!hrEqm_?@hf>XBaprafvpPSXgf^NEbF;iff57Wc<7n2d%p#eY^t)VKI4z zv&#{L=C(eYQ|jr zOz}h`vsD=XRIL5Pk|3cbO=y^<#Ycq3AGJtn16F|k4K>a&9rhy4AaoK@jTTX^_ELo` zZ%1FvcleI;xMo%C5r@69SX+x?CU#Alv?cOu&>eaw;9Xi{z>VW9L1P$O0g5GytRYiA zy{OQG7xJZuls0#PL3W{t?WTLKcMqIPdv?X0(qXEl#^=Aws zuWV-0PjQK-8!jG_ej4K!NDU4_&T>xwzPw_Ze zhoK`B*ANbY;h2rNI~u^^Op`Mb&=Q>`7N~XRLu@6mI!a2cG{vo9hzno=Tx&10bRSF} zw@p4*;$F!`_V^^tO)}f-5cQK_D&&qqh>0ey+LT6 z15xgzd3wUlRJeJ9yyb`w|ICzM``7Hf1(@}>s z^gUaG183qoxTPwC&azM*(QStDPI;Wyo$Hhup9a#I$Mbai^k92fFo`|AG1AuDTv;t z#If9}*zH+$bby&3gD*tb7MoV|#Mxx4b0c5}|B-ks57+Q32s0&hAw_(hq9c^u_?NLp zBmWzmhoZpy@%M6c&G_U#s zNImxpF6MWb+KT7)P`%y2P`!OMO5f@|w&&`|9Se7yUbP!=STqNT{?`&@MNUtNL00E- zccH$$d3%fn%o=g-mdU+{*rVU}&eCi?sv^v1Z3DtA+LVPdIyQvtrty0 z#4x5RE#^$LqnH6vvq*o{ZCxBfr(T=nb^CExnvqDvsnr{yi$t;cz+bg6FL*+(B%zL( zIohj>D&eG5f7z!#fe}d4?8fI9t3Ug^y3gX21k!3y3+Mqhi*O`YSm%r*k6l7{16Bv5 zJ`StDb2>fDq;LuN-6@Yn<~xztE=XV#{G9nNIOC?;V9lFxiF){}!49~jN)&k2lS_^Q zin6Jq|D-<&9f2-7xiNz@oLAO86HaSV}ME zs`j(CUfjj1fM(zw<@u1nS_6O(hlVr1UdqYOjebXnv(v6_W`yS?TXOvTxfmP&XpJAf zj>#88<>rrs@@Opq^Vl%4<^C^X%Yy=ma^g_%gN1S~+>Yom;y-k^(k#6FSE7<2G!T2V ziw4k{bFnT>HbfT^vxRbwYE-BBQ##n4Ckmea^5Q-4rq+J(jbZVJ(LX4^1Oc~C+JRl+ zt4T1eV-?1^SDMg;mpVn5jnb^H00D0Z>WB7@wAeg5GRLz}*_AReXP5w11-PLKp-3Ww9cq?;K!Tp^6`BY- zt@Ow0eeR9Z5ujvp??((V^i5DhUy?goPQeSy&17CViB4L^Cp+ilYQ-0u^f|Z-o1TMf z0D(&2ci|yr&SuabMztB36{15<%wiGtcSOx}8@xRS)Khqcog%|sp+(n<)mcTjhq7@W zYf_9aiOA$OE(iz7(6*jrXQfqUw|Wn(Irt}=&N+c|q6(x(B#RWtRZ&PA>4BEMQXA?- zsQIi@5_-uRhSF1Z#N6Far9<`!WuHWGZk+t4P*>vcmg6ZxPM4Ou#U7Ts(m z!6|5J3tEkNb&}e{hSDNzllOrV!&Ocy9;Degq=5VAGDbWq2RNoy*OUY8L_AtAOw$n+ z?sl%#Z;KX9-2o4ZT}a`zu&kH{^H{afVQy-0Ff606z?)3$^tYJvZ8c027nbJIzT={`@aEt+P?sL zr@x3{Y5q4~tR53BJuQPCBP|0Xoju^o?l#s_$vk!g^a!DDz9Pvyu1Jhcu{Dd1hJ6wEE>$1FSi`?o#tkRJV>G|w1{PG%%3NeFa zqglTxvr&SyE!u%CgJKMbgwo`bDvF0*3rm_UgB@g+@eve;XoxDPy#3e)F(MVPo1mPe z8yHN|qPq~<*5#G;DDbz9>yGe)R<+0G7DBp9kO@R*6#a>#H7)sKtk&5OFU?# zc4xMJhg_u}bZb*pHoeQYnh2Q0Sc*0?I~pV)QI6_KRY#jo{0P=W!xXvK8p^20*DiXQ zb&)-$ketVUGPYToej+?&)q8rR5eOjPQlO^~!Mi7GzChyPWTRqCwnuUxtmI*?Jv(q= ze5{Pv#zpeDK@*KSukg~=)h}0`N&-HZc8{xz)8yjUVnZ5zn-}L-{34jYX)|_AJ!iqhJTK$ za}_8TqmKeYfIdbrtA(={`|B-jc49Px5*A%OB)Q|8oT~_oS4B&yV}h5LeDxG*rrR}w zV=%&2E2c$h-B{;8b*2C6&8o}!vqJ)Uvn>E49KmW z=>C`1#9zWU9{Oz(eA@;lud7X`%M1>#Uf-{0NPTEJ4DJ#w-m9B@n)kNR zhxQ%Rh*W{|ys?^DyrvFxPge9n=`i>GTws}ghw`=n&Bbyx~cZIjSkqwyP9Q@=2X#l>ZwjzsB>N-Cg64eldeMwL4 zSrBfN^r)$MEo@#(G40ML-9;0cvec}Z-{G5|*)=7^VCzh6SO6|*Y1!yuGyEwcCqgJ` zZntMI2jWd$w2W?gkQ)?pu~T^fJ2)@H=_-VpofI09rDnseZ_m`ge6UY&j6G=- zP#`^(Nh}rey`NsnhqQa$RYAByc(nPjPm<)Sk`z^L#h7^esS~z9F52VJTqZ%IEE}eT zU5e9XX(hm&Oom>E%@$YqFp52V8byd;Y8UlJ3qR^NO-AT_8mhUoeCec8WF>RfXpf+6 zaA%qYe{}jdlrC}z1%+zygiJV%N@+gQX2G2Bicc`S?lGhEA{N5 zO20bQ(5XE{TsgyDLl2~l_8(`lY%LiEQfEZm8egGD6Iu|G7y`JunkEMvQ+Lke)J`a; zzUc&JqBuG~oFx5#{xj(PWl$~bZiFU)itQ7iTq6AM4C;SS<03Y&1z?^ow#1Hq>vIt^ z{Ko{Y2Bbc=n#bqoR*INrHKE0k(1DZD#IlJ-n#o#Yj~z!M-5L}e2YT(u?Z{6Z6Zlb9 z1mHt_5XbnRrJJDHi75NQ)|MslZB4`_!%gz*q$MRKvrQqXf@iEU5}RLsOqx@Yoejug zzm~fI!moTiS07h?Usyh8F>|%w)n$7H)U(9lnlp(^59^jPF&UD?G{dT$88IcAFL5I7 z*IK=*!%=xGNzVREx)b`6BiBl;^SE4KhTFHXp)wemS}`KaiG@`!!~TDKy;GE>;g&5J zwr$&XL}u8wZQIJQZQHhO+qP|WRNdP>y6WMKv0wK4_b<#f0j_vfh$()zxse_w zIzK1m<$M!$EZ@LtG904eirYCCUO0dZ!cG>g9`JE6=j3*^TH!-IMwL%K8Nf&_rRF7` z%<>A+HwMKbMZ72j)+_}}%F+YL#FB`}5(4pWd-l|gr!U10;0U7jN_ebJp7zGxa35lo5WK~)Jn6-2giA}qaFo+U zSt|yq5ujc(EmAl}sHqYWP~XI9c2f$Jm$tR**qmXyBh-PJQacw#)`0NQoRdL=%w4*+ zAx^|$HN;GQVPm<5$OX=t@8R(aQd0thS3xl06z|P0UY2HLPFgpGTQXN0%YM09@9c4v z#HAnGCOTM!2Hs<;?6>IO6fT z4dI9&j~`)$L8xXhG*`vngJZW;G@21mLPOki^%{igabyyXN&sa`t5fr3v1V*_-Sxv) zJ-`Bck?9|oETZ(CYAQQzr5i2OlBI|u4QA5>XBK2KO%P#&1G%M3Wf}u_7Z*Cf5$q1e zo#%y^h;im%>Bb|w&c}j#IQ`=Gd~QPs(~a3DDWw?cdR?TAfTbF6@dy~x6h1~^JJeH z_H+xNrBDfd*Zh~+u`^;BT-LKLHSBH#aMPmx?Pugox?oyN9MVFP067iR!dSl~Z(?bU zXvBl>x-0X?W+Vh6N?6gv#&VK$3jV{MUE^?`EaeF2OFW__t02rwp~_Q0dRw6xSr*`B zpAWG$XCmkyCXK1Y0C3=~@nt*~9#JJ__kgxm092;v_$@>0z7)%&%oW4T`i9yevqX{^I(DU~jIn%D7?g~vmqI5pOkGh&ai)e#C+`|E>)oQ++d99} z-6{?)hDy(&cHKSGr_T}BMu_~ErFpM2xBz^$j2>kHJ9n^y!Za@6B zgctb9pO}DDvIJGP%W(jmx{+_>n6DE87R(MaD`a|!29g)iJLW$+{XJ+4T~vNK8}_$1 zl^^K*i4r)CC`a`>5+z4M?NgI5>TPbXvVW!}c`{SnIASW?=sQ_pvA#np0uqzpc75$l zIdukVT4^Y>wwpk2gRjnmB>3RK<;kkiFgN-1x#{Fcqe!{$<71i>AT6`l^tq?QP{nMN zumW>l8MHa~%<|>mhN@1eHlCE^WdQdN8qn$@T(>cy!BZ7CAJoY?Fu@h=-Mpa3cET#i zi!7_J;bTIaP7MI32tr70qfW^AbV~8~LZy#$nP6o^Q29JIzr zVzDwrAd|@zko9*`a?YAjq7Tn4nq0`S*udK8EweZaB_$~6eZo-39JM{v@JywjE)Gkv zu#K9havcgS(iC~cP~nzM$Yu?SYT~QD!WIplteSViRlO3B$4OF!;4XE-z(PeZasGwrBPu)EUFOF?`M+7;?Tp-h(`-sdO!(N1aQ$XHR=k%{&1eD)q`7hbvix>GVS zB8ii7?1kO%)TNj@u@Bhd;v(FQu;IAo;3JE3&75Tuj;FfCt+xN`ZL9!&%j=Uk>&aQR z468wTl2B*tn_Zf58#Mh!!|<%XhSeB?`Yq5x@Uv22Zx=b*BMn~7nPP$*#h$#!dihu8wffTT* z^jI=A8pr2olrsn#B1T`bkd?L{&*jQ<-QekK)vQ(+b3n$d}1 z3~46?>alM>5v>@3Pu()eIjJ}q%$q1n_Z23^WMKU(JSdMc6xyf}&etU?CC4+g_1F*L z$d*)sUvCqj0vzFL;W{=1481-+eI`&sO{|IY(haj%)MxB`M9lpJ#Or~(%`#&ff2?mX z;|ilcH=ZdNyS@0PNya>yZ^Q;PZ*Qkg?+&-=(t_s+W9@VPjpH)NkS|ls7XGz-KTDb^ z7%82vs6X|_yNI;FTA!7eJP{Y2@MB`Q-jvA-m7D&k=X z*EBu_&tg>OIac5F`CH=!=E^&g#VzaJGv&R1wMBjx@8;QpxEP@BHCP&VTrlipetnir zI5iTfE@2zRr=96DYu~O?qb!r*QN>Yp(eCihZ}^o!91-34oPGogq;AAB=E06=d8pu-r-IRub# z1k_@ItK9^2yC!LZ>~$0g*p3}?jTABeUNnn8o@vi0dh4Den$pFXD14JFP*yiz%mBHT zgxh56lJ5J8-zKx$cya-KAuSNxbuqdNp!ps?Jq)=!>2Wo2Z`&?w!O~`f)P{r9rbE(r znwI}O;DEe%I(la^45F>=M^xKGQY)s%ACesbrFx1^oAQuE`ytCrjC@!=-mfx8`H4HI z8XVHpjAr+m*}M7_=b`D$VsC%Crum*wqnz@^t|)Y0Vo2;ydZ)@eWev%%#Zy6{T^zH>K0+2-gSl_the3lsGaCgE;t->KXG(N$9t)sxTEt%a(rSktU}V_miT7m z$5Wg#OlHf;lYoC6+qefgA))t9bex5sa|RTZA6t_IUa1BAuvKx0A&WYH>ya%GkufEl z0p$ad!6+rgK>oJ!tChcE-6Vi8J5>$Y1%|gkiTq@$=+gTT*>>C7+Wa*}}(~WUGCkl;DX_u~T`FP?_CQMMe7i zE1zWO&3LB-fSq&WnjbhnEv`GjCQi|4iaq5;@ddfPVR0X|o#tihGIfMg zO2DXjqSVgR!(?PJ^k-mCZzFTJ68gDj4%BWqBVe;r>gFDx*xYqSOl)bJ-BR=`TEI6t z+4VwPL9jb1AKmf$JZ=iqPP}0{x_0{TZer?IRHJ-!(Vt(N4O(izfxGqj1hytH*og++ zstc*gj|CJ*1TTL%0Gpoh8gF#Hr8h$01yy=H`sI0NsRO6)W?)lBIy$`(68T^!b}Hgh zBQK2QBqj{lvU@tosY9>*ED<-!4C{R5q*?B6i*Z@9y7orsa?5eBjNGz&=E-WKZngz$ zUMpjz2P`2s$;|NZ3tH(TFk8aViOC`}-bxjXEbe&vEcr!i50v){UU+l+Z$R!z^b@HQ zx|CB@+bi93^Y!x|L^kpoDvYk|4=}WWgrMxS`CO2&JCNCHL0XLy+Q78I zA=d$kmy)MGHWNHjYN%MRE$PYjp>BmXCFV4{2P<*MS+wOA^iNfsL4a#=%IcMPEo(6) zStCi$2b?E$b3QybJk!ni3)2NCW;!-qj`$%B{Ej3lozc`Jsk}#RzVS|8F1-tGsW*S+ zg4#j`S|bPEplpsde|f#f_SpLk61{*}ERfo<9mTdV(gX?n1|F?yR^)bzLjez?I~&f10U7 ze*G{GW?fWr7uVpfoD|zbNWnifmiAQ?@IdEYDFB#fxoFgwij9-TgMrn-QP7Ox;-ABQ;M!}N&@uj0K zM~jFz;zKU&;M5nRE*Xd;s0L~}t^4X}XY6Q9-BztRhJ!B~Qp359+>~H|uG7f3Zr?#aMignbSUnQggTJ6tMff zb-B#Wg_@qXbX~zCbVC*Mu8G1}%yTZrTMNEJPddHS^gXQr!ziBjLp2uJ^VqwOT~WAh}_k=^(E>B1JkMBcD)9&r zHTC8`bLh&VT1w~A;#+7;;;4?{Q)R4kh_@z|7E6ZLlw+fFnASejY}+9+>vPJhj(Adm zu~!qVdW`l#RHsfTdv6}wCXaBOVb-QRFC@>mNC zI@ox<*f$}Mnz_AiR#8q87xL6z=oanlRpu|&z}lo4cM^<8#fAHLlr=5O$&ti0I_WaM9VDg~}F9#L5;M2YR({7*aw@36xc_m^{Zu=t~-C0xOO-y2N}=?DC$w>YPqtwgf0G!=c2X;XGTAq zrhLj?U_hBLmro}DM24-zu5b9nQa;X)Z2H&{6KoXzuyAFgCxDPPZP3hU>VP|82I)hX^r$?@vAq*oK7 zNwu9)PwdjHKh7aUJQIgxvy=9*=wE{I;w~C6VLY0znDGE-k!Utz70Q2`gNI%g+>~iN z5{uKyrRK_)JHf*64q&9CCHhr2+<>(!nx_lj#d*R#W z-X5drBN>_v%gh=HU6+-Mi;fM-giUZsN!RWLHY6dfZG9~W1Uj2DQXTxi8H zC@WCq#GLu|UuBN`iF^bkV~1yGO7r%&Tr?@u_6?IYfAzwD_)v4pziz7Hh#17TP_r7y zg383(#~V@h;{O1wr-o8zU&71_(}Q#sR3H~rD43Ds3R^PU<=_ftLP_rg` z2R+$aAk*JH$vvWWyZeKa&t-50ru9R0D}GQ`&ePc zi|sRboAgHv4nN<0tvV)VXWM1`X2G%)mOu+cb-9tSo~ateIMFJasUIOGBr>K&QYFGD zLw?)-Phk0>c|Lmm_nHR!d#RxNPr&m3mje4gt`!RZ#|k8))%g-cBOWN|p7c;KU9ie$ zQ^P(_SjmBssEBGLs=>M0s&j5V49f>KNRWi;4)|3*RNYXxQ~*M9`)RWK#pJlk_w(}^ zw-+v(v9U>9fN%fqZ{S*JM$Devp~$fMtA$?M1s~*e*x>vv8&;kk1wRR|n ztGuz938N~{B@}U6e2$weBsw%qRe`|xebFcz6iR@nQ|AvK7X${^+z;B0ap~2NL@|?Z zpPY3~4in8asy;C6qPLP=gg&ht(S#M3SmbUS1HW$OL)~})Zt%&~6UFiX!?HKuuEb+%Zc|`gKIAta19JIo0Zz zy?Ns=Y__QN&dVOkVoJO0Zjo5={*>D)^6?;+__auSB=?aK-H`G8&3Rqe5Vd(gQML0k z1F7$zzDG4CS~v`w_zs}DaE&SSd=+=&d#U0vp)l?G)qzd{)4){)5rHsGiXUx!ZR|R0 zI=+dSckvC>vY9r`y{Vg!N}40~!*R1@^-9_v z{|U89%{Sq05|Af32a)w+G^l5sO*aEZ(4|8kExSboUH1_uC`fdK%Z{7~UwZkdZvj zIeHQri7~+_+<}pfc`7u}kfY_V>>ZG4d>~TYY-dJLC*RGD=s-ymJyumJ9>T2?^sep}mZb8hO|q zf-Pf_n2DGBOm}kMmr!$}R`WvRAL1y5W&M~N4t6Yy9%|zNaf7oGQA^S1y4Ry&7k&bB zYU8OiFh^5pmEzXR#Q1&ba@Q-06e68ZsMl<;gIdZSQt!zRAi#7x7;4i~*2`(|3Zyn5d#4(-i)YSOfpmiw=O@|9adIUUW) zMYe{BsD>~TvNwA@Pm;Yn!Npc9+{>b&P68uZlnh2%VY74TxDLchQ|2?~k~2Xkx3lG& zG;D$k*-OxMUuFc(tRh+LyE#*REfuY^SMu z@|>x}@Z-wAE~1njhg{7$lPcPqQP0V#P@%fYA(M|?28i(``Rz^CSXL;epj?Z4^ftWV z*$5l(c)ASF1Cufq`sq)SkM8!)MvUoX=Kcwigy|j`y8=Y6?M^;MXu=(Ilo3)cCmA2^ z*49LvY1q*}LE_?c{T-y}r16y7Q%?n%f@f@pr7O~Jq+t%4qSVKV)WRnwf zxCYWgO�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

PvcYs4E2}EBF&G_CEfYZ^3)E17Y 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�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 LJu_C|Xd(Xxd-%B+ literal 0 HcmV?d00001 diff --git a/archive/single_tech_samples/databricks_all_in_one/databricks/notebooks/azure_runner_docs_example.ipynb b/archive/single_tech_samples/databricks_all_in_one/databricks/notebooks/azure_runner_docs_example.ipynb new file mode 100644 index 000000000..33a333a7f --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/databricks/notebooks/azure_runner_docs_example.ipynb @@ -0,0 +1 @@ +{"cells":[{"cell_type":"code","execution_count":null,"source":["%scala\n","import com.databricks.labs.overwatch.pipeline.{Initializer, Bronze, Silver, Gold}\n","import com.databricks.labs.overwatch.utils._\n","import com.databricks.labs.overwatch.pipeline.TransformFunctions\n","import org.apache.spark.sql.functions._\n","import org.apache.spark.sql.DataFrame"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"c6ca3a13-547f-4b87-915b-44db0199c254"}}},{"cell_type":"markdown","source":["## Some Helper Functions / Vars"],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"86d13ac7-f776-445f-b9b0-5a6179baa3dc"}}},{"cell_type":"code","execution_count":null,"source":["%scala\n","val workspaceID = if (dbutils.notebook.getContext.tags(\"orgId\") == \"0\") {\n"," dbutils.notebook.getContext.tags(\"browserHostName\").split(\"\\\\.\")(0)\n","} else dbutils.notebook.getContext.tags(\"orgId\")\n","\n","def pipReport(db: String): DataFrame = {\n"," val basePip = spark.table(s\"${db}.pipeline_report\")\n"," .filter('organization_id === workspaceID)\n"," .orderBy('Pipeline_SnapTS.desc, 'moduleID)\n"," .withColumn(\"fromTSt\", from_unixtime('fromTS.cast(\"double\") / lit(1000)).cast(\"timestamp\"))\n"," .withColumn(\"untilTSt\", from_unixtime('untilTS.cast(\"double\") / lit(1000)).cast(\"timestamp\"))\n"," .drop(\"runStartTS\", \"runEndTS\", \"dataFrequency\", \"lastOptimizedTS\", \"vacuumRetentionHours\", \"inputConfig\", \"parsedConfig\")\n"," \n"," val pipReportColOrder = \"organization_id, moduleID, moduleName, primordialDateString, fromTSt, untilTSt, status, recordsAppended, fromTS, untilTS, Pipeline_SnapTS, Overwatch_RunID\".split(\", \")\n"," TransformFunctions.moveColumnsToFront(basePip, pipReportColOrder)\n","}"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"3da6eb65-9ec6-4617-8df3-aae9190f3340"}}},{"cell_type":"markdown","source":["## Setup Widgets For Simple Adjustments Or Job Configs\n","* Initiallize the widgets if running interactively\n","* Pull the widgets into usable variables to construct the config"],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"d683885b-ef57-4488-8838-1d720ea198c1"}}},{"cell_type":"code","execution_count":null,"source":["%scala\n","// dbutils.widgets.removeAll\n","// dbutils.widgets.text(\"storagePrefix\", \"\", \"1. ETL Storage Prefix\")\n","// dbutils.widgets.text(\"etlDBName\", \"overwatch_etl\", \"2. ETL Database Name\")\n","// dbutils.widgets.text(\"consumerDBName\", \"overwatch\", \"3. Consumer DB Name\")\n","// dbutils.widgets.text(\"secretsScope\", \"my_secret_scope\", \"4. Secret Scope\")\n","// dbutils.widgets.text(\"dbPATKey\", \"my_key_with_api\", \"5. Secret Key (DBPAT)\")\n","// dbutils.widgets.text(\"ehKey\", \"overwatch_eventhub_conn_string\", \"6. Secret Key (EH)\")\n","// dbutils.widgets.text(\"ehName\", \"my_eh_name\", \"7. EH Topic Name\")\n","// dbutils.widgets.text(\"primordialDateString\", \"2021-04-01\", \"8. Primordial Date\")\n","// dbutils.widgets.text(\"maxDaysToLoad\", \"60\", \"9. Max Days\")\n","// dbutils.widgets.text(\"scopes\", \"all\", \"A1. Scopes\")"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"9b930ef6-e89a-44d2-9e45-cedba282f84f"}}},{"cell_type":"code","execution_count":null,"source":["%scala\n","val storagePrefix = dbutils.widgets.get(\"storagePrefix\")\n","val etlDB = dbutils.widgets.get(\"etlDBName\")\n","val consumerDB = dbutils.widgets.get(\"consumerDBName\")\n","val secretsScope = dbutils.widgets.get(\"secretsScope\")\n","val dbPATKey = dbutils.widgets.get(\"dbPATKey\")\n","val ehName = dbutils.widgets.get(\"ehName\")\n","val ehKey = dbutils.widgets.get(\"ehKey\")\n","val primordialDateString = dbutils.widgets.get(\"primordialDateString\")\n","val maxDaysToLoad = dbutils.widgets.get(\"maxDaysToLoad\").toInt\n","val scopes = if (dbutils.widgets.get(\"scopes\") == \"all\") {\n"," \"audit,sparkEvents,jobs,clusters,clusterEvents,notebooks,pools\".split(\",\")\n","} else dbutils.widgets.get(\"scopes\").split(\",\")\n","\n","if (storagePrefix.isEmpty || consumerDB.isEmpty || etlDB.isEmpty || ehName.isEmpty || secretsScope.isEmpty || ehKey.isEmpty || dbPATKey.isEmpty) {\n"," throw new IllegalArgumentException(\"Please specify all required parameters!\")\n","}"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"f619d73c-4b21-433e-9cd5-62c0df1453e6"}}},{"cell_type":"code","execution_count":null,"source":["%sql\n","drop database overwatch cascade;\n","drop database overwatch_etl cascade;"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"f5b7ddca-46e5-49a8-9fb9-053caf22ae6e"}}},{"cell_type":"code","execution_count":null,"source":["%scala\n","dbutils.fs.rm(\"/tmp/overwatch01/8322965595968751/ehState/rawEventsCheckpoint\",recurse=true)"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"e67fda0b-0d4a-4661-98fd-8f864dbd43e5"}}},{"cell_type":"code","execution_count":null,"source":["%scala\n","// If first run this should be empty\n","display(dbutils.fs.ls(s\"${storagePrefix}/${workspaceID}\").toDF)"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"e4bf5471-4d62-4fe9-ab68-6d805f68272e"}}},{"cell_type":"markdown","source":["## Construct the Overwatch Params and Instantiate Workspace"],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"875dccd4-c8b8-49d3-abf1-4291e4cb47d3"}}},{"cell_type":"code","execution_count":null,"source":["%scala\n","private val dataTarget = DataTarget(\n"," Some(etlDB), Some(s\"${storagePrefix}/${workspaceID}/${etlDB}.db\"), Some(s\"${storagePrefix}/global_share\"),\n"," Some(consumerDB), Some(s\"${storagePrefix}/${workspaceID}/${consumerDB}.db\")\n",")\n","\n","private val tokenSecret = TokenSecret(secretsScope, dbPATKey)\n","private val ehConnString = dbutils.secrets.get(secretsScope, ehKey)\n","\n","private val ehStatePath = s\"${storagePrefix}/${workspaceID}/ehState\"\n","private val badRecordsPath = s\"${storagePrefix}/${workspaceID}/sparkEventsBadrecords\"\n","private val azureLogConfig = AzureAuditLogEventhubConfig(connectionString = ehConnString, eventHubName = ehName, auditRawEventsPrefix = ehStatePath)\n","private val interactiveDBUPrice = 0.56\n","private val automatedDBUPrice = 0.26\n","\n","val params = OverwatchParams(\n"," auditLogConfig = AuditLogConfig(azureAuditLogEventhubConfig = Some(azureLogConfig)),\n"," dataTarget = Some(dataTarget), \n"," tokenSecret = Some(tokenSecret),\n"," badRecordsPath = Some(badRecordsPath),\n"," overwatchScope = Some(scopes),\n"," maxDaysToLoad = maxDaysToLoad,\n"," databricksContractPrices = DatabricksContractPrices(interactiveDBUPrice, automatedDBUPrice),\n"," primordialDateString = Some(primordialDateString)\n",")\n","\n","private val args = JsonUtils.objToJson(params).compactString\n","val workspace = if (args.length != 0) {\n"," Initializer(Array(args), debugFlag = true)\n","} else { \n"," Initializer(Array()) \n","}"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"d20c81e9-e755-4a1e-8629-8ae0c21d6fac"}}},{"cell_type":"markdown","source":["## Show the Config Strings\n","This is a good time to run the following commands for when you're ready to convert this to run as a job as a main class"],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"73aa30b2-099e-4e11-9af7-a46c858960de"}}},{"cell_type":"code","execution_count":null,"source":["%scala\n","JsonUtils.objToJson(params).escapedString"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"81da62e7-fadc-4756-9b23-8b53697e9bef"}}},{"cell_type":"code","execution_count":null,"source":["%scala\n","JsonUtils.objToJson(params).compactString"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"bdfb31a5-baf1-449d-95a8-e1a505bc5c1d"}}},{"cell_type":"markdown","source":["## Execute The Pipeline"],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"732314fa-6dcf-42b6-bc13-78a1dfb132f0"}}},{"cell_type":"code","execution_count":null,"source":["%scala\n","Bronze(workspace).run()"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"f9a8185a-b748-42be-a447-222f60557c46"}}},{"cell_type":"code","execution_count":null,"source":["%scala\n","Silver(workspace).run()"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"2c16ab94-e2de-4e10-9818-fb20bb7bae95"}}},{"cell_type":"code","execution_count":null,"source":["%scala\n","Gold(workspace).run()"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"d4b3aad4-a6ad-4222-a526-6d8658d4493f"}}},{"cell_type":"markdown","source":["## Show The Run Report"],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"8774dd57-1319-4789-b2a9-99edb9b82c01"}}},{"cell_type":"code","execution_count":null,"source":["%scala\n","display(\n"," pipReport(etlDB)\n",")"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"8c18a078-0f8d-4e3c-b8e7-9ad9a01bb9bf"}}}],"metadata":{"application/vnd.databricks.v1+notebook":{"notebookName":"azure_runner_docs_example (1)","dashboards":[],"notebookMetadata":{"pythonIndentUnit":2},"language":"python","widgets":{"consumerDBName":{"nuid":"e14e62ac-8b9a-4427-9876-12d410da7372","currentValue":"overwatch","widgetInfo":{"widgetType":"text","name":"consumerDBName","defaultValue":"overwatch","label":"3. Consumer DB Name","options":{"widgetType":"text","validationRegex":null}}},"secretsScope":{"nuid":"9120affa-7926-41c3-8b6a-72bf0b32e7f2","currentValue":"secret_scope_01","widgetInfo":{"widgetType":"text","name":"secretsScope","defaultValue":"my_secret_scope","label":"4. Secret Scope","options":{"widgetType":"text","validationRegex":null}}},"scopes":{"nuid":"5f6ad48e-34cf-47f7-af4f-ae69629108a1","currentValue":"all","widgetInfo":{"widgetType":"text","name":"scopes","defaultValue":"all","label":"A1. Scopes","options":{"widgetType":"text","validationRegex":null}}},"maxDaysToLoad":{"nuid":"84d0bdc7-1e01-4629-bd8c-3c85053434ba","currentValue":"60","widgetInfo":{"widgetType":"text","name":"maxDaysToLoad","defaultValue":"60","label":"9. Max Days","options":{"widgetType":"text","validationRegex":null}}},"etlDBName":{"nuid":"891e79b5-2db1-401e-aeb6-c90bfa2b5301","currentValue":"overwatch_etl","widgetInfo":{"widgetType":"text","name":"etlDBName","defaultValue":"overwatch_etl","label":"2. ETL Database Name","options":{"widgetType":"text","validationRegex":null}}},"dbPATKey":{"nuid":"80d71d90-093d-42a0-bd3b-b496b0a4167a","currentValue":"DBPAT","widgetInfo":{"widgetType":"text","name":"dbPATKey","defaultValue":"my_key_with_api","label":"5. Secret Key (DBPAT)","options":{"widgetType":"text","validationRegex":null}}},"ehName":{"nuid":"8e78b59d-8cb5-42b2-b939-942e0fa16281","currentValue":"ehsusa","widgetInfo":{"widgetType":"text","name":"ehName","defaultValue":"my_eh_name","label":"7. EH Topic Name","options":{"widgetType":"text","validationRegex":null}}},"primordialDateString":{"nuid":"9f6106af-3370-44e6-8f87-999ee05ae0be","currentValue":"2021-07-01","widgetInfo":{"widgetType":"text","name":"primordialDateString","defaultValue":"2021-04-01","label":"8. Primordial Date","options":{"widgetType":"text","validationRegex":null}}},"ehKey":{"nuid":"92e5ae09-006c-4701-91d8-0518235d918a","currentValue":"EventHubPK","widgetInfo":{"widgetType":"text","name":"ehKey","defaultValue":"overwatch_eventhub_conn_string","label":"6. Secret Key (EH)","options":{"widgetType":"text","validationRegex":null}}},"storagePrefix":{"nuid":"bda11f29-11e1-4b7a-b281-e00c42eba2cb","currentValue":"/tmp/overwatch01","widgetInfo":{"widgetType":"text","name":"storagePrefix","defaultValue":"","label":"1. ETL Storage Prefix","options":{"widgetType":"text","validationRegex":null}}}},"notebookOrigID":552578725817318},"language_info":{"name":"python"}},"nbformat":4,"nbformat_minor":2} \ No newline at end of file diff --git a/archive/single_tech_samples/databricks_all_in_one/databricks/notebooks/test-notebook.ipynb b/archive/single_tech_samples/databricks_all_in_one/databricks/notebooks/test-notebook.ipynb new file mode 100644 index 000000000..9c1ffece5 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/databricks/notebooks/test-notebook.ipynb @@ -0,0 +1 @@ +{"cells":[{"cell_type":"code","execution_count":null,"source":["%scala\n","val containername = \"data\"\n","val storageaccountname = \"ssattirajudbks01\"\n","val source = \"abfss://\"+containername+\"@\"+storageaccountname+\".dfs.core.windows.net\"\n","val conf_key = \"fs.azure.account.key.\"+storageaccountname+\".dfs.core.windows.net\"\n","val scope_name = \"storage_scope\"\n","val key_name = \"StorageAccountKey1\"\n","\n","spark.conf.set(\n"," conf_key,\n"," dbutils.secrets.get(scope=scope_name,key=key_name))\n"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"ac29f351-1216-4157-b2f7-2adb33b53126"}}},{"cell_type":"code","execution_count":null,"source":["%python\n","from pyspark.sql.functions import rand, randn\n","df = sqlContext.range(0, 1000)\n","df.select(\"id\", rand(seed=0).alias(\"colA\"), randn(seed=10).alias(\"colB\"))\n","df.write.mode(\"overwrite\").csv(source+\"/tmp\")"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"96afaf8b-25ea-4bd3-94b0-6f9b95b502f3"}}},{"cell_type":"code","execution_count":null,"source":["dbutils.fs.ls(source+\"/tmp\")"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"ec6da2de-2295-449b-ab36-bee9e04f8884"}}},{"cell_type":"code","execution_count":null,"source":[],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"3569ce3c-f358-4b05-a1b8-f9dabf3ce124"}}}],"metadata":{"application/vnd.databricks.v1+notebook":{"notebookName":"test-notebook","dashboards":[],"notebookMetadata":{"pythonIndentUnit":2},"language":"python","widgets":{},"notebookOrigID":3989678027069523},"language_info":{"name":"python"}},"nbformat":4,"nbformat_minor":2} \ No newline at end of file diff --git a/archive/single_tech_samples/databricks_all_in_one/databricks/notebooks/timezone_test.ipynb b/archive/single_tech_samples/databricks_all_in_one/databricks/notebooks/timezone_test.ipynb new file mode 100644 index 000000000..1ebba7bca --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/databricks/notebooks/timezone_test.ipynb @@ -0,0 +1 @@ +{"cells":[{"cell_type":"code","execution_count":null,"source":["spark.conf.set(\"spark.sql.session.timeZone\", \"UTC\")\n","spark.conf.get(\"spark.sql.session.timeZone\")"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"0afa1ab1-071f-44e8-8b2a-c528d6731e25"}}},{"cell_type":"code","execution_count":null,"source":["from pyspark.sql import functions as F\n","from pyspark.sql.types import *\n","from datetime import datetime,timezone\n","\n","def create_datetime_df():\n"," date_func = udf (lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M:%S'), DateType())\n"," time_func = udf (lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M:%S'), TimestampType())\n","\n"," START_DATE = datetime(2021,1,1,0,0,0)\n"," END_DATE = datetime(2021,7,1,0,0,0)\n"," df = spark.sql('SELECT sequence({start_date}, {end_date}, 60*15) as timestamp_seq'.format(start_date=int(START_DATE.timestamp()), end_date=int(END_DATE.timestamp())))\n","\n"," datetime_df = df \\\n"," .withColumn('timestamp',F.explode('timestamp_seq')) \\\n"," .drop('timestamp_seq') \\\n"," .withColumn(\"id\", F.monotonically_increasing_id()) \\\n"," .withColumn('timestamp_string',F.from_unixtime(F.col('timestamp'))) \\\n"," .withColumn('timestamp_datetype',date_func(F.col('timestamp_string'))) \\\n"," .withColumn('timestamp_timestamptype',time_func(F.col('timestamp_string')))\n"," return datetime_df"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"db1b206f-e2c2-4bc3-b3ca-6595c63683e6"}}},{"cell_type":"code","execution_count":null,"source":["utc_datetime_write = create_datetime_df()"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"577cf5a9-aeaa-4327-893e-09f941b6ea88"}}},{"cell_type":"code","execution_count":null,"source":["display(\n"," utc_datetime_write\n",")"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"425b5516-d0c2-4dd2-b010-66b81725d28e"}}},{"cell_type":"code","execution_count":null,"source":["utc_datetime_write.write.mode('overwrite').parquet('/dbfs/tmp/datetimetest/')"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"f2b8bd71-96a3-4d7b-9e87-a929f992dfdb"}}},{"cell_type":"code","execution_count":null,"source":["spark.conf.set(\"spark.sql.session.timeZone\",\"Asia/Bangkok\")\n","spark.conf.get(\"spark.sql.session.timeZone\")"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"1c1400be-f0e3-4797-94f2-5e8d7cf5d95c"}}},{"cell_type":"code","execution_count":null,"source":["reader = spark.read.parquet('/dbfs/tmp/datetimetest/')"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"96f3cf19-158c-4c5c-85c1-1addfe0fcfe3"}}},{"cell_type":"code","execution_count":null,"source":["display(\n","reader\n",")"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"06cd553c-7b03-4616-80cc-060cde0e2f53"}}},{"cell_type":"code","execution_count":null,"source":["reader.show()"],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"df4ba8a9-d76b-4164-8868-238a5f83f490"}}},{"cell_type":"code","execution_count":null,"source":[],"outputs":[],"metadata":{"application/vnd.databricks.v1+cell":{"title":"","showTitle":false,"inputWidgets":{},"nuid":"9396bfa7-806f-44c7-be93-44366782f60f"}}}],"metadata":{"application/vnd.databricks.v1+notebook":{"notebookName":"timezone_test","dashboards":[],"notebookMetadata":{"pythonIndentUnit":2},"language":"python","widgets":{},"notebookOrigID":576431062576657},"language_info":{"name":"python"}},"nbformat":4,"nbformat_minor":2} \ No newline at end of file diff --git a/archive/single_tech_samples/databricks_all_in_one/databricks/workspace.template.bicep b/archive/single_tech_samples/databricks_all_in_one/databricks/workspace.template.bicep new file mode 100644 index 000000000..fed88bae7 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/databricks/workspace.template.bicep @@ -0,0 +1,56 @@ +@description('') +param vnetName string +@allowed([ + 'standard' + 'premium' +]) +@description('') +param adbWorkspaceSkuTier string +@description('') +param publicSubnetName string = 'public-subnet' +@description('') +param privateSubnetName string = 'private-subnet' +@description('') +param disablePublicIp bool = true +@description('') +param adbWorkspaceLocation string = resourceGroup().location +@description('') +param adbWorkspaceName string +@description('') +param tagValues object = {} + +var managedResourceGroupName = 'databricks-rg-${adbWorkspaceName}-${uniqueString(adbWorkspaceName, resourceGroup().id)}' +var managedResourceGroupId = '${subscription().id}/resourceGroups/${managedResourceGroupName}' +var vnetId = resourceId('Microsoft.Network/virtualNetworks', vnetName) + +resource adbWorkspaceName_resource 'Microsoft.Databricks/workspaces@2018-04-01' = { + location: adbWorkspaceLocation + name: adbWorkspaceName + sku: { + name: adbWorkspaceSkuTier + } + properties: { + managedResourceGroupId: managedResourceGroupId + parameters: { + customVirtualNetworkId: { + value: vnetId + } + customPublicSubnetName: { + value: publicSubnetName + } + customPrivateSubnetName: { + value: privateSubnetName + } + enableNoPublicIp: { + value: disablePublicIp + } + } + } + tags: tagValues + dependsOn: [] +} + + +output databricks_workspace_id string = adbWorkspaceName_resource.id +output databricks_workspaceUrl string = adbWorkspaceName_resource.properties.workspaceUrl +output databricks_dbfs_storage_accountName string = adbWorkspaceName_resource.properties.parameters.storageAccountName.value diff --git a/archive/single_tech_samples/databricks_all_in_one/keyvault/keyvault.template.bicep b/archive/single_tech_samples/databricks_all_in_one/keyvault/keyvault.template.bicep new file mode 100644 index 000000000..29d91d9f4 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/keyvault/keyvault.template.bicep @@ -0,0 +1,72 @@ +@description('Specifies the name of the key vault.') +param keyVaultName string + +@description('Specifies the Azure location where the key vault should be created.') +param keyVaultLocation string = resourceGroup().location + +@allowed([ + true + false +]) +@description('Specifies whether Azure Virtual Machines are permitted to retrieve certificates stored as secrets from the key vault.') +param enabledForDeployment bool = false + +@allowed([ + true + false +]) +@description('Specifies whether Azure Resource Manager is permitted to retrieve secrets from the key vault.') +param enabledForTemplateDeployment bool = false + +@description('Specifies the Azure Active Directory tenant ID that should be used for authenticating requests to the key vault. Get it by using Get-AzSubscription cmdlet.') +param tenantId string = subscription().tenantId + +@description('Specifies the object ID of a user, service principal or security group in the Azure Active Directory tenant for the vault. The object ID must be unique for the list of access policies. Get it by using Get-AzADUser or Get-AzADServicePrincipal cmdlets.') +param objectId string + +@allowed([ + 'standard' + 'premium' +]) +@description('Specifies whether the key vault is a standard vault or a premium vault.') +param keyVaultSkuTier string = 'standard' +param tagValues object = {} + +resource keyVaultName_resource 'Microsoft.KeyVault/vaults@2019-09-01' = { + name: keyVaultName + location: keyVaultLocation + properties: { + enabledForDeployment: enabledForDeployment + enabledForTemplateDeployment: enabledForTemplateDeployment + tenantId: tenantId + accessPolicies: [ + { + objectId: objectId + tenantId: tenantId + permissions: { + secrets: [ + 'list' + 'get' + 'set' + ] + } + } + ] + sku: { + name: keyVaultSkuTier + family: 'A' + } + softDeleteRetentionInDays: 7 + networkAcls: { + defaultAction: 'Deny' + bypass: 'AzureServices' + ipRules: [] + virtualNetworkRules: [] + } + } + tags: tagValues +} + +output keyvault_id string = keyVaultName_resource.id +output keyvault_uri string = keyVaultName_resource.properties.vaultUri +output keyvaultResource object = keyVaultName_resource diff --git a/archive/single_tech_samples/databricks_all_in_one/keyvault/keyvaultsecrets.template.bicep b/archive/single_tech_samples/databricks_all_in_one/keyvault/keyvaultsecrets.template.bicep new file mode 100644 index 000000000..e9d393cab --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/keyvault/keyvaultsecrets.template.bicep @@ -0,0 +1,68 @@ +param keyVaultName string +param LogAWkspId string + +@secure() +param LogAWkspkey string +@secure() +param StorageAccountKey1 string +@secure() +param StorageAccountKey2 string +@secure() +param EventHubPK string +@secure() +param DbPATKey string + +param updateAKVKeys bool + +resource keyVault 'Microsoft.KeyVault/vaults@2021-06-01-preview' existing = { + name: keyVaultName +} + +resource keyVaultAddSecretsLogAWkspId 'Microsoft.KeyVault/vaults/secrets@2021-04-01-preview' = if(updateAKVKeys) { + parent: keyVault + name: 'LogAWkspId' + properties: { + contentType: 'text/plain' + value: LogAWkspId + } +} +resource keyVaultAddSecretsLogAWkspkey 'Microsoft.KeyVault/vaults/secrets@2021-04-01-preview' = if(updateAKVKeys) { + parent: keyVault + name: 'LogAWkspkey' + properties: { + contentType: 'text/plain' + value: LogAWkspkey + } +} +resource keyVaultAddSecretsStg1 'Microsoft.KeyVault/vaults/secrets@2021-04-01-preview' = if(updateAKVKeys) { + parent: keyVault + name: 'StorageAccountKey1' + properties: { + contentType: 'text/plain' + value: StorageAccountKey1 + } +} +resource keyVaultAddSecretsStg2 'Microsoft.KeyVault/vaults/secrets@2021-04-01-preview' = if(updateAKVKeys) { + parent: keyVault + name: 'StorageAccountKey2' + properties: { + contentType: 'text/plain' + value: StorageAccountKey2 + } +} +resource keyVaultAddSecretsEventHubPK 'Microsoft.KeyVault/vaults/secrets@2021-04-01-preview' = if(updateAKVKeys) { + parent: keyVault + name: 'EventHubPK' + properties: { + contentType: 'text/plain' + value: EventHubPK + } +} +resource keyVaultAddSecretsDatabricksPAT 'Microsoft.KeyVault/vaults/secrets@2021-04-01-preview' = if(updateAKVKeys) { + parent: keyVault + name: 'DbPATKey' + properties: { + contentType: 'text/plain' + value: DbPATKey + } +} diff --git a/archive/single_tech_samples/databricks_all_in_one/main.bicep b/archive/single_tech_samples/databricks_all_in_one/main.bicep new file mode 100644 index 000000000..063fd0590 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/main.bicep @@ -0,0 +1,339 @@ +targetScope = 'subscription' + +@minLength(2) +@maxLength(4) +@description('2-4 chars to prefix the Azure resources, NOTE: no number or symbols') +param prefix string = 'sri' + +@description('Client PC username, NOTE: do not use admin') +param adminUsername string + +@description('Client PC password, with atleast 8 char length containing uppercase, digits and special characters ') +@minLength(8) +@secure() +param adminPassword string + +var uniqueSubString = '${uniqueString(guid(subscription().subscriptionId))}' +var uString = '${prefix}${uniqueSubString}' + +param linkAkstoAml bool = true +param deployADBCluster bool = true +param updateAKVKeys bool = true + +// ADB Config +param adb_pat_lifetime string = '3600' +param adb_cluster_name string = 'test-cluster-01' +param adb_spark_version string = '7.3.x-scala2.12' +param adb_node_type string = 'Standard_D3_v2' +param adb_num_worker string = '3' +param adb_auto_terminate_min string = '30' + +var storageAccountName = '${substring(uString, 0, 10)}stg01' +var keyVaultName = '${substring(uString, 0, 6)}-akv-00' +var resourceGroupName = '${substring(uString, 0, 6)}-rg' +var adbWorkspaceName = '${substring(uString, 0, 6)}-AdbWksp' +var nsgName = '${substring(uString, 0, 6)}-nsg' +var firewallName = '${substring(uString, 0, 6)}-HubFW' +var firewallPublicIpName = '${substring(uString, 0, 6)}-FWPIp' +var fwRoutingTable = '${substring(uString, 0, 6)}-AdbRoutingTbl' +var clientPcName = '${substring(uString, 0, 6)}-ClientPc' +var eHNameSpace = '${substring(uString, 0, 6)}-eh' +var adbAkvLinkName = '${substring(uString, 0, 6)}SecretScope' +var amlWorkspaceName = '${substring(uString, 0, 6)}-AmlWksp' +var containerRegistryName = '${substring(uString, 0, 6)}registry' //Resource names may contain alpha numeric characters only and must be between 5 and 50 characters. +var applicationInsightsName = '${substring(uString, 0, 6)}-AppInsights' +var sslLeafName = '${toLower(substring(uString, 0, 6))}' +var aksAmlComputeName = 'aks-${substring(uString, 0, 6)}' + +@description('The number of nodes for the cluster.') +@minValue(3) +@maxValue(50) +param aksAgentCount int = 3 + +@description('The size of the VM instances') +param aksAgentVMSize string = 'Standard_A4_v2' + +var aksDNSPrefix = '${toLower(substring(uString, 0, 6))}' +// var routeTableName = 'RouteTable' +// creating the event hub same as namespace +var eventHubName = eHNameSpace +var managedIdentityName = '${substring(uString, 0, 6)}Identity' + +@description('Default location of the resources') +param location string = 'southeastasia' +@description('') +param hubVnetName string = 'hubvnet' +@description('') +param spokeVnetName string = 'spokevnet' +@description('') +param HubVnetCidr string = '10.0.0.0/16' +@description('') +param FirewallSubnetCidr string = '10.0.1.0/26' +@description('') +param clientDevicesSubnetCidr string = '10.0.200.0/24' +// Divide 10.179.0.0/16 into 4 group for simplicity, each with 16,382 address +// 10.179.0.0/18 +// 10.179.64.0/18 +// 10.179.128.0/18 +// 10.179.192.0/18 +@description('') +param SpokeVnetCidr string = '10.179.0.0/16' +@description('') +param PrivateSubnetCidr string = '10.179.0.0/18' +@description('') +param PublicSubnetCidr string = '10.179.64.0/18' +@description('') +param AksSubnetCidr string = '10.179.128.0/18' +@description('') +param PrivateLinkSubnetCidr string = '10.179.192.0/18' + +@description('Southeastasia ADB webapp address') +param webappDestinationAddresses array = [ + '52.187.145.107/32' + '52.187.0.85/32' +] +@description('Southeastasia ADB log blob') +param logBlobstorageDomains array = [ + 'dblogprodseasia.blob.${environment().suffixes.storage}' +] +@description('Southeastasia ADB extended ip') +param extendedInfraIp array = [ + '20.195.104.64/28' +] +@description('Southeastasia SCC relay Domain') +param sccReplayDomain array = [ + 'tunnel.southeastasia.azuredatabricks.net' +] +@description('Southeastasia SDB metastore') +param metastoreDomains array = [ + 'consolidated-southeastasia-prod-metastore.mysql.database.azure.com' +] +@description('Southeastasia EventHub endpoint') +param eventHubEndpointDomain array = [ + 'prod-southeastasia-observabilityeventhubs.servicebus.windows.net' +] +@description('Southeastasia Artifacts Blob') +param artifactBlobStoragePrimaryDomains array = [ + 'dbartifactsprodseap.blob.${environment().suffixes.storage}' + 'arprodseapa1.blob.${environment().suffixes.storage}' + 'arprodseapa2.blob.${environment().suffixes.storage}' + 'arprodseapa3.blob.${environment().suffixes.storage}' + 'dbartifactsprodeap.blob.${environment().suffixes.storage}' +] + +resource rg 'Microsoft.Resources/resourceGroups@2021-04-01' = { + name: resourceGroupName + location: location +} + +module myIdentity './other/managedIdentity.template.bicep' = { + scope: rg + name: 'ManagedIdentity' + params: { + managedIdentityName: managedIdentityName + location: location + } +} + +module nsg './network/securitygroup.template.bicep' = { + scope: rg + name: 'NetworkSecurityGroup' + params: { + securityGroupName: nsgName + } +} + +module routeTable './network/routetable.template.bicep' = { + scope: rg + name: 'RouteTable' + params: { + routeTableName: fwRoutingTable + } +} + +module vnets './network/vnet.template.bicep' = { + scope: rg + name: 'HubandSpokeVnets' + params: { + hubVnetName: hubVnetName + spokeVnetName: spokeVnetName + routeTableName: routeTable.outputs.routeTblName + securityGroupName: nsg.outputs.nsgName + firewallSubnetCidr: FirewallSubnetCidr + hubVnetCidr: HubVnetCidr + spokeVnetCidr: SpokeVnetCidr + publicSubnetCidr: PublicSubnetCidr + privateSubnetCidr: PrivateSubnetCidr + privatelinkSubnetCidr: PrivateLinkSubnetCidr + clinetDevicesSubnetCidr: clientDevicesSubnetCidr + AksSubnetCidr: AksSubnetCidr + } +} + +module adlsGen2 './storage/storageaccount.template.bicep' = { + scope: rg + name: 'StorageAccount' + params: { + storageAccountName: storageAccountName + databricksPublicSubnetId: vnets.outputs.databricksPublicSubnetId + } +} +module adb './databricks/workspace.template.bicep' = { + scope: rg + name: 'DatabricksWorkspace' + params: { + vnetName: vnets.outputs.spokeVnetName + adbWorkspaceSkuTier: 'premium' + adbWorkspaceName: adbWorkspaceName + } +} +module hubFirewall './network/firewall.template.bicep' = { + scope: rg + name: 'HubFirewall' + params: { + firewallName: firewallName + publicIpAddressName: firewallPublicIpName + vnetName: vnets.outputs.hubVnetName + webappDestinationAddresses: webappDestinationAddresses + logBlobstorageDomains: logBlobstorageDomains + infrastructureDestinationAddresses: extendedInfraIp + sccRelayDomains: sccReplayDomain + metastoreDomains: metastoreDomains + eventHubEndpointDomains: eventHubEndpointDomain + artifactBlobStoragePrimaryDomains: artifactBlobStoragePrimaryDomains + dbfsBlobStrageDomain: array('${adb.outputs.databricks_dbfs_storage_accountName}.blob.${environment().suffixes.storage}') + clientPrivateIpAddr: clientpc.outputs.clientPrivateIpaddr + } +} + +module routeTableUpdate './network/routetableFirewallRoute.template.bicep' = { + scope: rg + name: 'RouteTableUpdate' + params: { + routeTableName: fwRoutingTable + firewallPrivateIp: hubFirewall.outputs.firewallPrivateIp + } +} + +module keyVault './keyvault/keyvault.template.bicep' = { + scope: rg + name: 'KeyVault' + params: { + keyVaultName: keyVaultName + objectId: myIdentity.outputs.mIdentityClientId + } +} + +module clientpc './other/clientdevice.template.bicep' = { + name: 'ClientPC' + scope: rg + params: { + adminUsername: adminUsername + adminPassword: adminPassword + vnetName: vnets.outputs.hubVnetName + clientPcName: clientPcName + } + dependsOn: [ + vnets + ] +} + +module loganalytics './monitor/loganalytics.template.bicep' = { + scope: rg + name: 'LogAnalytics' +} + +module eventHubLogging './monitor/eventhub.template.bicep' = { + scope: rg + name: 'EventHub' + params: { + namespaceName: eHNameSpace + } +} + +module privateEndPoints './network/privateendpoint.template.bicep' = { + scope: rg + name: 'PrivateEndPoints' + params: { + keyvaultPrivateLinkResource: keyVault.outputs.keyvault_id + privateLinkSubnetId: vnets.outputs.privatelinksubnet_id + storageAccountName: adlsGen2.name + storageAccountPrivateLinkResource: adlsGen2.outputs.storageaccount_id + eventHubName: eventHubName + eventHubPrivateLinkResource: eventHubLogging.outputs.eHNamespaceId + AmlName: aml.name + amlPrivateLinkResource: aml.outputs.amlId + vnetName: vnets.outputs.spokeVnetName + containerRegistryName: aml.outputs.ctrRegistryName + crPrivateLinkResource: aml.outputs.ctrRegistryId + } +} + +module createDatabricksCluster './databricks/deployment.template.bicep' = { + scope: rg + name: 'DatabricksCluster' + params: { + location: location + identity: myIdentity.outputs.mIdentityId + adb_workspace_url: adb.outputs.databricks_workspaceUrl + adb_workspace_id: adb.outputs.databricks_workspace_id + adb_secret_scope_name: adbAkvLinkName + akv_id: keyVault.outputs.keyvault_id + akv_uri: keyVault.outputs.keyvault_uri + LogAWkspId: loganalytics.outputs.logAnalyticsWkspId + LogAWkspKey: loganalytics.outputs.primarySharedKey + storageKey: adlsGen2.outputs.key1 + evenHubKey: eventHubLogging.outputs.eHPConnString + eventHubId: eventHubLogging.outputs.eHubNameId + deployADBCluster: deployADBCluster + adb_pat_lifetime: adb_pat_lifetime + adb_cluster_name: adb_cluster_name + adb_spark_version: adb_spark_version + adb_node_type: adb_node_type + adb_num_worker: adb_num_worker + adb_auto_terminate_min: adb_auto_terminate_min + } +} + +module AksForAml 'aks/standalone-aks.template.bicep' = { + scope: rg + name: 'CreateAksCluster' + params: { + aksSubnetId: vnets.outputs.aksSubnet_id + aksAgentCount: aksAgentCount + aksAgentVMSize: aksAgentVMSize + dnsPrefix: aksDNSPrefix + clusterName: aksAmlComputeName + } +} +module aml './aml/machinelearning.template.bicep' = { + scope: rg + name: 'MLWorkspace' + params: { + amlWorkspaceName: amlWorkspaceName + containerRegistryName: containerRegistryName + keyVaultIdentifierId: keyVault.outputs.keyvault_id + storageAccount: adlsGen2.outputs.storageaccount_id + applicationInsightsName: applicationInsightsName + aksClusterId: AksForAml.outputs.aksClusterResourceId + aksAmlComputeName: aksAmlComputeName + aksClusterPrincipleId:AksForAml.outputs.kubeletidentity + sslLeafName: sslLeafName + linkAkstoAml: linkAkstoAml + } +} + +module UpdateSecretsKeyVault './keyvault/keyvaultsecrets.template.bicep' = { + scope: rg + name: 'UpdateSecretsKeyVault' + params: { + EventHubPK: eventHubLogging.outputs.eHPConnString + keyVaultName: keyVaultName + LogAWkspId: loganalytics.outputs.logAnalyticsWkspId + LogAWkspkey: loganalytics.outputs.primarySharedKey + StorageAccountKey1: adlsGen2.outputs.key1 + StorageAccountKey2: adlsGen2.outputs.key2 + DbPATKey: createDatabricksCluster.outputs.patToken + updateAKVKeys: updateAKVKeys + } +} diff --git a/archive/single_tech_samples/databricks_all_in_one/monitor/eventhub.template.bicep b/archive/single_tech_samples/databricks_all_in_one/monitor/eventhub.template.bicep new file mode 100644 index 000000000..83f574479 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/monitor/eventhub.template.bicep @@ -0,0 +1,59 @@ +@description('Name for the Event Hub cluster.') +param namespaceName string + +@description('Name for the Event Hub to be created in the Event Hub namespace within the Event Hub cluster.') +param eventHubName string = namespaceName + +@description('Specifies the Azure location for all resources.') +param location string = resourceGroup().location + +@description('') +param eHRuleName string = 'rule' + +resource namespaceName_resource 'Microsoft.EventHub/namespaces@2021-01-01-preview' = { + name: namespaceName + location: location + sku: { + name: 'Standard' + tier: 'Standard' + capacity: 1 + } + properties: { + isAutoInflateEnabled: false + maximumThroughputUnits: 0 + } +} + +resource namespaceName_eventHubName 'Microsoft.EventHub/namespaces/eventhubs@2021-01-01-preview' = { + parent: namespaceName_resource + name: eventHubName + properties: { + messageRetentionInDays: 7 + partitionCount: 1 + } + dependsOn: [ + namespaceName_resource + ] +} + +resource namespaceName_rule 'Microsoft.EventHub/namespaces/eventhubs/authorizationRules@2021-01-01-preview' = { + name: '${namespaceName}/${eventHubName}/${eHRuleName}' + properties: { + rights: [ + 'Send' + 'Listen' + ] + } + dependsOn: [ + namespaceName_eventHubName + ] +} + +var keysObj = listKeys(resourceId('Microsoft.EventHub/namespaces/eventhubs/authorizationRules', namespaceName, eventHubName, eHRuleName), '2021-01-01-preview') + +output eHNamespaceId string = namespaceName_resource.id +output eHubNameId string = namespaceName_eventHubName.id +output eHAuthRulesId string = namespaceName_rule.id +// output eHObjName object = keysObj +output eHPConnString string = keysObj.primaryConnectionString +output eHName string = eventHubName diff --git a/archive/single_tech_samples/databricks_all_in_one/monitor/loganalytics.template.bicep b/archive/single_tech_samples/databricks_all_in_one/monitor/loganalytics.template.bicep new file mode 100644 index 000000000..f0c1be75e --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/monitor/loganalytics.template.bicep @@ -0,0 +1,214 @@ +param logAnalyticsWkspName string = toLower('spark-monitoring-${uniqueString(resourceGroup().name)}') +param logAnalyticsWkspLocation string = resourceGroup().location +@allowed([ + 'Free' + 'Standalone' + 'PerNode' + 'PerGB2018' +]) +@description('Service Tier: Free, Standalone, PerNode, or PerGB2018') +param logAnalyticsWkspSku string = 'Standalone' + +@minValue(7) +@maxValue(730) +@description('Number of days of retention. Free plans can only have 7 days, Standalone and Log Analytics plans include 30 days for free') +param logAnalyticsWkspRentationDays int = 30 + +var queries = [ + { + displayName: 'Stage Latency Per Stage (Stage Duration)' + query: 'let results=SparkListenerEvent_CL\n| where Event_s contains "SparkListenerStageSubmitted"\n| extend metricsns=columnifexists("Properties_spark_metrics_namespace_s",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,apptag,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains "SparkListenerStageCompleted" \n | extend stageDuration=Stage_Info_Completion_Time_d - Stage_Info_Submission_Time_d\n) on Stage_Info_Stage_ID_d;\nresults\n | extend slice = strcat(Properties_spark_databricks_clusterUsageTags_clusterName_s,"-",apptag," ",Stage_Info_Stage_Name_s) \n| extend stageDuration=Stage_Info_Completion_Time_d - Stage_Info_Submission_Time_d \n| summarize percentiles(stageDuration,10,30,50,90) by bin(TimeGenerated, 1m), slice\n| order by TimeGenerated asc nulls last\n\n' + } + { + displayName: 'Stage Throughput Per Stage' + query: 'let results=SparkListenerEvent_CL\n| where Event_s contains "SparkListenerStageSubmitted"\n| extend metricsns=columnifexists("Properties_spark_metrics_namespace_s",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project \nStage_Info_Stage_ID_d,apptag,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains "SparkListenerStageCompleted" \n) on Stage_Info_Stage_ID_d;\nresults\n | extend slice = strcat("# StagesCompleted ",Properties_spark_databricks_clusterUsageTags_clusterName_s,"-",\napptag," ",Stage_Info_Stage_Name_s) \n| summarize StagesCompleted=count(Event_s) by bin(TimeGenerated,1m), slice\n| order by TimeGenerated asc nulls last\n\n' + } + { + displayName: 'Tasks Per Stage' + query: 'let results=SparkListenerEvent_CL\n| where Event_s contains "SparkListenerStageSubmitted"\n| extend metricsns=columnifexists("Properties_spark_metrics_namespace_s",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project \nStage_Info_Stage_ID_d,apptag,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains "SparkListenerStageCompleted" \n) on Stage_Info_Stage_ID_d;\nresults\n | extend slice = strcat("# StagesCompleted ",Properties_spark_databricks_clusterUsageTags_clusterName_s,"-",apptag," ",Stage_Info_Stage_Name_s)\n| extend slice=strcat(Properties_spark_databricks_clusterUsageTags_clusterName_s,"-",apptag," ",Stage_Info_Stage_Name_s) \n| project Stage_Info_Number_of_Tasks_d,slice,TimeGenerated \n| order by TimeGenerated asc nulls last\n\n' + } + { + displayName: '% Serialize Time Per Executor' + query: 'let results = SparkMetric_CL\n| where name_s contains "executor.resultserializationtime" \n| extend sname=split(name_s, ".") \n| extend executor=strcat(sname[0],".",sname[1])\n| project TimeGenerated , setime=count_d , executor ,name_s\n| join kind= inner (\nSparkMetric_CL\n| where name_s contains "executor.RunTime"\n| extend sname=split(name_s, ".") \n| extend executor=strcat(sname[0],".",sname[1])\n| project TimeGenerated , runTime=count_d , executor ,name_s\n) on executor, TimeGenerated;\nresults\n| extend serUsage=(setime/runTime)*100\n| summarize SerializationCpuTime=percentile(serUsage,90) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last\n| render timechart ' + } + { + displayName: 'Shuffle Bytes Read Per Executor' + query: 'let results=SparkMetric_CL\n| where name_s contains "executor.shuffleTotalBytesRead"\n| extend sname=split(name_s, ".") \n| extend executor=strcat(sname[0],".",sname[1])\n| summarize MaxShuffleWrites=max(count_d) by bin(TimeGenerated, 1m), executor \n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkMetric_CL\n | where name_s contains "executor.shuffleTotalBytesRead"\n | extend sname=split(name_s, ".") \n | extend executor=strcat(sname[0],".",sname[1])\n| summarize MinShuffleWrites=min(count_d) by bin(TimeGenerated, 1m), executor\n) on executor, TimeGenerated;\nresults\n| extend ShuffleBytesWritten=MaxShuffleWrites-MinShuffleWrites \n| summarize max(ShuffleBytesWritten) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last\n' + } + { + displayName: 'Error Traces (Bad Record Or Bad Files)' + query: 'SparkListenerEvent_CL\r\n| where Level contains "Error"\r\n| project TimeGenerated , Message \r\n' + } + { + displayName: 'Task Shuffle Bytes Written' + query: 'let result=SparkListenerEvent_CL\n| where Event_s contains "SparkListenerStageSubmitted"\n| extend metricsns=columnifexists("Properties_spark_metrics_namespace_s",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains "SparkListenerTaskEnd"\n | where Task_End_Reason_Reason_s contains "Success"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\n Task_Metrics_JVM_GC_Time_d,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend schedulerdelay = Task_Info_Launch_Time_d - Stage_Info_Submission_Time_d\n| extend name=strcat("SchuffleBytesWritten ",Properties_spark_databricks_clusterUsageTags_clusterName_s,"-",apptag," ",Stage_Info_Stage_Name_s)\n| summarize percentile(Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,90) by bin(TimeGenerated,1m),name\n| order by TimeGenerated asc nulls last;\n\n' + } + { + displayName: 'Task Input Bytes Read' + query: 'let result=SparkListenerEvent_CL\n| where Event_s contains "SparkListenerStageSubmitted"\n| extend metricsns=columnifexists("Properties_spark_metrics_namespace_s",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains "SparkListenerTaskEnd"\n | where Task_End_Reason_Reason_s contains "Success"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\n Task_Metrics_JVM_GC_Time_d,Task_Metrics_Input_Metrics_Bytes_Read_d,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend name=strcat("InputBytesRead ",Properties_spark_databricks_clusterUsageTags_clusterName_s,"-",apptag," ",Stage_Info_Stage_Name_s)\n| summarize percentile(Task_Metrics_Input_Metrics_Bytes_Read_d,90) by bin(TimeGenerated,1m),name\n| order by TimeGenerated asc nulls last;\n\n' + } + { + displayName: 'Sum Task Execution Per Host' + query: 'SparkListenerEvent_CL\n| where Event_s contains "taskend" \n| extend taskDuration=Task_Info_Finish_Time_d-Task_Info_Launch_Time_d \n| summarize sum(taskDuration) by bin(TimeGenerated, 1m), Task_Info_Host_s\n| order by TimeGenerated asc nulls last ' + } + { + displayName: '% CPU Time Per Executor' + query: 'let results = SparkMetric_CL \n| where name_s contains "executor.cpuTime" \n| extend sname=split(name_s, ".")\n| extend executor=strcat(sname[0],".",sname[1])\n| project TimeGenerated , cpuTime=count_d/1000000 , executor ,name_s\n| join kind= inner (\n SparkMetric_CL\n| where name_s contains "executor.RunTime"\n| extend sname=split(name_s, ".") \n| extend executor=strcat(sname[0],".",sname[1])\n| project TimeGenerated , runTime=count_d , executor ,name_s\n) on executor, TimeGenerated;\nresults\n| extend cpuUsage=(cpuTime/runTime)*100\n| summarize ExecutorCpuTime = percentile(cpuUsage,90) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last \n' + } + { + displayName: 'Job Throughput' + query: 'let results=SparkListenerEvent_CL\n| where Event_s contains "SparkListenerJobStart"\n| extend metricsns=columnifexists("Properties_spark_metrics_namespace_s",Properties_spark_app_id_s)\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\n| project Job_ID_d,apptag,Properties_spark_databricks_clusterUsageTags_clusterName_s,TimeGenerated\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains "SparkListenerJobEnd"\n | where Job_Result_Result_s contains "JobSucceeded"\n | project Event_s,Job_ID_d,TimeGenerated\n) on Job_ID_d;\nresults\n| extend slice=strcat("#JobsCompleted ",Properties_spark_databricks_clusterUsageTags_clusterName_s,"-",apptag)\n| summarize count(Event_s) by bin(TimeGenerated, 1m),slice\n| order by TimeGenerated asc nulls last' + } + { + displayName: 'Shuffle Disk Bytes Spilled Per Executor' + query: 'let results=SparkMetric_CL\r\n| where name_s contains "executor.diskBytesSpilled"\r\n| extend sname=split(name_s, ".") \r\n| extend executor=strcat("executorid:",sname[1])\r\n| summarize MaxShuffleWrites=max(count_d) by bin(TimeGenerated, 1m), executor \r\n| order by TimeGenerated asc nulls last \r\n| join kind= inner (\r\n SparkMetric_CL\r\n | where name_s contains "executor.diskBytesSpilled"\r\n | extend sname=split(name_s, ".") \r\n | extend executor=strcat("executorid:",sname[1])\r\n| summarize MinShuffleWrites=min(count_d) by bin(TimeGenerated, 1m), executor\r\n) on executor, TimeGenerated;\r\nresults\r\n| extend ShuffleBytesWritten=MaxShuffleWrites-MinShuffleWrites \r\n| summarize any(ShuffleBytesWritten) by bin(TimeGenerated, 1m), executor\r\n| order by TimeGenerated asc nulls last\r\n' + } + { + displayName: 'Task Shuffle Read Time' + query: 'let result=SparkListenerEvent_CL\n| where Event_s contains "SparkListenerStageSubmitted"\n| extend metricsns=columnifexists("Properties_spark_metrics_namespace_s",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains "SparkListenerTaskEnd"\n | where Task_End_Reason_Reason_s contains "Success"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\n Task_Metrics_JVM_GC_Time_d,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend name=strcat("TaskShuffleReadTime ",Properties_spark_databricks_clusterUsageTags_clusterName_s,"-",apptag," ",Stage_Info_Stage_Name_s)\n| summarize percentile(Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,90) by bin(TimeGenerated,1m),name\n| order by TimeGenerated asc nulls last;\n\n' + } + { + displayName: 'Shuffle Heap Memory Per Executor' + query: 'SparkMetric_CL\n| where name_s contains "shuffle-client.usedHeapMemory"\n| extend sname=split(name_s, ".")\n| extend executor=strcat(sname[0],".",sname[1])\n| summarize percentile(value_d,90) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last' + } + { + displayName: 'Job Errors Per Job' + query: 'let results=SparkListenerEvent_CL\r\n| where Event_s contains "SparkListenerJobStart"\r\n| project Job_ID_d,Properties_callSite_short_s,TimeGenerated\r\n| order by TimeGenerated asc nulls last \r\n| join kind= inner (\r\n SparkListenerEvent_CL\r\n | where Event_s contains "SparkListenerJobEnd"\r\n | where Job_Result_Result_s !contains "JobSucceeded"\r\n | project Event_s,Job_ID_d,TimeGenerated\r\n) on Job_ID_d;\r\nresults\r\n| extend slice=strcat("JobErrors ",Properties_callSite_short_s)\r\n| summarize count(Event_s) by bin(TimeGenerated, 1m),slice\r\n| order by TimeGenerated asc nulls last' + } + { + displayName: 'Task Errors Per Stage' + query: 'let result=SparkListenerEvent_CL\n| where Event_s contains "SparkListenerStageCompleted"\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Event_s,TimeGenerated\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains "SparkListenerTaskEnd"\n | where Task_End_Reason_Reason_s !contains "Success"\n | project Stage_ID_d,Task_Info_Task_ID_d,Task_End_Reason_Reason_s,\n TaskEvent=Event_s,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend slice=strcat("#TaskErrors ",Stage_Info_Stage_Name_s)\n| summarize count(TaskEvent) by bin(TimeGenerated,1m),slice\n| order by TimeGenerated asc nulls last\n' + } + { + displayName: 'Streaming Latency Per Stream' + query: '\r\n\r\nSparkListenerEvent_CL\r\n| where Event_s contains "queryprogressevent"\r\n| extend sname=strcat(progress_name_s,"-","triggerexecution") \r\n| summarize percentile(progress_durationMs_triggerExecution_d,90) by bin(TimeGenerated, 1m), sname\r\n| order by TimeGenerated asc nulls last \r\n' + } + { + displayName: 'Task Shuffle Write Time' + query: 'let result=SparkListenerEvent_CL\r\n| where Event_s contains "SparkListenerStageCompleted"\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated\r\n| order by TimeGenerated asc nulls last \r\n| join kind= inner (\r\n SparkListenerEvent_CL\r\n | where Event_s contains "SparkListenerTaskEnd"\r\n | where Task_End_Reason_Reason_s contains "Success"\r\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\r\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\r\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\r\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\r\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\r\n Task_Metrics_JVM_GC_Time_d,TimeGenerated\r\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\r\nresult\r\n| extend ShuffleWriteTime=Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d/1000000\r\n| extend name=strcat("TaskShuffleWriteTime ",Stage_Info_Stage_Name_s)\r\n| summarize percentile(ShuffleWriteTime,90) by bin(TimeGenerated,1m),name\r\n| order by TimeGenerated asc nulls last;\r\n\r\n' + } + { + displayName: 'Task Deserialization Time' + query: 'let result=SparkListenerEvent_CL\n| where Event_s contains "SparkListenerStageSubmitted"\n| extend metricsns=columnifexists("Properties_spark_metrics_namespace_s",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains "SparkListenerTaskEnd"\n | where Task_End_Reason_Reason_s contains "Success"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\n Task_Metrics_JVM_GC_Time_d,Task_Metrics_Input_Metrics_Bytes_Read_d,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend name=strcat("TaskDeserializationTime ",Properties_spark_databricks_clusterUsageTags_clusterName_s,"-",apptag," ",Stage_Info_Stage_Name_s)\n| summarize percentile(Task_Metrics_Executor_Deserialize_Time_d,90) by bin(TimeGenerated,1m),name\n| order by TimeGenerated asc nulls last;\n\n' + } + { + displayName: 'Task Result Serialization Time' + query: 'let result=SparkListenerEvent_CL\n| where Event_s contains "SparkListenerStageSubmitted"\n| extend metricsns=columnifexists("Properties_spark_metrics_namespace_s",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains "SparkListenerTaskEnd"\n | where Task_End_Reason_Reason_s contains "Success"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\n Task_Metrics_JVM_GC_Time_d,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend name=strcat("TaskResultSerializationTime ",Properties_spark_databricks_clusterUsageTags_clusterName_s,"-",apptag," ",Stage_Info_Stage_Name_s)\n| summarize percentile(Task_Metrics_Result_Serialization_Time_d,90) by bin(TimeGenerated,1m),name\n| order by TimeGenerated asc nulls last;\n\n' + } + { + displayName: 'File System Bytes Read Per Executor' + query: 'SparkMetric_CL\n| extend sname=split(name_s, ".")\n| extend executor=strcat(sname[0],".",sname[1])\n| where name_s contains "executor.filesystem.file.read_bytes" \n| summarize FileSystemReadBytes=percentile(value_d,90) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last' + } + { + displayName: 'Streaming Throughput Processed Rows/Sec' + query: 'SparkListenerEvent_CL\r\n| where Event_s contains "progress"\r\n| extend sname=strcat(progress_name_s,"-ProcRowsPerSecond") \r\n| extend status = todouble(extractjson("$.[0].processedRowsPerSecond", progress_sources_s))\r\n| summarize percentile(status,90) by bin(TimeGenerated, 1m) , sname\r\n| order by TimeGenerated asc nulls last ' + } + { + displayName: '% Deserialize Time Per Executor' + query: 'let results = SparkMetric_CL \n| where name_s contains "executor.deserializetime" \n| extend sname=split(name_s, ".") \n| extend executor=strcat(sname[0],".",sname[1])\n| project TimeGenerated , desetime=count_d , executor ,name_s\n| join kind= inner (\nSparkMetric_CL\n| where name_s contains "executor.RunTime"\n| extend sname=split(name_s, ".") \n| extend executor=strcat(sname[0],".",sname[1])\n| project TimeGenerated , runTime=count_d , executor ,name_s\n) on executor, TimeGenerated;\nresults\n| extend deseUsage=(desetime/runTime)*100\n| summarize deSerializationCpuTime=percentiles(deseUsage,90) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last ' + } + { + displayName: 'Tasks Per Executor (Sum Of Tasks Per Executor)' + query: 'SparkMetric_CL\n| extend sname=split(name_s, ".")\n| extend executor=strcat(sname[0],".",sname[1]) \n| where name_s contains "threadpool.activeTasks" \n| summarize percentile(value_d,90) by bin(TimeGenerated, 1m),executor\n| order by TimeGenerated asc nulls last' + } + { + displayName: 'File System Bytes Write Per Executor' + query: 'SparkMetric_CL\n| extend sname=split(name_s, ".")\n| extend executor=strcat(sname[0],".",sname[1])\n| where name_s contains "executor.filesystem.file.write_bytes" \n| summarize FileSystemWriteBytes=percentile(value_d,90) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last ' + } + { + displayName: 'Task Scheduler Delay Latency' + query: 'let result=SparkListenerEvent_CL\n| where Event_s contains "SparkListenerStageSubmitted"\n| extend metricsns=columnifexists("Properties_spark_metrics_namespace_s",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains "SparkListenerTaskEnd"\n | where Task_End_Reason_Reason_s contains "Success"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\n Task_Metrics_JVM_GC_Time_d,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend schedulerdelay = Task_Info_Launch_Time_d - Stage_Info_Submission_Time_d\n| extend name=strcat("SchedulerDelayTime ",Properties_spark_databricks_clusterUsageTags_clusterName_s,"-",apptag," ",Stage_Info_Stage_Name_s)\n| summarize percentile(schedulerdelay,90) , percentile(Task_Metrics_Executor_Run_Time_d,90) by bin(TimeGenerated,1m),name\n| order by TimeGenerated asc nulls last;\n\n' + } + { + displayName: 'Streaming Errors Per Stream' + query: 'SparkListenerEvent_CL\r\n| extend slice = strcat("CountExceptions",progress_name_s) \r\n| where Level contains "Error"\r\n| summarize count(Level) by bin(TimeGenerated, 1m), slice \r\n' + } + { + displayName: 'Shuffle Client Memory Per Executor' + query: 'SparkMetric_CL\r\n| where name_s contains "shuffle-client.usedDirectMemory"\r\n| extend sname=split(name_s, ".")\r\n| extend executor=strcat("executorid:",sname[1])\r\n| summarize percentile(value_d,90) by bin(TimeGenerated, 1m), executor\r\n| order by TimeGenerated asc nulls last' + } + { + displayName: 'Job Latency Per Job (Batch Duration)' + query: 'let results=SparkListenerEvent_CL\r\n| where Event_s contains "SparkListenerJobStart"\r\n| extend metricsns=columnifexists("Properties_spark_metrics_namespace_s",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Job_ID_d,apptag,Properties_spark_databricks_clusterUsageTags_clusterName_s,\r\nSubmission_Time_d,TimeGenerated\r\n| order by TimeGenerated asc nulls last \r\n| join kind= inner (\r\n SparkListenerEvent_CL\r\n | where Event_s contains "SparkListenerJobEnd"\r\n | where Job_Result_Result_s contains "JobSucceeded"\r\n | project Event_s,Job_ID_d,Completion_Time_d,TimeGenerated\r\n) on Job_ID_d;\r\nresults\r\n| extend slice=strcat(Properties_spark_databricks_clusterUsageTags_clusterName_s,"-",apptag)\r\n| extend jobDuration=Completion_Time_d - Submission_Time_d \r\n| summarize percentiles(jobDuration,10,30,50,90) by bin(TimeGenerated, 1m), slice\r\n| order by TimeGenerated asc nulls last' + } + { + displayName: 'Task Executor Compute Time (Data Skew Time)' + query: 'let result=SparkListenerEvent_CL\n| where Event_s contains "SparkListenerStageSubmitted"\n| extend metricsns=columnifexists("Properties_spark_metrics_namespace_s",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last\n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains "SparkListenerTaskEnd"\n | where Task_End_Reason_Reason_s contains "Success"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\n Task_Metrics_JVM_GC_Time_d,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend name=strcat("ExecutorComputeTime ",Properties_spark_databricks_clusterUsageTags_clusterName_s,"-",apptag," ",Stage_Info_Stage_Name_s)\n| summarize percentile(Task_Metrics_Executor_Run_Time_d,90) by bin(TimeGenerated,1m),name\n| order by TimeGenerated asc nulls last;\n\n' + } + { + displayName: 'Streaming Throughput Input Rows/Sec' + query: 'SparkListenerEvent_CL\r\n| where Event_s contains "progress"\r\n| extend sname=strcat(progress_name_s,"-inputRowsPerSecond") \r\n| extend status = todouble(extractjson("$.[0].inputRowsPerSecond", progress_sources_s))\r\n| summarize percentile(status,90) by bin(TimeGenerated, 1m) , sname\r\n| order by TimeGenerated asc nulls last \n' + } + { + displayName: 'Task Shuffle Bytes Read' + query: 'let result=SparkListenerEvent_CL\n| where Event_s contains "SparkListenerStageSubmitted"\n| extend metricsns=columnifexists("Properties_spark_metrics_namespace_s",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last\n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains "SparkListenerTaskEnd"\n | where Task_End_Reason_Reason_s contains "Success"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Metrics_Executor_Deserialize_Time_d,Task_Metrics_Shuffle_Read_Metrics_Fetch_Wait_Time_d,\n Task_Metrics_Executor_Run_Time_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Write_Time_d,\n Task_Metrics_Result_Serialization_Time_d,Task_Info_Getting_Result_Time_d,\n Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,Task_Metrics_Shuffle_Write_Metrics_Shuffle_Bytes_Written_d,\n Task_Metrics_JVM_GC_Time_d,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend name=strcat("SchuffleBytesRead ",Properties_spark_databricks_clusterUsageTags_clusterName_s,"-",apptag," ",Stage_Info_Stage_Name_s)\n| summarize percentile(Task_Metrics_Shuffle_Read_Metrics_Remote_Bytes_Read_d,90) by bin(TimeGenerated,1m),name\n| order by TimeGenerated asc nulls last;\n\n' + } + { + displayName: 'Shuffle Memory Bytes Spilled Per Executor' + query: 'let results=SparkMetric_CL\n| where name_s contains "executor.memoryBytesSpilled"\n| extend sname=split(name_s, ".") \n| extend executor=strcat(sname[0],".",sname[1])\n| summarize MaxShuffleWrites=max(count_d) by bin(TimeGenerated, 1m), executor \n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkMetric_CL\n | where name_s contains "executor.memoryBytesSpilled"\n | extend sname=split(name_s, ".") \n | extend executor=strcat(sname[0],".",sname[1])\n| summarize MinShuffleWrites=min(count_d) by bin(TimeGenerated, 1m), executor\n) on executor, TimeGenerated;\nresults\n| extend ShuffleBytesWritten=MaxShuffleWrites-MinShuffleWrites \n| summarize any(ShuffleBytesWritten) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last\n' + } + { + displayName: '% JVM Time Per Executor' + query: 'let results = SparkMetric_CL\n| where name_s contains "executor.jvmGCTime" \n| extend sname=split(name_s, ".")\n| extend executor=strcat(sname[0],".",sname[1])\n| project TimeGenerated , jvmgcTime=count_d , executor ,name_s\n| join kind= inner (\nSparkMetric_CL\n| where name_s contains "executor.RunTime"\n| extend sname=split(name_s, ".")\n| extend executor=strcat(sname[0],".",sname[1])\n| project TimeGenerated , runTime=count_d , executor ,name_s\n) on executor, TimeGenerated;\nresults\n| extend JvmcpuUsage=(jvmgcTime/runTime)*100\n| summarize JvmCpuTime = percentile(JvmcpuUsage,90) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last\n| render timechart \n' + } + { + displayName: 'Running Executors' + query: 'SparkMetric_CL\n| where name_s !contains "driver" \n| where name_s contains "executor"\n| extend sname=split(name_s, ".")\n| extend executor=strcat(sname[1]) \n| extend app=strcat(sname[0])\n| summarize NumExecutors=dcount(executor) by bin(TimeGenerated, 1m),app\n| order by TimeGenerated asc nulls last' + } + { + displayName: 'Shuffle Bytes Read To Disk Per Executor' + query: 'let results=SparkMetric_CL\r\n| where name_s contains "executor.shuffleRemoteBytesReadToDisk"\r\n| extend sname=split(name_s, ".") \r\n| extend executor=strcat("executorid:",sname[1])\r\n| summarize MaxShuffleWrites=max(count_d) by bin(TimeGenerated, 1m), executor \r\n| order by TimeGenerated asc nulls last \r\n| join kind= inner (\r\n SparkMetric_CL\r\n | where name_s contains "executor.shuffleRemoteBytesReadToDisk"\r\n | extend sname=split(name_s, ".") \r\n | extend executor=strcat("executorid:",sname[1])\r\n| summarize MinShuffleWrites=min(count_d) by bin(TimeGenerated, 1m), executor\r\n) on executor, TimeGenerated;\r\nresults\r\n| extend ShuffleBytesWritten=MaxShuffleWrites-MinShuffleWrites \r\n| summarize any(ShuffleBytesWritten) by bin(TimeGenerated, 1m), executor\r\n| order by TimeGenerated asc nulls last\r\n' + } + { + displayName: 'Task Latency Per Stage (Tasks Duration)' + query: 'let result=SparkListenerEvent_CL\n| where Event_s contains "SparkListenerStageSubmitted"\n| extend metricsns=columnifexists("Properties_spark_metrics_namespace_s",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,apptag,Properties_spark_databricks_clusterUsageTags_clusterName_s,Event_s,TimeGenerated\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains "SparkListenerTaskEnd"\n | where Task_End_Reason_Reason_s contains "Success"\n | project Task_Info_Launch_Time_d,Stage_ID_d,Task_Info_Task_ID_d,Event_s,\n Task_Info_Finish_Time_d\n ) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend TaskLatency = Task_Info_Finish_Time_d - Task_Info_Launch_Time_d\n| extend slice=strcat(Properties_spark_databricks_clusterUsageTags_clusterName_s,"-",apptag,"-",Stage_Info_Stage_Name_s)\n| summarize percentile(TaskLatency,90) by bin(TimeGenerated,1m),slice\n| order by TimeGenerated asc nulls last;\n' + } + { + displayName: 'Task Throughput (Sum Of Tasks Per Stage)' + query: 'let result=SparkListenerEvent_CL\n| where Event_s contains "SparkListenerStageSubmitted"\n| extend metricsns=columnifexists("Properties_spark_metrics_namespace_s",Properties_spark_app_id_s)\r\n| extend apptag=iif(isnotempty(metricsns),metricsns,Properties_spark_app_id_s)\r\n| project Stage_Info_Stage_ID_d,Stage_Info_Stage_Name_s,Stage_Info_Submission_Time_d,Event_s,TimeGenerated,Properties_spark_databricks_clusterUsageTags_clusterName_s,apptag\n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkListenerEvent_CL\n | where Event_s contains "SparkListenerTaskEnd"\n | where Task_End_Reason_Reason_s contains "Success"\n | project Stage_ID_d,Task_Info_Task_ID_d,\n TaskEvent=Event_s,TimeGenerated\n) on $left.Stage_Info_Stage_ID_d == $right.Stage_ID_d;\nresult\n| extend slice=strcat("#TasksCompleted ",Properties_spark_databricks_clusterUsageTags_clusterName_s,"-",apptag," ",Stage_Info_Stage_Name_s)\n| summarize count(TaskEvent) by bin(TimeGenerated,1m),slice\n| order by TimeGenerated asc nulls last\n' + } + { + displayName: 'Shuffle Client Direct Memory' + query: 'SparkMetric_CL\n| where name_s contains "shuffle-client.usedDirectMemory"\n| extend sname=split(name_s, ".")\n| extend executor=strcat(sname[0],".",sname[1])\n| summarize percentile(value_d,90) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last' + } + { + displayName: 'Disk Bytes Spilled' + query: 'let results=SparkMetric_CL\n| where name_s contains "executor.diskBytesSpilled"\n| extend sname=split(name_s, ".") \n| extend executor=strcat(sname[0],".",sname[1])\n| summarize MaxShuffleWrites=max(count_d) by bin(TimeGenerated, 1m), executor \n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkMetric_CL\n | where name_s contains "executor.diskBytesSpilled"\n | extend sname=split(name_s, ".") \n | extend executor=strcat(sname[0],".",sname[1])\n| summarize MinShuffleWrites=min(count_d) by bin(TimeGenerated, 1m), executor\n) on executor, TimeGenerated;\nresults\n| extend ShuffleBytesWritten=MaxShuffleWrites-MinShuffleWrites \n| summarize any(ShuffleBytesWritten) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last\n' + } + { + displayName: 'Shuffle Bytes Read' + query: 'let results=SparkMetric_CL\n| where name_s contains "executor.shuffleRemoteBytesReadToDisk"\n| extend sname=split(name_s, ".") \n| extend executor=strcat(sname[0],".",sname[1])\n| summarize MaxShuffleWrites=max(count_d) by bin(TimeGenerated, 1m), executor \n| order by TimeGenerated asc nulls last \n| join kind= inner (\n SparkMetric_CL\n | where name_s contains "executor.shuffleRemoteBytesReadToDisk"\n | extend sname=split(name_s, ".") \n | extend executor=strcat(sname[0],".",sname[1])\n| summarize MinShuffleWrites=min(count_d) by bin(TimeGenerated, 1m), executor\n) on executor, TimeGenerated;\nresults\n| extend ShuffleBytesWritten=MaxShuffleWrites-MinShuffleWrites \n| summarize any(ShuffleBytesWritten) by bin(TimeGenerated, 1m), executor\n| order by TimeGenerated asc nulls last\n' + } +] + +resource Wksp 'Microsoft.OperationalInsights/workspaces@2020-10-01' = { + name: logAnalyticsWkspName + location: logAnalyticsWkspLocation + properties: { + sku: { + name: logAnalyticsWkspSku + } + retentionInDays: logAnalyticsWkspRentationDays + features: { + enableDataExport: true + } + } +} + +resource WkspSearch 'Microsoft.OperationalInsights/workspaces/savedSearches@2020-08-01' = [for (item, i) in queries: { + parent: Wksp + name: '${guid('${resourceGroup().id}${deployment().name}${i}')}' + properties: { + category: 'Spark Metrics' + displayName: item.displayName + query: item.query + etag: '*' + } +}] + +var keyObj = listKeys(resourceId('Microsoft.OperationalInsights/workspaces', logAnalyticsWkspName), '2020-10-01') + +// output logAnalyticsWkspId string = Wksp.id +output logAnalyticsWkspId string = Wksp.properties.customerId +output primarySharedKey string = keyObj.primarySharedKey +output secondarySharedKey string = keyObj.secondarySharedKey diff --git a/archive/single_tech_samples/databricks_all_in_one/network/firewall.template.bicep b/archive/single_tech_samples/databricks_all_in_one/network/firewall.template.bicep new file mode 100644 index 000000000..e2be6aab0 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/network/firewall.template.bicep @@ -0,0 +1,411 @@ +@description('Azure datacentre Location to deploy the Firewall and IP Address') +param firewallLocation string = resourceGroup().location + +@description('Name of the IP Address') +param publicIpAddressName string + +@description('Name of the Azure Firewall') +param firewallName string + +@description('Firewall SKU') +param firewallSKU string = 'Standard' + +@description('Client Private ip address') +param clientPrivateIpAddr string + +@description('Name of the vnet associated witht he Firewall') +param vnetName string + +@description('List of destination IP addresses for Web App') +param webappDestinationAddresses array = [] + +@description('List of Log Blob storage domain name') +param logBlobstorageDomains array = [] + +@description('List of destination IP addresses for Extended Infrastructure') +param infrastructureDestinationAddresses array = [] + +@description('List of SCC relay domain name') +param sccRelayDomains array = [] + +@description('List of Metastore domain name') +param metastoreDomains array = [] + +@description('List of Event Hub endpoint domain name') +param eventHubEndpointDomains array = [] + +@description('List of Artifact Blob storage primary domain name') +param artifactBlobStoragePrimaryDomains array = [] + +@description('the domain name of DBFS root Blob storage') +param dbfsBlobStrageDomain array = [] + +@description('Specifies the number of public IPs to allocate to the firewall') +param fwpublicipcount int = 1 + +resource publicIpAddressName_resource 'Microsoft.Network/publicIPAddresses@2021-02-01' = { + name: publicIpAddressName + location: firewallLocation + sku: { + name: 'Standard' + } + properties: { + publicIPAllocationMethod: 'Static' + } +} + +resource firewallName_resource 'Microsoft.Network/azureFirewalls@2021-02-01' = { + name: firewallName + location: firewallLocation + properties: { + ipConfigurations: [ + { + name: publicIpAddressName + properties: { + subnet: { + id: resourceId('Microsoft.Network/virtualNetworks/subnets', vnetName, 'AzureFirewallSubnet') + } + publicIPAddress: { + id: publicIpAddressName_resource.id + } + } + } + ] + hubIPAddresses: { + publicIPs: { + count: fwpublicipcount + } + } + sku: { + tier: firewallSKU + } + threatIntelMode: 'Alert' + additionalProperties: { + 'Network.DNS.EnableProxy': 'true' + } + natRuleCollections: [ + { + name: 'Allow-RDP-DNAT' + properties: { + priority: 100 + action: { + type: 'Dnat' + } + rules: [ + { + name: 'rdp-dnat' + protocols: [ + 'TCP' + ] + sourceAddresses: [ + '*' + ] + destinationAddresses: [ + publicIpAddressName_resource.properties.ipAddress + ] + destinationPorts: [ + '3389' + ] + translatedAddress: clientPrivateIpAddr + translatedPort: '3389' + } + ] + } + } + ] + networkRuleCollections: [ + { + name: 'Allow-Databricks-Services' + properties: { + priority: 100 + action: { + type: 'Allow' + } + rules: [ + { + name: 'Webapp IP' + protocols: [ + 'TCP' + ] + sourceAddresses: [ + '*' + ] + destinationAddresses: webappDestinationAddresses + sourceIpGroups: [] + destinationIpGroups: [] + destinationFqdns: [] + destinationPorts: [ + '*' + ] + } + { + name: 'Extended infrastructure IP' + protocols: [ + 'TCP' + ] + sourceAddresses: [ + '*' + ] + destinationAddresses: infrastructureDestinationAddresses + sourceIpGroups: [] + destinationIpGroups: [] + destinationFqdns: [] + destinationPorts: [ + '*' + ] + } + { + name: 'Metastore IP' + protocols: [ + 'TCP' + ] + sourceAddresses: [ + '*' + ] + destinationAddresses: [] + sourceIpGroups: [] + destinationIpGroups: [] + destinationFqdns: metastoreDomains + destinationPorts: [ + '*' + ] + } + { + name: 'Event Hub endpoint' + protocols: [ + 'TCP' + ] + sourceAddresses: [ + '*' + ] + destinationAddresses: [] + sourceIpGroups: [] + destinationIpGroups: [] + destinationFqdns: eventHubEndpointDomains + destinationPorts: [ + '*' + ] + } + ] + } + } + ] + applicationRuleCollections: [ + { + name: 'Allow-Databricks-Services' + properties: { + priority: 100 + action: { + type: 'Allow' + } + rules: [ + { + name: 'Log Blob storage IP' + protocols: [ + { + protocolType: 'Http' + port: 80 + } + { + protocolType: 'Https' + port: 443 + } + ] + fqdnTags: [] + targetFqdns: logBlobstorageDomains + sourceAddresses: [ + '*' + ] + sourceIpGroups: [] + } + { + name: 'SCC Relay IP' + protocols: [ + { + protocolType: 'Http' + port: 80 + } + { + protocolType: 'Https' + port: 443 + } + ] + fqdnTags: [] + targetFqdns: sccRelayDomains + sourceAddresses: [ + '*' + ] + sourceIpGroups: [] + } + { + name: 'Artifact Blob storage IP' + protocols: [ + { + protocolType: 'Http' + port: 80 + } + { + protocolType: 'Https' + port: 443 + } + ] + fqdnTags: [] + targetFqdns: artifactBlobStoragePrimaryDomains + sourceAddresses: [ + '*' + ] + sourceIpGroups: [] + } + { + name: 'DBFS root Blob storage IP' + protocols: [ + { + protocolType: 'Http' + port: 80 + } + { + protocolType: 'Https' + port: 443 + } + ] + fqdnTags: [] + targetFqdns: dbfsBlobStrageDomain + sourceAddresses: [ + '*' + ] + sourceIpGroups: [] + } + ] + } + } + { + name: 'Allow-Websites' + properties: { + priority: 200 + action: { + type: 'Allow' + } + rules: [ + { + name: 'Pypi' + protocols: [ + { + protocolType: 'Http' + port: 80 + } + { + protocolType: 'Https' + port: 443 + } + ] + fqdnTags: [] + targetFqdns: [ + 'pypi.org' + '*.pypi.org' + '*.pythonhosted.org' + ] + sourceAddresses: [ + '*' + ] + sourceIpGroups: [] + } + { + name: 'Maven' + protocols: [ + { + protocolType: 'Http' + port: 80 + } + { + protocolType: 'Https' + port: 443 + } + ] + fqdnTags: [] + targetFqdns: [ + '*.mvnrepository.com' + '*.maven.org' + ] + sourceAddresses: [ + '*' + ] + sourceIpGroups: [] + } + { + name: 'GitHubScripts' + protocols: [ + { + protocolType: 'Http' + port: 80 + } + { + protocolType: 'Https' + port: 443 + } + ] + fqdnTags: [] + targetFqdns: [ + '*.githubusercontent.com' + 'github.com' + ] + sourceAddresses: [ + '*' + ] + sourceIpGroups: [] + } + { + name: 'LogAnalytics' + protocols: [ + { + protocolType: 'Http' + port: 80 + } + { + protocolType: 'Https' + port: 443 + } + ] + fqdnTags: [] + targetFqdns: [ + '*.ods.opinsights.azure.com' + '*.oms.opinsights.azure.com' + ] + sourceAddresses: [ + '*' + ] + sourceIpGroups: [] + } + { + name: 'AzureManagement' + protocols: [ + { + protocolType: 'Http' + port: 80 + } + { + protocolType: 'Https' + port: 443 + } + ] + fqdnTags: [] + targetFqdns: [ + '${replace(replace(environment().authentication.loginEndpoint, 'https:', ''), '/', '')}' + '${replace(replace(environment().resourceManager, 'https:', ''), '/', '')}' + '*.blob.${environment().suffixes.storage}' + '*.azure-automation.net' + 'ml.azure.com' + '*.msauth.net' + ] + sourceAddresses: [ + '*' + ] + sourceIpGroups: [] + } + ] + } + } + ] + } +} + +output firewallPrivateIp string = firewallName_resource.properties.ipConfigurations[0].properties.privateIPAddress // output firewallPublivIp array = firewallName_resource.properties.hubIPAddresses.publicIPs.addresses diff --git a/archive/single_tech_samples/databricks_all_in_one/network/privateendpoint.template.bicep b/archive/single_tech_samples/databricks_all_in_one/network/privateendpoint.template.bicep new file mode 100644 index 000000000..266524d99 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/network/privateendpoint.template.bicep @@ -0,0 +1,460 @@ +@description('Storage Account Privatelink Resource') +param storageAccountPrivateLinkResource string + +@description('Storage Account name') +param storageAccountName string + +@description('Keyvault Private Link resource.') +param keyvaultPrivateLinkResource string + +@description('keyvault name.') +param keyvaultName string = 'KeyVault' + +@description('event hub name.') +param eventHubName string + +@description('EventHub Private Link resource.') +param eventHubPrivateLinkResource string + +@description('Vnet name for private link') +param vnetName string + +@description('Privatelink subnet Id') +param privateLinkSubnetId string + +@description('Privatelink subnet Id') +param privateLinkLocation string = resourceGroup().location + +var privateDnsNameStorageDfs_var = 'privatelink.dfs.${environment().suffixes.storage}' +var privateDnsNameStorageBlob_var = 'privatelink.blob.${environment().suffixes.storage}' +var privateDnsNameStorageFile_var = 'privatelink.file.${environment().suffixes.storage}' +var adlsPrivateDnsZoneName_var = '${toLower(storageAccountName)}-dfs-Privateendpoint' +var filePrivateDnsZoneName_var = '${toLower(storageAccountName)}-file-Privateendpoint' +var blobPrivateDnsZoneName_var = '${toLower(storageAccountName)}-blob-Privateendpoint' + +var privateDnsNameVault_var = 'privatelink.vaultcore.azure.net' +var keyvaultPrivateEndpointName_var = '${toLower(keyvaultName)}-Privateendpoint' + +var privateDnsNameEventHub_var = 'privatelink.servicebus.windows.net' +var eventHubPrivateEndpointName_var = '${(eventHubName)}-Privateendpoint' + +param AmlName string +param amlPrivateLinkResource string +var privateDnsNameAmlApi_var = 'privatelink.api.azureml.ms' +var privateDnsNameAmlNotebook_var = 'privatelink.notebooks.azure.net' +var amlPrivateEndpointName_var = '${AmlName}-Privateendpoint' + +param containerRegistryName string +param crPrivateLinkResource string +var privateDnsNameCr_var = 'privatelink.azurecr.io' +var crPrivateEndpointName_var = '${containerRegistryName}-Privateendpoint' + +resource storageAccountPrivateEndpointName 'Microsoft.Network/privateEndpoints@2021-02-01' = { + name: adlsPrivateDnsZoneName_var + location: privateLinkLocation + properties: { + privateLinkServiceConnections: [ + { + name: adlsPrivateDnsZoneName_var + properties: { + privateLinkServiceId: storageAccountPrivateLinkResource + groupIds: [ + 'dfs' + ] + } + } + ] + subnet: { + id: privateLinkSubnetId + } + } +} +resource fileStorageAccountPrivateEndpointName 'Microsoft.Network/privateEndpoints@2021-02-01' = { + name: filePrivateDnsZoneName_var + location: privateLinkLocation + properties: { + privateLinkServiceConnections: [ + { + name: filePrivateDnsZoneName_var + properties: { + privateLinkServiceId: storageAccountPrivateLinkResource + groupIds: [ + 'file' + ] + } + } + ] + subnet: { + id: privateLinkSubnetId + } + } +} +resource blobStorageAccountPrivateEndpointName 'Microsoft.Network/privateEndpoints@2021-02-01' = { + name: blobPrivateDnsZoneName_var + location: privateLinkLocation + properties: { + privateLinkServiceConnections: [ + { + name: blobPrivateDnsZoneName_var + properties: { + privateLinkServiceId: storageAccountPrivateLinkResource + groupIds: [ + 'blob' + ] + } + } + ] + subnet: { + id: privateLinkSubnetId + } + } +} + +resource privateDnsNameStorageDfs 'Microsoft.Network/privateDnsZones@2020-06-01' = { + name: privateDnsNameStorageDfs_var + location: 'global' + tags: {} + properties: {} + dependsOn: [ + storageAccountPrivateEndpointName + ] +} +resource privateDnsNameStorageFile 'Microsoft.Network/privateDnsZones@2020-06-01' = { + name: privateDnsNameStorageFile_var + location: 'global' + tags: {} + properties: {} + dependsOn: [ + fileStorageAccountPrivateEndpointName + ] +} +resource privateDnsNameStorageBlob 'Microsoft.Network/privateDnsZones@2020-06-01' = { + name: privateDnsNameStorageBlob_var + location: 'global' + tags: {} + properties: {} + dependsOn: [ + blobStorageAccountPrivateEndpointName + ] +} + +resource privateDnsNameStorageDfs_vnetName 'Microsoft.Network/privateDnsZones/virtualNetworkLinks@2020-06-01' = { + parent: privateDnsNameStorageDfs + name: 'dfs_link_to_${toLower(vnetName)}' + location: 'global' + properties: { + virtualNetwork: { + id: resourceId('Microsoft.Network/virtualNetworks', vnetName) + } + registrationEnabled: false + } +} +resource privateDnsNameStorageFile_vnetName 'Microsoft.Network/privateDnsZones/virtualNetworkLinks@2020-06-01' = { + parent: privateDnsNameStorageFile + name: 'file_link_to_${toLower(vnetName)}' + location: 'global' + properties: { + virtualNetwork: { + id: resourceId('Microsoft.Network/virtualNetworks', vnetName) + } + registrationEnabled: false + } +} +resource privateDnsNameStorageBob_vnetName 'Microsoft.Network/privateDnsZones/virtualNetworkLinks@2020-06-01' = { + parent: privateDnsNameStorageBlob + name: 'file_link_to_${toLower(vnetName)}' + location: 'global' + properties: { + virtualNetwork: { + id: resourceId('Microsoft.Network/virtualNetworks', vnetName) + } + registrationEnabled: false + } +} +resource storageAccountPrivateEndpointName_default 'Microsoft.Network/privateEndpoints/privateDnsZoneGroups@2021-02-01' = { + parent: storageAccountPrivateEndpointName + name: 'default' + properties: { + privateDnsZoneConfigs: [ + { + name: 'privatelink-dfs-core-windows-net' + properties: { + privateDnsZoneId: privateDnsNameStorageDfs.id + } + } + ] + } +} +resource storageAccountFilePrivateEndpointName_default 'Microsoft.Network/privateEndpoints/privateDnsZoneGroups@2021-02-01' = { + parent: fileStorageAccountPrivateEndpointName + name: 'default' + properties: { + privateDnsZoneConfigs: [ + { + name: 'privatelink-file-core-windows-net' + properties: { + privateDnsZoneId: privateDnsNameStorageFile.id + } + } + ] + } +} +resource storageAccountBlobPrivateEndpointName_default 'Microsoft.Network/privateEndpoints/privateDnsZoneGroups@2021-02-01' = { + parent: blobStorageAccountPrivateEndpointName + name: 'default' + properties: { + privateDnsZoneConfigs: [ + { + name: 'privatelink-blob-core-windows-net' + properties: { + privateDnsZoneId: privateDnsNameStorageBlob.id + } + } + ] + } +} +// Configure Private Link for KeyVault +resource keyvaultPrivateEndpointName 'Microsoft.Network/privateEndpoints@2021-02-01' = { + name: keyvaultPrivateEndpointName_var + location: privateLinkLocation + properties: { + privateLinkServiceConnections: [ + { + name: keyvaultPrivateEndpointName_var + properties: { + privateLinkServiceId: keyvaultPrivateLinkResource + groupIds: [ + 'vault' + ] + } + } + ] + subnet: { + id: privateLinkSubnetId + } + } + tags: {} +} +resource privateDnsNameVault 'Microsoft.Network/privateDnsZones@2020-06-01' = { + name: privateDnsNameVault_var + location: 'global' + tags: {} + properties: {} + dependsOn: [ + keyvaultPrivateEndpointName + ] +} +resource privateDnsNameVault_vnetName 'Microsoft.Network/privateDnsZones/virtualNetworkLinks@2020-06-01' = { + parent: privateDnsNameVault + name: vnetName + location: 'global' + properties: { + virtualNetwork: { + id: resourceId('Microsoft.Network/virtualNetworks', vnetName) + } + registrationEnabled: false + } +} +resource keyvaultPrivateEndpointName_default 'Microsoft.Network/privateEndpoints/privateDnsZoneGroups@2021-02-01' = { + parent: keyvaultPrivateEndpointName + name: 'default' + properties: { + privateDnsZoneConfigs: [ + { + name: 'privatelink-vaultcore-azure-net' + properties: { + privateDnsZoneId: privateDnsNameVault.id + } + } + ] + } +} + +// Configure Private Link for Event Hub + +resource eventHubPrivateEndpointName 'Microsoft.Network/privateEndpoints@2021-02-01' = { + name: eventHubPrivateEndpointName_var + location: privateLinkLocation + properties: { + privateLinkServiceConnections: [ + { + name: eventHubPrivateEndpointName_var + properties: { + privateLinkServiceId: eventHubPrivateLinkResource + groupIds: [ + 'namespace' + ] + } + } + ] + subnet: { + id: privateLinkSubnetId + } + } +} +resource privateDnsNameEventHub 'Microsoft.Network/privateDnsZones@2020-06-01' = { + name: privateDnsNameEventHub_var + location: 'global' + tags: {} + properties: {} + dependsOn: [ + eventHubPrivateEndpointName + ] +} +resource privateDnsNameEventHub_vnetName 'Microsoft.Network/privateDnsZones/virtualNetworkLinks@2020-06-01' = { + parent: privateDnsNameEventHub + name: vnetName + location: 'global' + properties: { + virtualNetwork: { + id: resourceId('Microsoft.Network/virtualNetworks', vnetName) + } + registrationEnabled: false + } +} +resource eventHubPrivateEndpointName_default 'Microsoft.Network/privateEndpoints/privateDnsZoneGroups@2021-02-01' = { + parent: eventHubPrivateEndpointName + name: 'default' + properties: { + privateDnsZoneConfigs: [ + { + name: 'privatelink-servicebus-windows-net' + properties: { + privateDnsZoneId: privateDnsNameEventHub.id + } + } + ] + } +} + +// Configure Private Link to AML +resource amlPrivateEndpointName 'Microsoft.Network/privateEndpoints@2021-02-01' = { + name: amlPrivateEndpointName_var + location: privateLinkLocation + properties: { + privateLinkServiceConnections: [ + { + name: amlPrivateEndpointName_var + properties: { + privateLinkServiceId: amlPrivateLinkResource + groupIds: [ + 'amlworkspace' + ] + } + } + ] + subnet: { + id: privateLinkSubnetId + } + } +} +resource privatelink_api_azureml_ms 'Microsoft.Network/privateDnsZones@2018-09-01' = { + name: privateDnsNameAmlApi_var + location: 'global' + properties: {} +} +resource privatelink_api_azureml_ms_resourceId_Microsoft_Network_virtualNetworks_parameters_vnetName 'Microsoft.Network/privateDnsZones/virtualNetworkLinks@2018-09-01' = { + parent: privatelink_api_azureml_ms + name: 'privatelink_api_azureml_ms' + location: 'global' + properties: { + virtualNetwork: { + id: resourceId('Microsoft.Network/virtualNetworks', vnetName) + } + registrationEnabled: false + } +} +resource privatelink_notebooks_azure_net 'Microsoft.Network/privateDnsZones@2018-09-01' = { + name: privateDnsNameAmlNotebook_var + location: 'global' + properties: {} +} +resource privatelink_notebooks_azure_net_resourceId_Microsoft_Network_virtualNetworks_parameters_vnetName 'Microsoft.Network/privateDnsZones/virtualNetworkLinks@2018-09-01' = { + parent: privatelink_notebooks_azure_net + name: 'privatelink_notebooks_azure_net' + location: 'global' + properties: { + virtualNetwork: { + id: resourceId('Microsoft.Network/virtualNetworks', vnetName) + } + registrationEnabled: false + } +} +resource privateEndpointName_default 'Microsoft.Network/privateEndpoints/privateDnsZoneGroups@2020-03-01' = { + parent: amlPrivateEndpointName + name: 'default' + properties: { + privateDnsZoneConfigs: [ + { + name: 'privatelink-api-azureml-ms' + properties: { + privateDnsZoneId: privatelink_api_azureml_ms.id + } + } + { + name: 'privatelink-notebooks-azure-net' + properties: { + privateDnsZoneId: privatelink_notebooks_azure_net.id + } + } + ] + } +} + +// Configure Private Link for Container Registry + +resource containerRegistryPrivateEndpointName 'Microsoft.Network/privateEndpoints@2021-02-01' = { + name: crPrivateEndpointName_var + location: privateLinkLocation + properties: { + privateLinkServiceConnections: [ + { + name: crPrivateEndpointName_var + properties: { + privateLinkServiceId: crPrivateLinkResource + groupIds: [ + 'registry' + ] + } + } + ] + subnet: { + id: privateLinkSubnetId + } + } +} + +resource privateDnsNameContainerRegistry 'Microsoft.Network/privateDnsZones@2020-06-01' = { + name: privateDnsNameCr_var + location: 'global' + dependsOn: [ + containerRegistryPrivateEndpointName + ] +} + +resource privateDnsNameContainerRegistry_vnetName 'Microsoft.Network/privateDnsZones/virtualNetworkLinks@2020-06-01' = { + parent: privateDnsNameContainerRegistry + name: vnetName + location: 'global' + properties: { + virtualNetwork: { + id: resourceId('Microsoft.Network/virtualNetworks', vnetName) + } + registrationEnabled: false + } +} + +resource privateDnsNameContainerRegistry_default 'Microsoft.Network/privateEndpoints/privateDnsZoneGroups@2021-02-01' = { + parent: containerRegistryPrivateEndpointName + name: 'default' + properties: { + privateDnsZoneConfigs: [ + { + name: 'privatelink-azurecr-io' + properties: { + privateDnsZoneId: privateDnsNameContainerRegistry.id + } + } + ] + } +} diff --git a/archive/single_tech_samples/databricks_all_in_one/network/routetable.template.bicep b/archive/single_tech_samples/databricks_all_in_one/network/routetable.template.bicep new file mode 100644 index 000000000..54d1ea8be --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/network/routetable.template.bicep @@ -0,0 +1,14 @@ +@description('Azure datacentre Location to deploy the Firewall and IP Address') +param routeTableLocation string = resourceGroup().location +@description('Name of the Routing Table') +param routeTableName string + +resource routeTableName_resource 'Microsoft.Network/routeTables@2020-08-01' = { + name: routeTableName + location: routeTableLocation + properties: { + disableBgpRoutePropagation: false + } +} + +output routeTblName string = routeTableName_resource.name diff --git a/archive/single_tech_samples/databricks_all_in_one/network/routetableFirewallRoute.template.bicep b/archive/single_tech_samples/databricks_all_in_one/network/routetableFirewallRoute.template.bicep new file mode 100644 index 000000000..161ea72ee --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/network/routetableFirewallRoute.template.bicep @@ -0,0 +1,12 @@ +param routeTableName string +param firewallPrivateIp string + +resource routeTableName_Firewall_Route 'Microsoft.Network/routeTables/routes@2020-08-01' = { + name: '${routeTableName}/Firewall-Route' + properties: { + addressPrefix: '0.0.0.0/0' + nextHopType: 'VirtualAppliance' + nextHopIpAddress: firewallPrivateIp + hasBgpOverride: false + } +} diff --git a/archive/single_tech_samples/databricks_all_in_one/network/securitygroup.template.bicep b/archive/single_tech_samples/databricks_all_in_one/network/securitygroup.template.bicep new file mode 100644 index 000000000..102d367fc --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/network/securitygroup.template.bicep @@ -0,0 +1,100 @@ +@description('The name of the network security group to create.') +param securityGroupName string + +@description('Location for all resources.') +param securityGroupLocation string = resourceGroup().location + +resource securityGroupName_resource 'Microsoft.Network/networkSecurityGroups@2020-05-01' = { + name: securityGroupName + location: securityGroupLocation + properties: { + securityRules: [ + { + name: 'Microsoft.Databricks-workspaces_UseOnly_databricks-worker-to-worker-inbound' + properties: { + description: 'Required for worker nodes communication within a cluster.' + protocol: '*' + sourcePortRange: '*' + destinationPortRange: '*' + sourceAddressPrefix: 'VirtualNetwork' + destinationAddressPrefix: 'VirtualNetwork' + access: 'Allow' + priority: 100 + direction: 'Inbound' + } + } + { + name: 'Microsoft.Databricks-workspaces_UseOnly_databricks-worker-to-databricks-webapp' + properties: { + description: 'Required for workers communication with Databricks Webapp.' + protocol: 'Tcp' + sourcePortRange: '*' + destinationPortRange: '443' + sourceAddressPrefix: 'VirtualNetwork' + destinationAddressPrefix: 'AzureDatabricks' + access: 'Allow' + priority: 100 + direction: 'Outbound' + } + } + { + name: 'Microsoft.Databricks-workspaces_UseOnly_databricks-worker-to-sql' + properties: { + description: 'Required for workers communication with Azure SQL services.' + protocol: 'Tcp' + sourcePortRange: '*' + destinationPortRange: '3306' + sourceAddressPrefix: 'VirtualNetwork' + destinationAddressPrefix: 'Sql' + access: 'Allow' + priority: 101 + direction: 'Outbound' + } + } + { + name: 'Microsoft.Databricks-workspaces_UseOnly_databricks-worker-to-storage' + properties: { + description: 'Required for workers communication with Azure Storage services.' + protocol: 'Tcp' + sourcePortRange: '*' + destinationPortRange: '443' + sourceAddressPrefix: 'VirtualNetwork' + destinationAddressPrefix: 'Storage' + access: 'Allow' + priority: 102 + direction: 'Outbound' + } + } + { + name: 'Microsoft.Databricks-workspaces_UseOnly_databricks-worker-to-worker-outbound' + properties: { + description: 'Required for worker nodes communication within a cluster.' + protocol: '*' + sourcePortRange: '*' + destinationPortRange: '*' + sourceAddressPrefix: 'VirtualNetwork' + destinationAddressPrefix: 'VirtualNetwork' + access: 'Allow' + priority: 103 + direction: 'Outbound' + } + } + { + name: 'Microsoft.Databricks-workspaces_UseOnly_databricks-worker-to-eventhub' + properties: { + description: 'Required for worker communication with Azure Eventhub services.' + protocol: 'Tcp' + sourcePortRange: '*' + destinationPortRange: '9093' + sourceAddressPrefix: 'VirtualNetwork' + destinationAddressPrefix: 'EventHub' + access: 'Allow' + priority: 104 + direction: 'Outbound' + } + } + ] + } +} + +output nsgName string = securityGroupName_resource.name diff --git a/archive/single_tech_samples/databricks_all_in_one/network/vnet.template.bicep b/archive/single_tech_samples/databricks_all_in_one/network/vnet.template.bicep new file mode 100644 index 000000000..d10abfe56 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/network/vnet.template.bicep @@ -0,0 +1,219 @@ +@description('The name of the existing network security group to create.') +param securityGroupName string + +@description('The name of the virtual network to create.') +param spokeVnetName string + +@description('The name of the virtual network to create.') +param hubVnetName string + +@description('The name of the private subnet to create.') +param privateSubnetName string = 'private-subnet' + +@description('The name of the private subnet to create.') +param privatelinkSubnetName string = 'privatelink-subnet' + +@description('The name of the public subnet to create.') +param publicSubnetName string = 'public-subnet' + +@description('The name of the firewall subnet to create.') +param firewallSubnetName string = 'AzureFirewallSubnet' + +@description('Name of the Routing Table') +param routeTableName string + +@description('Location for all resources.') +param vnetLocation string = resourceGroup().location + +@description('Cidr range for the spoke vnet.') +param spokeVnetCidr string + +@description('Cidr range for the hub vnet.') +param hubVnetCidr string + +@description('Cidr range for the private subnet.') +param privateSubnetCidr string + +@description('Cidr range for the public subnet.') +param publicSubnetCidr string + +@description('Cidr range for the firewall subnet.') +param firewallSubnetCidr string + +@description('Cidr range for the private link subnet..') +param privatelinkSubnetCidr string + +@description('The name of the private subnet to create.') +param aksSubnetName string = 'aks-subnet' +@description('Cidr range for the AKS subnet..') +param AksSubnetCidr string + +param clinetDevicesSubnetCidr string + +var securityGroupId = resourceId('Microsoft.Network/networkSecurityGroups', securityGroupName) + +var serviceEndpoints = [ + { + service: 'Microsoft.Storage' + locations: [ + resourceGroup().location + ] + } + { + service: 'Microsoft.ContainerRegistry' + locations: [ + resourceGroup().location + ] + } + { + service: 'Microsoft.KeyVault' + locations: [ + resourceGroup().location + ] + } +] + +resource hubVnetName_resource 'Microsoft.Network/virtualNetworks@2020-08-01' = { + name: hubVnetName + location: vnetLocation + properties: { + addressSpace: { + addressPrefixes: [ + hubVnetCidr + ] + } + subnets: [ + { + name: firewallSubnetName + properties: { + addressPrefix: firewallSubnetCidr + privateEndpointNetworkPolicies: 'Enabled' + privateLinkServiceNetworkPolicies: 'Enabled' + } + } + { + name: 'ClientDevices' + properties: { + addressPrefix: clinetDevicesSubnetCidr + routeTable: { + id: resourceId('Microsoft.Network/routeTables', routeTableName) + } + } + } + ] + enableDdosProtection: false + } +} + +resource hubVnetName_Peer_HubSpoke 'Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2020-08-01' = { + parent: hubVnetName_resource + name: 'Peer-HubSpoke' + properties: { + allowVirtualNetworkAccess: true + allowForwardedTraffic: true + allowGatewayTransit: false + useRemoteGateways: false + remoteVirtualNetwork: { + id: spokeVnetName_resource.id + } + } +} + +resource spokeVnetName_resource 'Microsoft.Network/virtualNetworks@2020-08-01' = { + location: vnetLocation + name: spokeVnetName + properties: { + addressSpace: { + addressPrefixes: [ + spokeVnetCidr + ] + } + subnets: [ + { + name: publicSubnetName + properties: { + addressPrefix: publicSubnetCidr + networkSecurityGroup: { + id: securityGroupId + } + routeTable: { + id: resourceId('Microsoft.Network/routeTables', routeTableName) + } + serviceEndpoints: serviceEndpoints + delegations: [ + { + name: 'databricks-del-public' + properties: { + serviceName: 'Microsoft.Databricks/workspaces' + } + } + ] + } + } + { + name: privateSubnetName + properties: { + addressPrefix: privateSubnetCidr + networkSecurityGroup: { + id: securityGroupId + } + routeTable: { + id: resourceId('Microsoft.Network/routeTables', routeTableName) + } + delegations: [ + { + name: 'databricks-del-private' + properties: { + serviceName: 'Microsoft.Databricks/workspaces' + } + } + ] + } + } + { + name: privatelinkSubnetName + properties: { + addressPrefix: privatelinkSubnetCidr + privateEndpointNetworkPolicies: 'Disabled' + privateLinkServiceNetworkPolicies: 'Enabled' + serviceEndpoints: serviceEndpoints + } + } + { + name: aksSubnetName + properties: { + addressPrefix: AksSubnetCidr + serviceEndpoints:serviceEndpoints + } + } + ] + enableDdosProtection: false + } +} + +resource spokeVnetName_Peer_SpokeHub 'Microsoft.Network/virtualNetworks/virtualNetworkPeerings@2020-08-01' = { + parent: spokeVnetName_resource + name: 'Peer-SpokeHub' + properties: { + allowVirtualNetworkAccess: true + allowForwardedTraffic: true + allowGatewayTransit: false + useRemoteGateways: false + remoteVirtualNetwork: { + id: hubVnetName_resource.id + } + } +} + +// output spoke_vnet_id string = spokeVnetName_resource.id +output privatelinksubnet_id string = resourceId('Microsoft.Network/virtualNetworks/subnets', spokeVnetName, privatelinkSubnetName) +// output spoke_vnet_name string= spokeVnetName +output databricksPublicSubnetId string = resourceId('Microsoft.Network/virtualNetworks/subnets', spokeVnetName, publicSubnetName) + +output spokeVnetName string = spokeVnetName + +output hubVnetName string = hubVnetName + +output aksSubnet_id string = resourceId('Microsoft.Network/virtualNetworks/subnets', spokeVnetName, aksSubnetName) + +output spokeVnetId string = spokeVnetName_resource.id diff --git a/archive/single_tech_samples/databricks_all_in_one/other/clientdevice.template.bicep b/archive/single_tech_samples/databricks_all_in_one/other/clientdevice.template.bicep new file mode 100644 index 000000000..5bb4c45a2 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/other/clientdevice.template.bicep @@ -0,0 +1,97 @@ + +@description('') +param clientPcName string +var networkInterfaceName = '${clientPcName}-Iface' +var virtualMachineName = clientPcName + +@description('') +param osDiskType string = 'Premium_LRS' +@description('') +param virtualMachineSize string = 'Standard_DS1_v2' +@description('') +param patchMode string = 'AutomaticByOS' +@description('') +param vnetName string +@description('') +param adminUsername string +@description('') +param location string = resourceGroup().location +@description('') +@secure() +param adminPassword string + +var subnetRef = resourceId('Microsoft.Network/virtualNetworks/subnets', vnetName, 'ClientDevices') + +resource networkInterfaceName_resource 'Microsoft.Network/networkInterfaces@2018-10-01' = { + name: networkInterfaceName + location: location + properties: { + ipConfigurations: [ + { + name: 'ipconfig1' + properties: { + subnet: { + id: subnetRef + } + privateIPAllocationMethod: 'Dynamic' + } + } + ] + } +} + +resource virtualMachineName_resource 'Microsoft.Compute/virtualMachines@2021-03-01' = { + name: virtualMachineName + location: location + properties: { + hardwareProfile: { + vmSize: virtualMachineSize + } + storageProfile: { + osDisk: { + createOption: 'FromImage' + managedDisk: { + storageAccountType: osDiskType + } + } + imageReference: { + publisher: 'MicrosoftWindowsDesktop' + offer: 'Windows-10' + sku: '20h2-pro-g2' + version: 'latest' + } + } + networkProfile: { + networkInterfaces: [ + { + id: networkInterfaceName_resource.id + } + ] + } + osProfile: { + computerName: virtualMachineName + adminUsername: adminUsername + adminPassword: adminPassword + windowsConfiguration: { + enableAutomaticUpdates: true + provisionVMAgent: true + patchSettings: { + enableHotpatching: false + patchMode: patchMode + } + } + } + licenseType: 'Windows_Client' + diagnosticsProfile: { + bootDiagnostics: { + enabled: true + } + } + } + dependsOn: [ + networkInterfaceName_resource + ] +} + +// output adminUsername string = adminUsername +output clientPrivateIpaddr string = reference(resourceId('Microsoft.Network/networkInterfaces', networkInterfaceName)).ipConfigurations[0].properties.privateIPAddress diff --git a/archive/single_tech_samples/databricks_all_in_one/other/managedIdentity.template.bicep b/archive/single_tech_samples/databricks_all_in_one/other/managedIdentity.template.bicep new file mode 100644 index 000000000..51988ded2 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/other/managedIdentity.template.bicep @@ -0,0 +1,26 @@ +param location string +param managedIdentityName string +// TODO: Check if the permission can be more specific +// get Owner permission using built in assignments +// https://docs.microsoft.com/en-us/azure/active-directory/roles/permissions-reference +// https://docs.microsoft.com/en-us/azure/role-based-access-control/built-in-roles +var ownerRoleDefId = '8e3af657-a8ff-443c-a75c-2fe8c4bcb635' + + +resource mIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = { + name: managedIdentityName + location: location +} + +resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-08-01-preview' = { + name: guid(ownerRoleDefId,resourceGroup().id) + scope: resourceGroup() + properties: { + principalType: 'ServicePrincipal' + principalId: mIdentity.properties.principalId + roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', ownerRoleDefId) + } +} + +output mIdentityId string = mIdentity.id +output mIdentityClientId string = mIdentity.properties.clientId diff --git a/archive/single_tech_samples/databricks_all_in_one/scripts/enabled-monitoring.sh b/archive/single_tech_samples/databricks_all_in_one/scripts/enabled-monitoring.sh new file mode 100644 index 000000000..bf2001060 --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/scripts/enabled-monitoring.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +# Enabled Log Analytics monitoring for ADB workspace +# Get ADB log categories +adb_logs_types=$(az monitor diagnostic-settings categories list --resource $ADB_WORKSPACE_ID | jq -c '.value[] | {category: .name, enabled:true}' | jq --slurp .) + +# Enable monitoring for all the categories +adb_monitoring=$(az monitor diagnostic-settings create \ + --name sparkmonitor \ + --event-hub $EVENT_HUB_ID \ + --event-hub-rule "RootManageSharedAccessKey" \ + --resource $ADB_WORKSPACE_ID \ + --logs "$adb_logs_types") diff --git a/archive/single_tech_samples/databricks_all_in_one/storage/storageaccount.template.bicep b/archive/single_tech_samples/databricks_all_in_one/storage/storageaccount.template.bicep new file mode 100644 index 000000000..5c24b387c --- /dev/null +++ b/archive/single_tech_samples/databricks_all_in_one/storage/storageaccount.template.bicep @@ -0,0 +1,81 @@ +@minLength(3) +@maxLength(24) +@description('Name of the storage account') +param storageAccountName string + +param storageContainerName string = 'data' + +param databricksPublicSubnetId string + +@allowed([ + 'Standard_LRS' + 'Standard_GRS' + 'Standard_ZRS' + 'Premium_LRS' +]) +@description('Storage Account Sku') +param storageAccountSku string = 'Standard_LRS' + +// @allowed([ +// 'Standard' +// 'Premium' +// ]) +// @description('Storage Account Sku tier') +// param storageAccountSkuTier string = 'Premium' + +var location = resourceGroup().location + +@description('Enable or disable Blob encryption at Rest.') +param encryptionEnabled bool = true + +resource storageAccountName_resource 'Microsoft.Storage/storageAccounts@2019-06-01' = { + name: storageAccountName + tags: { + displayName: storageAccountName + type: 'Storage' + } + location: location + kind: 'StorageV2' + properties: { + isHnsEnabled: true + minimumTlsVersion: 'TLS1_2' + supportsHttpsTrafficOnly: true + accessTier: 'Hot' + networkAcls: { + bypass: 'AzureServices' + virtualNetworkRules: [ + { + id: databricksPublicSubnetId + action: 'Allow' + state: 'succeeded' + } + ] + ipRules: [] + defaultAction: 'Deny' + } + encryption: { + keySource: 'Microsoft.Storage' + services: { + blob: { + enabled: encryptionEnabled + } + file: { + enabled: encryptionEnabled + } + } + } + } + sku: { + name: storageAccountSku + } +} + +resource container 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-06-01' = { + name: '${storageAccountName_resource.name}/default/${storageContainerName}' +} + +var keysObj = listKeys(resourceId('Microsoft.Storage/storageAccounts', storageAccountName), '2021-04-01') +output key1 string = keysObj.keys[0].value +output key2 string = keysObj.keys[1].value +output storageaccount_id string = storageAccountName_resource.id +// output container_obj object = container.properties