From 2d98d6da4d35456f0755d6d46bc2e4b6abd800ad Mon Sep 17 00:00:00 2001 From: Nok Date: Mon, 28 Oct 2024 23:11:08 +0000 Subject: [PATCH 01/21] rename docs Signed-off-by: Nok --- ...cks_ide_development_workflow.md => databricks_dbx_workflow.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/source/deployment/databricks/{databricks_ide_development_workflow.md => databricks_dbx_workflow.md} (100%) diff --git a/docs/source/deployment/databricks/databricks_ide_development_workflow.md b/docs/source/deployment/databricks/databricks_dbx_workflow.md similarity index 100% rename from docs/source/deployment/databricks/databricks_ide_development_workflow.md rename to docs/source/deployment/databricks/databricks_dbx_workflow.md From 02aa9c07e1f3d120c955fc90b17d5c71a41f260a Mon Sep 17 00:00:00 2001 From: Nok Date: Mon, 28 Oct 2024 23:38:31 +0000 Subject: [PATCH 02/21] add new docs Signed-off-by: Nok --- .../deployment/databricks/databricks_ide_development_workflow.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/source/deployment/databricks/databricks_ide_development_workflow.md diff --git a/docs/source/deployment/databricks/databricks_ide_development_workflow.md b/docs/source/deployment/databricks/databricks_ide_development_workflow.md new file mode 100644 index 0000000000..865fa60a42 --- /dev/null +++ b/docs/source/deployment/databricks/databricks_ide_development_workflow.md @@ -0,0 +1 @@ +# Use Databricks Asset Bundles to deploy a Kedro project From 7e31b888278e0db97f24fb883c6ccc18fcb1ea5f Mon Sep 17 00:00:00 2001 From: Nok Date: Tue, 29 Oct 2024 13:22:28 +0000 Subject: [PATCH 03/21] add redirection Signed-off-by: Nok --- docs/source/deployment/databricks/databricks_dbx_workflow.md | 3 +++ .../databricks/databricks_ide_development_workflow.md | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/docs/source/deployment/databricks/databricks_dbx_workflow.md b/docs/source/deployment/databricks/databricks_dbx_workflow.md index 7146ec7927..229907c048 100644 --- a/docs/source/deployment/databricks/databricks_dbx_workflow.md +++ b/docs/source/deployment/databricks/databricks_dbx_workflow.md @@ -1,5 +1,8 @@ # Use an IDE, dbx and Databricks Repos to develop a Kedro project +```{note} +`dbx` is deprecated in 2023, the recommended workflow now is to use [Databricks Asset Bundles](./databricks_ide_development_workflow.md) +``` This guide demonstrates a workflow for developing Kedro projects on Databricks using your local environment for development, then using dbx and Databricks Repos to sync code for testing on Databricks. By working in your local environment, you can take advantage of features within an IDE that are not available on Databricks notebooks: diff --git a/docs/source/deployment/databricks/databricks_ide_development_workflow.md b/docs/source/deployment/databricks/databricks_ide_development_workflow.md index 865fa60a42..e6001c6088 100644 --- a/docs/source/deployment/databricks/databricks_ide_development_workflow.md +++ b/docs/source/deployment/databricks/databricks_ide_development_workflow.md @@ -1 +1,5 @@ # Use Databricks Asset Bundles to deploy a Kedro project + +```{note} +Since the `dbx` package is deprecated by Databricks, and dbx workflow documentation is moved to a [new page](./databricks_dbx_workflow.md) + ``` From f1e36f247a167aa9051c0fac2349ad867b0bb2af Mon Sep 17 00:00:00 2001 From: Nok Date: Tue, 29 Oct 2024 13:28:01 +0000 Subject: [PATCH 04/21] indeX Signed-off-by: Nok --- docs/source/deployment/databricks/databricks_dbx_workflow.md | 2 +- docs/source/deployment/databricks/index.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/deployment/databricks/databricks_dbx_workflow.md b/docs/source/deployment/databricks/databricks_dbx_workflow.md index 229907c048..d0ec220be3 100644 --- a/docs/source/deployment/databricks/databricks_dbx_workflow.md +++ b/docs/source/deployment/databricks/databricks_dbx_workflow.md @@ -1,6 +1,6 @@ # Use an IDE, dbx and Databricks Repos to develop a Kedro project -```{note} +```{warning} `dbx` is deprecated in 2023, the recommended workflow now is to use [Databricks Asset Bundles](./databricks_ide_development_workflow.md) ``` This guide demonstrates a workflow for developing Kedro projects on Databricks using your local environment for development, then using dbx and Databricks Repos to sync code for testing on Databricks. diff --git a/docs/source/deployment/databricks/index.md b/docs/source/deployment/databricks/index.md index 6fba3b6089..3bd2030d4a 100644 --- a/docs/source/deployment/databricks/index.md +++ b/docs/source/deployment/databricks/index.md @@ -49,4 +49,5 @@ databricks_notebooks_development_workflow.md databricks_ide_development_workflow.md databricks_deployment_workflow databricks_visualisation +databricks_dbx_workflow.md ``` From 055da3f2ce3600fd68da2eac4dbd0e4989ef3fda Mon Sep 17 00:00:00 2001 From: Nok Date: Tue, 29 Oct 2024 13:49:14 +0000 Subject: [PATCH 05/21] add scaffold Signed-off-by: Nok --- .../databricks_ide_development_workflow.md | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/docs/source/deployment/databricks/databricks_ide_development_workflow.md b/docs/source/deployment/databricks/databricks_ide_development_workflow.md index e6001c6088..c5d8deee67 100644 --- a/docs/source/deployment/databricks/databricks_ide_development_workflow.md +++ b/docs/source/deployment/databricks/databricks_ide_development_workflow.md @@ -3,3 +3,55 @@ ```{note} Since the `dbx` package is deprecated by Databricks, and dbx workflow documentation is moved to a [new page](./databricks_dbx_workflow.md) ``` + +This guide demonstrates a wokrflow for developing Kedro Project on Databricks using Databricks Asset Bundles. You will learn how to develop your project using local environment, then use `kedro-databricks` and Databricks Asset Bundle `to package your code for running pipeline on Databricks. + +By working in your local environment, you can take advantage of features within an IDE that are not available on Databricks notebooks: + +- Auto-completion and suggestions for code, improving your development speed and accuracy. +- Linters like [Ruff](https://docs.astral.sh/ruff) can be integrated to catch potential issues in your code. +- Static type checkers like Mypy can check types in your code, helping to identify potential type-related issues early in the development process. + +To set up these features, look for instructions specific to your IDE (for instance, [VS Code](https://code.visualstudio.com/docs/python/linting)). + +If you prefer to develop a projects in notebooks rather than an in an IDE, you should follow our guide on [how to develop a Kedro project within a Databricks workspace](./databricks_notebooks_development_workflow.md) instead. + + + +## What this page covers + +The main steps in this tutorial are as follows: + +- [Use Databricks Asset Bundles to deploy a Kedro project](#use-databricks-asset-bundles-to-deploy-a-kedro-project) + - [What this page covers](#what-this-page-covers) + - [Prerequisites](#prerequisites) + - [Set up your project](#set-up-your-project) + - [Note your Databricks username and host](#note-your-databricks-username-and-host) + - [Install Kedro and databricks CLI in a new virtual environment](#install-kedro-and-databricks-cli-in-a-new-virtual-environment) + - [Authenticate the Databricks CLI](#authenticate-the-databricks-cli) + - [Create a new Kedro Project](#create-a-new-kedro-project) + - [Create the Datanrickls Asset Bundles using `kedro-databricks`](#create-the-datanrickls-asset-bundles-using-kedro-databricks) + - [Deploy Databricks Job using Databricks Asset Bundles](#deploy-databricks-job-using-databricks-asset-bundles) + - [Run Databricks Job with `databricks` CLI](#run-databricks-job-with-databricks-cli) + +## Prerequisites + +- An active [Databricks deployment](https://docs.databricks.com/getting-started/index.html). +- A [Databricks cluster](https://docs.databricks.com/clusters/configure.html) configured with a recent version (>= 11.3 is recommended) of the Databricks runtime. +- [Conda installed](https://docs.conda.io/projects/conda/en/latest/user-guide/install/index.html) on your local machine in order to create a virtual environment with a specific version of Python (>= 3.9 is required). If you have Python >= 3.9 installed, you can use other software to create a virtual environment. + +## Set up your project +### Note your Databricks username and host +### Install Kedro and databricks CLI in a new virtual environment + +### Authenticate the Databricks CLI +### Create a new Kedro Project +### Create the Datanrickls Asset Bundles using `kedro-databricks` +`kedro databricks init` + +`kedro databricks bundle` + +### Deploy Databricks Job using Databricks Asset Bundles +`kedro databricks deploy` + +### Run Databricks Job with `databricks` CLI From db2c0b3ffffa84aaf38e6ff2917ae04dcc9f1970 Mon Sep 17 00:00:00 2001 From: Nok Date: Tue, 29 Oct 2024 15:06:14 +0000 Subject: [PATCH 06/21] update Signed-off-by: Nok --- .../databricks_ide_development_workflow.md | 39 ++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/docs/source/deployment/databricks/databricks_ide_development_workflow.md b/docs/source/deployment/databricks/databricks_ide_development_workflow.md index c5d8deee67..6f5f821f32 100644 --- a/docs/source/deployment/databricks/databricks_ide_development_workflow.md +++ b/docs/source/deployment/databricks/databricks_ide_development_workflow.md @@ -1,8 +1,8 @@ # Use Databricks Asset Bundles to deploy a Kedro project ```{note} -Since the `dbx` package is deprecated by Databricks, and dbx workflow documentation is moved to a [new page](./databricks_dbx_workflow.md) - ``` +The `dbx` package is deprecated by Databricks, and dbx workflow documentation is moved to a [new page](./databricks_dbx_workflow.md). +``` This guide demonstrates a wokrflow for developing Kedro Project on Databricks using Databricks Asset Bundles. You will learn how to develop your project using local environment, then use `kedro-databricks` and Databricks Asset Bundle `to package your code for running pipeline on Databricks. @@ -14,7 +14,7 @@ By working in your local environment, you can take advantage of features within To set up these features, look for instructions specific to your IDE (for instance, [VS Code](https://code.visualstudio.com/docs/python/linting)). -If you prefer to develop a projects in notebooks rather than an in an IDE, you should follow our guide on [how to develop a Kedro project within a Databricks workspace](./databricks_notebooks_development_workflow.md) instead. +If you prefer to develop projects in notebooks rather than in an IDE, you should follow our guide on [how to develop a Kedro project within a Databricks workspace](./databricks_notebooks_development_workflow.md) instead. @@ -46,12 +46,41 @@ The main steps in this tutorial are as follows: ### Authenticate the Databricks CLI ### Create a new Kedro Project -### Create the Datanrickls Asset Bundles using `kedro-databricks` +### Create the Databricks Asset Bundles using `kedro-databricks` +`kedro-databricks` is a wrapper around `databricks` CLI. It is the simplest way to get started without getting stuck with configuration. To find more about Databricks Asset Bundles, customisation, you can read [What are Databricks Asset Bundles](https://docs.databricks.com/en/dev-tools/bundles/index.html) + +Install `kedro-databricks` with: +`pip install kedro-databricks` +Then run this command: `kedro databricks init` +This will generate a `databricks.yml` sitting inside the `conf` folder. By default it sets the resource, i.e. cluster type you need. Optionally, you can override these configurations. + +To create Databricks Asset Bundles, run: `kedro databricks bundle` +If `conf/databricks.yml` exist, it will read the configuration and override the corresponding keys. This generates the Databricks job configuration inside a `resource` folder. + ### Deploy Databricks Job using Databricks Asset Bundles +Once you have all the resource generated, run this command to deploy Databriks Asset Bundles to Databricks: `kedro databricks deploy` -### Run Databricks Job with `databricks` CLI +You should see something similar: +> Uploading databrick_iris-0.1-py3-none-any.whl... +> Uploading bundle files to /Workspace/Users/xxxxxxx.com/.bundle/databrick_iris/local/files... +> Deploying resources... +> Updating deployment state... +> Deployment complete! + +Once you see the `Deployment complete` log, you can now run your pipelines on Databricks! + +#### How to run the Deployed job? +There are two options to run Databricks Jobs: +1. Use the `databricks` CLI +2. Use Databricks UI +#### Run Databricks Job with `databricks` CLI +`databricks bundle run` + + +#### Run Databricks Job with Databricks UI +[add images later] \ No newline at end of file From 273319619b6c0cbf626f94c8ecde3d05fa091464 Mon Sep 17 00:00:00 2001 From: Nok Date: Tue, 29 Oct 2024 15:07:25 +0000 Subject: [PATCH 07/21] style Signed-off-by: Nok --- .../databricks_ide_development_workflow.md | 106 +++++++++++------- 1 file changed, 63 insertions(+), 43 deletions(-) diff --git a/docs/source/deployment/databricks/databricks_ide_development_workflow.md b/docs/source/deployment/databricks/databricks_ide_development_workflow.md index 6f5f821f32..3f10ca38d0 100644 --- a/docs/source/deployment/databricks/databricks_ide_development_workflow.md +++ b/docs/source/deployment/databricks/databricks_ide_development_workflow.md @@ -4,7 +4,9 @@ The `dbx` package is deprecated by Databricks, and dbx workflow documentation is moved to a [new page](./databricks_dbx_workflow.md). ``` -This guide demonstrates a wokrflow for developing Kedro Project on Databricks using Databricks Asset Bundles. You will learn how to develop your project using local environment, then use `kedro-databricks` and Databricks Asset Bundle `to package your code for running pipeline on Databricks. +This guide demonstrates a workflow for developing a Kedro Project on Databricks using Databricks Asset Bundles. You will learn how to develop your project using a local environment, then use `kedro-databricks` and Databricks Asset Bundle to package your code for running pipelines on Databricks. + +## Benefits of local development By working in your local environment, you can take advantage of features within an IDE that are not available on Databricks notebooks: @@ -14,73 +16,91 @@ By working in your local environment, you can take advantage of features within To set up these features, look for instructions specific to your IDE (for instance, [VS Code](https://code.visualstudio.com/docs/python/linting)). +```{note} If you prefer to develop projects in notebooks rather than in an IDE, you should follow our guide on [how to develop a Kedro project within a Databricks workspace](./databricks_notebooks_development_workflow.md) instead. - - +``` ## What this page covers The main steps in this tutorial are as follows: -- [Use Databricks Asset Bundles to deploy a Kedro project](#use-databricks-asset-bundles-to-deploy-a-kedro-project) - - [What this page covers](#what-this-page-covers) - - [Prerequisites](#prerequisites) - - [Set up your project](#set-up-your-project) - - [Note your Databricks username and host](#note-your-databricks-username-and-host) - - [Install Kedro and databricks CLI in a new virtual environment](#install-kedro-and-databricks-cli-in-a-new-virtual-environment) - - [Authenticate the Databricks CLI](#authenticate-the-databricks-cli) - - [Create a new Kedro Project](#create-a-new-kedro-project) - - [Create the Datanrickls Asset Bundles using `kedro-databricks`](#create-the-datanrickls-asset-bundles-using-kedro-databricks) - - [Deploy Databricks Job using Databricks Asset Bundles](#deploy-databricks-job-using-databricks-asset-bundles) - - [Run Databricks Job with `databricks` CLI](#run-databricks-job-with-databricks-cli) +- [Prerequisites](#prerequisites) +- [Set up your project](#set-up-your-project) +- [Create the Databricks Asset Bundles](#create-the-databricks-asset-bundles-using-kedro-databricks) +- [Deploy Databricks Job](#deploy-databricks-job-using-databricks-asset-bundles) +- [Run Databricks Job](#how-to-run-the-deployed-job) ## Prerequisites - An active [Databricks deployment](https://docs.databricks.com/getting-started/index.html). - A [Databricks cluster](https://docs.databricks.com/clusters/configure.html) configured with a recent version (>= 11.3 is recommended) of the Databricks runtime. -- [Conda installed](https://docs.conda.io/projects/conda/en/latest/user-guide/install/index.html) on your local machine in order to create a virtual environment with a specific version of Python (>= 3.9 is required). If you have Python >= 3.9 installed, you can use other software to create a virtual environment. +- [Conda installed](https://docs.conda.io/projects/conda/en/latest/user-guide/install/index.html) on your local machine to create a virtual environment with Python >= 3.9. ## Set up your project + ### Note your Databricks username and host -### Install Kedro and databricks CLI in a new virtual environment + +### Install Kedro and Databricks CLI in a new virtual environment ### Authenticate the Databricks CLI + ### Create a new Kedro Project -### Create the Databricks Asset Bundles using `kedro-databricks` -`kedro-databricks` is a wrapper around `databricks` CLI. It is the simplest way to get started without getting stuck with configuration. To find more about Databricks Asset Bundles, customisation, you can read [What are Databricks Asset Bundles](https://docs.databricks.com/en/dev-tools/bundles/index.html) -Install `kedro-databricks` with: -`pip install kedro-databricks` -Then run this command: -`kedro databricks init` +## Create the Databricks Asset Bundles using `kedro-databricks` + +`kedro-databricks` is a wrapper around the `databricks` CLI. It's the simplest way to get started without getting stuck with configuration. To learn more about Databricks Asset Bundles and customization, read [What are Databricks Asset Bundles](https://docs.databricks.com/en/dev-tools/bundles/index.html). -This will generate a `databricks.yml` sitting inside the `conf` folder. By default it sets the resource, i.e. cluster type you need. Optionally, you can override these configurations. +1. Install `kedro-databricks`: -To create Databricks Asset Bundles, run: -`kedro databricks bundle` +```bash +pip install kedro-databricks +``` -If `conf/databricks.yml` exist, it will read the configuration and override the corresponding keys. This generates the Databricks job configuration inside a `resource` folder. +2. Initialize the Databricks configuration: -### Deploy Databricks Job using Databricks Asset Bundles -Once you have all the resource generated, run this command to deploy Databriks Asset Bundles to Databricks: -`kedro databricks deploy` +```bash +kedro databricks init +``` -You should see something similar: -> Uploading databrick_iris-0.1-py3-none-any.whl... -> Uploading bundle files to /Workspace/Users/xxxxxxx.com/.bundle/databrick_iris/local/files... -> Deploying resources... -> Updating deployment state... -> Deployment complete! +This generates a `databricks.yml` file in the `conf` folder, which sets the default cluster type. You can override these configurations if needed. + +3. Create Databricks Asset Bundles: + +```bash +kedro databricks bundle +``` -Once you see the `Deployment complete` log, you can now run your pipelines on Databricks! +This command reads the configuration from `conf/databricks.yml` (if it exists) and generates the Databricks job configuration inside a `resource` folder. + +## Deploy Databricks Job using Databricks Asset Bundles + +Once you have all the resources generated, deploy the Databricks Asset Bundles to Databricks: + +```bash +kedro databricks deploy +``` + +You should see output similar to: + +``` +Uploading databrick_iris-0.1-py3-none-any.whl... +Uploading bundle files to /Workspace/Users/xxxxxxx.com/.bundle/databrick_iris/local/files... +Deploying resources... +Updating deployment state... +Deployment complete! +``` + +## How to run the Deployed job? -#### How to run the Deployed job? There are two options to run Databricks Jobs: -1. Use the `databricks` CLI -2. Use Databricks UI -#### Run Databricks Job with `databricks` CLI -`databricks bundle run` +### Run Databricks Job with `databricks` CLI + +```bash +databricks bundle run +``` + +### Run Databricks Job with Databricks UI -#### Run Databricks Job with Databricks UI -[add images later] \ No newline at end of file +[add images later] +``` From a62fa8f393eb6a4f22a45f9e433a63c3ec1d34f6 Mon Sep 17 00:00:00 2001 From: Nok Date: Tue, 12 Nov 2024 11:32:57 +0000 Subject: [PATCH 08/21] add index page Signed-off-by: Nok --- docs/source/deployment/databricks/index.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/source/deployment/databricks/index.md b/docs/source/deployment/databricks/index.md index 3bd2030d4a..2b969340a9 100644 --- a/docs/source/deployment/databricks/index.md +++ b/docs/source/deployment/databricks/index.md @@ -12,8 +12,7 @@ To avoid the overhead of setting up and syncing a local development environment **I want a hybrid workflow model combining local IDE with Databricks** - -The workflow documented in ["Use an IDE, dbx and Databricks Repos to develop a Kedro project"](./databricks_ide_development_workflow.md) is for those that prefer to work in a local IDE. +The workflow documented in ["Use Databricks Asset Bundles to deploy a Kedro project"](./databricks_ide_development_workflow.md) is for those that prefer to work in a local IDE. If you're in the early stages of learning Kedro, or your project requires constant testing and adjustments, choose this workflow. You can use your IDE's capabilities for faster, error-free development, while testing on Databricks. Later you can make the transition into a production deployment with this approach, although you may prefer to switch to use [job-based deployment](./databricks_deployment_workflow.md) and fully optimise your workflow for production. From 1d592b898f584a27b005b2e9d836f2cd2b8d1ddd Mon Sep 17 00:00:00 2001 From: Nok Date: Tue, 12 Nov 2024 11:35:57 +0000 Subject: [PATCH 09/21] spelling Signed-off-by: Nok --- .../databricks/databricks_ide_development_workflow.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/deployment/databricks/databricks_ide_development_workflow.md b/docs/source/deployment/databricks/databricks_ide_development_workflow.md index 3f10ca38d0..d25675041f 100644 --- a/docs/source/deployment/databricks/databricks_ide_development_workflow.md +++ b/docs/source/deployment/databricks/databricks_ide_development_workflow.md @@ -48,7 +48,7 @@ The main steps in this tutorial are as follows: ## Create the Databricks Asset Bundles using `kedro-databricks` -`kedro-databricks` is a wrapper around the `databricks` CLI. It's the simplest way to get started without getting stuck with configuration. To learn more about Databricks Asset Bundles and customization, read [What are Databricks Asset Bundles](https://docs.databricks.com/en/dev-tools/bundles/index.html). +`kedro-databricks` is a wrapper around the `databricks` CLI. It's the simplest way to get started without getting stuck with configuration. To learn more about Databricks Asset Bundles and customisation, read [What are Databricks Asset Bundles](https://docs.databricks.com/en/dev-tools/bundles/index.html). 1. Install `kedro-databricks`: @@ -56,7 +56,7 @@ The main steps in this tutorial are as follows: pip install kedro-databricks ``` -2. Initialize the Databricks configuration: +2. Initialise the Databricks configuration: ```bash kedro databricks init From 7abbe21565dd9ad071a9946226aa95a57c05acc2 Mon Sep 17 00:00:00 2001 From: Nok Date: Tue, 12 Nov 2024 11:37:26 +0000 Subject: [PATCH 10/21] move DAB to beginning Signed-off-by: Nok --- .../databricks/databricks_ide_development_workflow.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/source/deployment/databricks/databricks_ide_development_workflow.md b/docs/source/deployment/databricks/databricks_ide_development_workflow.md index d25675041f..6bdd69448f 100644 --- a/docs/source/deployment/databricks/databricks_ide_development_workflow.md +++ b/docs/source/deployment/databricks/databricks_ide_development_workflow.md @@ -4,7 +4,7 @@ The `dbx` package is deprecated by Databricks, and dbx workflow documentation is moved to a [new page](./databricks_dbx_workflow.md). ``` -This guide demonstrates a workflow for developing a Kedro Project on Databricks using Databricks Asset Bundles. You will learn how to develop your project using a local environment, then use `kedro-databricks` and Databricks Asset Bundle to package your code for running pipelines on Databricks. +This guide demonstrates a workflow for developing a Kedro Project on Databricks using Databricks Asset Bundles. You will learn how to develop your project using a local environment, then use `kedro-databricks` and Databricks Asset Bundle to package your code for running pipelines on Databricks. To learn more about Databricks Asset Bundles and customization, read [What are Databricks Asset Bundles](https://docs.databricks.com/en/dev-tools/bundles/index.html). ## Benefits of local development @@ -48,8 +48,7 @@ The main steps in this tutorial are as follows: ## Create the Databricks Asset Bundles using `kedro-databricks` -`kedro-databricks` is a wrapper around the `databricks` CLI. It's the simplest way to get started without getting stuck with configuration. To learn more about Databricks Asset Bundles and customisation, read [What are Databricks Asset Bundles](https://docs.databricks.com/en/dev-tools/bundles/index.html). - +`kedro-databricks` is a wrapper around the `databricks` CLI. It's the simplest way to get started without getting stuck with configuration. 1. Install `kedro-databricks`: ```bash From 73c900d56014a48b328cc633f85e5d23dca4447c Mon Sep 17 00:00:00 2001 From: Nok Date: Tue, 12 Nov 2024 11:40:56 +0000 Subject: [PATCH 11/21] add back the instruction: Signed-off-by: Nok --- .../databricks_ide_development_workflow.md | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/docs/source/deployment/databricks/databricks_ide_development_workflow.md b/docs/source/deployment/databricks/databricks_ide_development_workflow.md index 6bdd69448f..536c10b323 100644 --- a/docs/source/deployment/databricks/databricks_ide_development_workflow.md +++ b/docs/source/deployment/databricks/databricks_ide_development_workflow.md @@ -39,12 +39,60 @@ The main steps in this tutorial are as follows: ## Set up your project ### Note your Databricks username and host +Note your Databricks **username** and **host** as you will need it for the remainder of this guide. +Find your Databricks username in the top right of the workspace UI and the host in the browser's URL bar, up to the first slash (e.g., `https://adb-123456789123456.1.azuredatabricks.net/`): + +![Find Databricks host and username](../../meta/images/find_databricks_host_and_username.png) + +```{note} +Your databricks host must include the protocol (`https://`). +``` ### Install Kedro and Databricks CLI in a new virtual environment +In your local development environment, create a virtual environment for this tutorial using Conda: + +```bash +conda create --name iris-databricks python=3.10 +``` + +Once it is created, activate it: + +```bash +conda activate iris-databricks +``` + +With your Conda environment activated, install Kedro and dbx: + +```bash +pip install kedro dbx --upgrade +``` ### Authenticate the Databricks CLI +**Now, you must authenticate the Databricks CLI with your Databricks instance.** + +[Refer to the Databricks documentation](https://docs.databricks.com/en/dev-tools/cli/authentication.html) for a complete guide on how to authenticate your CLI. The key steps are: + +1. Create a personal access token for your user on your Databricks instance. +2. Run `databricks configure --token`. +3. Enter your token and Databricks host when prompted. +4. Run `databricks fs ls dbfs:/` at the command line to verify your authentication. + +```{note} +dbx is an extension of the Databricks CLI, a command-line program for interacting with Databricks without using its UI. You will use dbx to sync your project's code with Databricks. While Git can sync code to Databricks Repos, dbx is preferred for development as it avoids creating new commits for every change, even if those changes do not work. +``` ### Create a new Kedro Project +Create a Kedro project with the `databricks-iris` starter using the following command in your local environment: + +```bash +kedro new --starter=databricks-iris +``` + +Name your new project `iris-databricks` for consistency with the rest of this guide. This command creates a new Kedro project using the `databricks-iris` starter template. + + ```{note} +If you are not using the `databricks-iris` starter to create a Kedro project, **and** you are working with a version of Kedro **earlier than 0.19.0**, then you should [disable file-based logging](https://docs.kedro.org/en/0.18.14/logging/logging.html#disable-file-based-logging) to prevent Kedro from attempting to write to the read-only file system. + ``` ## Create the Databricks Asset Bundles using `kedro-databricks` From 4026db3959970aa94531ecb2ab1d64e2916e87f5 Mon Sep 17 00:00:00 2001 From: Nok Date: Wed, 13 Nov 2024 15:09:27 +0000 Subject: [PATCH 12/21] dbx gone for good Signed-off-by: Nok --- .../databricks_ide_development_workflow.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/docs/source/deployment/databricks/databricks_ide_development_workflow.md b/docs/source/deployment/databricks/databricks_ide_development_workflow.md index 536c10b323..d63aa39a7e 100644 --- a/docs/source/deployment/databricks/databricks_ide_development_workflow.md +++ b/docs/source/deployment/databricks/databricks_ide_development_workflow.md @@ -52,20 +52,15 @@ Your databricks host must include the protocol (`https://`). In your local development environment, create a virtual environment for this tutorial using Conda: ```bash -conda create --name iris-databricks python=3.10 +conda create --name databricks-iris python=3.10 ``` Once it is created, activate it: ```bash -conda activate iris-databricks +conda activate databricks-iris ``` -With your Conda environment activated, install Kedro and dbx: - -```bash -pip install kedro dbx --upgrade -``` ### Authenticate the Databricks CLI **Now, you must authenticate the Databricks CLI with your Databricks instance.** @@ -77,9 +72,6 @@ pip install kedro dbx --upgrade 3. Enter your token and Databricks host when prompted. 4. Run `databricks fs ls dbfs:/` at the command line to verify your authentication. -```{note} -dbx is an extension of the Databricks CLI, a command-line program for interacting with Databricks without using its UI. You will use dbx to sync your project's code with Databricks. While Git can sync code to Databricks Repos, dbx is preferred for development as it avoids creating new commits for every change, even if those changes do not work. -``` ### Create a new Kedro Project Create a Kedro project with the `databricks-iris` starter using the following command in your local environment: From e8c13ef86127a3bd75329ae7a5197ebb18e9d039 Mon Sep 17 00:00:00 2001 From: Nok Date: Fri, 15 Nov 2024 03:46:20 +0000 Subject: [PATCH 13/21] add more image for running jobs and add existing cluster section Signed-off-by: Nok --- .../databricks_ide_development_workflow.md | 44 +++++++++++++++++- .../source/meta/images/databricks-job-run.png | Bin 0 -> 32689 bytes .../meta/images/databricks_cluster_id1.png | Bin 0 -> 23863 bytes .../meta/images/databricks_cluster_id2.png | Bin 0 -> 20624 bytes 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 docs/source/meta/images/databricks-job-run.png create mode 100644 docs/source/meta/images/databricks_cluster_id1.png create mode 100644 docs/source/meta/images/databricks_cluster_id2.png diff --git a/docs/source/deployment/databricks/databricks_ide_development_workflow.md b/docs/source/deployment/databricks/databricks_ide_development_workflow.md index d63aa39a7e..d170a3d2ff 100644 --- a/docs/source/deployment/databricks/databricks_ide_development_workflow.md +++ b/docs/source/deployment/databricks/databricks_ide_development_workflow.md @@ -111,6 +111,33 @@ kedro databricks bundle This command reads the configuration from `conf/databricks.yml` (if it exists) and generates the Databricks job configuration inside a `resource` folder. +### Use Existing Cluster to run Databricks Job +By default Databricks creates new job cluster for each job. Sometimes you may want to use existing cluster due to: +1. You do not have permission to create a cluster +2. You want to get started quickly with an all-purpose cluster + + + It is [not recommended to use `all-purpose Compute`](https://docs.databricks.com/en/jobs/compute.html#should-all-purpose-compute-ever-be-used-for-jobs) to run job, but it is possible to configure Databricks Job for testing purpose. + +First, you need to find what is the `cluster_id`. Click the `Compute` tab, then click the `View Json` options. + +![Find cluster ID through UI](../../meta/images/databricks_cluster_id1.png) + +You will see the cluster configuration in JSON format, copy the `cluster_id` +![cluster_id in the JSON view](../../meta/images/databricks_cluster_id2.png) + +Next, update `conf/databricks.yml` +```diff + tasks: + - task_key: default +- job_cluster_key: default ++ existing_cluster_id: 0502-*********** +``` + +Then generate the bundle definition again with the `overwrite` options. +``` +kedro databricks bundle --overwrite +``` ## Deploy Databricks Job using Databricks Asset Bundles Once you have all the resources generated, deploy the Databricks Asset Bundles to Databricks: @@ -139,7 +166,20 @@ There are two options to run Databricks Jobs: databricks bundle run ``` -### Run Databricks Job with Databricks UI +This will shows all the job that you have created. Select the job and run it. +```bash +? Resource to run: + Job: [dev] databricks-iris (databricks-iris) +``` +You should see similar output like this: +``` +databricks bundle run +Run URL: https:///?*********#job/**************/run/********** +``` -[add images later] +Copy that URL into your browser or go to the `Jobs Run` UI to see the run status. + +### Run Databricks Job with Databricks UI +Alternatively, you can go to the `Workflow` tab and select the desired job to run directly: +![alt text](../../meta/images/databricks-job-run.png) ``` diff --git a/docs/source/meta/images/databricks-job-run.png b/docs/source/meta/images/databricks-job-run.png new file mode 100644 index 0000000000000000000000000000000000000000..1c82b77d229491bb3d4b815a7c0180be805dc429 GIT binary patch literal 32689 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 literal 0 HcmV?d00001 diff --git a/docs/source/meta/images/databricks_cluster_id1.png b/docs/source/meta/images/databricks_cluster_id1.png new file mode 100644 index 0000000000000000000000000000000000000000..665b1319e7d76f81dd91973586e21a5e4286ffbe GIT binary patch literal 23863 zcmce8gAgQb1$2F5(y$EIs*zOA zqve{X|NgUPzOYtJJ*;qka@h+$?}hxFQY<){(ra-E9wpn_XDW&6`yfbxgLAc%dAI51 z28YA$9=%&DgSt$(0^U6P=d1Z8SzCMgj2@~eF7n?mck8}Ms~U@Jf`9&p8>IQpZwck! zw{U~%lArxT`S*j_uRncY`u7yi{=7l7`tNXB)E7z^|DO9J+qW;^|Bn1Fiahz>6_qfl zvi^5+BV2@<|Ly}n@c+-Lo%LNh+rRPJ-Aeu}%g=(w@?j@Pyw_&_-{=|e`LZ+$ro5{z ziFNFPlxLQcIO9_U3>^m#4@INQhVzuWH3?Fq`{Qb6lE&(=r_E5ynt1;m*zc!oDzwRc z#oMYaiPv7;En+T`9H2{mbfbfAok=IQ{O{?~p@gUEd9?AQ-p6Uu1^qL6`2SvY?J3S^ zdoYV=ik;ROcRx%bT{t1?_CYhf0~Ko0WU_I{Y5qc6d%5x-l|n_Q1Z!(Uu7y9S!Hz& z%Gcdk!i5k!jSBXy{IfH#*-q%rGu%>YYYu76vl_Uy9J>;&qo@i#TeWA2!$M``HfBq3 z*Vk1nHqGSKblD-bD~9XAsc8*(!7-(2^q2O-;$Qxqz++cBmHe)qYy1EMsM5$Es-8+V zJ*!b@sSwETsBI*&sKa|EpW6@n;@zsY;D)9?%A5D`d;EfM?DzaPO zzAIAF3lot*#C*w=D84jMOy;#EGRVZIR4|m`rp9&Oj-;^Xnwknf!Kf1{J~e|6pZ_~y zPafjvzcR&X5I>uyxCvK+v5H2}PUWvsCd+K3fw_ZT6bw~_u(-cSeOJP>*RrQp$p&@v zT)sHIRClapgL_Y&3XUwgd0K>cA8CKUSYmslN$ z@1LD}2tEl%n(59E&nAd{5Zxhslp0gm|hso3VEs;~*67=Lub@m+KZ zn-)n&%qmHJ)rMo8wEt*Qx%f0vXm2ce`{<}IGor;gs0y}UMss=Hwnpujj+I;5!nR~J z_eR#hB8vgGAE};P`M@mPF*dlPnYi^fmDOiMo_K^8^+Ox#<+*RZigM9^XoCxiF5pOk z7>It7d&!SZw7qo!(aV6U#X$Q96PXKh)n1XuVmn+HxfQ5o3rZKrgr7t7k$z2Dz5Fpw zYyT^C-#2bI=Zi`1H_*F$T2W>(14%(2z5hVmrR;vk5w!0uaR(Yz?j57cRx@qTO|WLg zdXw09iU}1Jh#t;jarzI-gI+2X6YPycRf-xOcwb(9H~Wc~{a;W^c;+De58B-)LXnOB zf53eDj2`Hp>jYKeCq{qzFpEKDK%J#hpzr3mEaTKbih=hw&6bJI-bCq_?aNq|XHnsl z%#_dL_lEqG>U5cNnqv^S381fucea{J-Oua)8Oalo<8x`IX{&&?fq9pnyT92^>(81UnL zm2D9am|1CfMo_3xAXmqn9@A%1)+F_^1}tx6L?t01aZ`HrgxcPeM~JmQv$fF?SW#O$4sKHpOZe1d;VC77EF>x^sT^+9<_m$1z@kJF z5zB2Kz~DNoRJz6(%?IwYIvF4~;IexzYAji7du*UaPpEv9TMR29;>z9>sFV6*D~+H#8(9k7A05+k6)*EA zB_cI%_rQN8ZLZ2Ack>$@QsQB|RD2CF*_crSRxi3WaI=e-7id{vQ*&U! z*~bGsrRnM*R(~Y@L8vnrGXa{fkleLu*vaQ|NeZG-O#dkhQ@A-|VUpM0(OE07wA|Ul zFX@%Zd-;{>>H${AC=f5BPF(^OFNhkS)%0~ynY?8g_A1aC^JnP^_sz4FEfl1W|ITKh zFqz_JafMAhSw=H8Rzt$``uc<>C@6T10=IWq$m@D@gYrH2=sl6T~8M))l%IC6~3c^SuJ4_jz~JZ9@QMr z3l+ZZ)WOjYI2%rUneDGhGCvuq$VA>aHDJ0CdLfD#;ATdD;v)1~$NTXdo#ncN7^6MN(Eu0!K5lCNaqYHb z;b5WltC@T%$YFhxP9aTrsPzHu1m{_ypd`Y2;jiJ^Emi3Jz9m(D3=)ut)68{ArRW;jgt1ksKlx zFD*kt!>MrTQDD|>{U~Me`p8b*a33^Np0D^+RI}uz=Y@DYkTy5@OCut4dvNP~?hM4J%ZlUo)N|kXnGz&V z;>CWLN(WvrXmSiJm}o=Fs+Gj@O%W=Rx`;__629W~yQ$=CF`RND_TZib=ld=-GTuD! zG`6nbeAz0RVRt^x5@cyjDAWB@OV)&N?Rv}O&TaFCNmfoSS91ji!NH+?11>@+Jy5FK z(%sKx-QaNY5(wXVeu1%E$G50h*GlxNhI_Bx+|O}b9xaUYahU%_2Vf}97AuhnOequ7 zO%c_$;FKTaKDXI&sz#Qk9akJswx_xk?J7qO{h`zf$N?lOv-VOZk^+?mrvfqoI=1I7C5|4VcYPy z4+Z_fd6piGau75A9as|8Y;Z?C#l|o9Z^C4C&pD)H8_L$d7=S z5&_rKzWn);IN;7~R$3Ado37Z`!bb8Gd=1w|a#zjg`lm>Foz&(f3e*tGFEcN^*+iRE zSN-2g@;PkMGR!=7wjSz~S69a+lxSb!7*i`ugZ-AEOb0^lN!vpyn|I_GPEU_M1&(dzohr<`KRYL<-6uOJzSkYC?cm_0~Lm+6c4xZ38K&e$#X#*hP8@y+kU z8|!I%lgm1e*EfAi(JB<&(i8r;wAcEv+351sVj>1OgoLRP$NY%B=!Xx+syWerNoY!yD^$}JOy zczVlZpYjsUr_6}dYwtzm5*Lm=mxt{V##>wRhr3HUwH66+@v*}PUm*A==4aOP2DF-; ziO&2|hE_$95R?ky(uDjFMs*pZ$azFl6r>e~E*^mVjUSR4HbFuthosA!cOxVvt7>$p zRWNuPn*5ri%CxgFK$9`Zk468dVXZ`Voj?MjBgzC}hdPYP=kYlpbWvPeV`M-Jyl9T5^K)fKsd+Wl<_#Bw~T;+#G@0*+a`X=@G z?K?E&N-wxDy_PnIbvI{o)uvpX{X~j35KQGyXdq-%)G?-(c>K@Tt5MfpClul2T)HVU zRVyLLsM~^ckfJi3I=ECvHIU*A6iG+!GyNv%J12KJ@@As$A9kngzi=K-H4}*prYU4* zEaiC^j9e#J^Vp46NxGR0B|+7L|6T^TDk|O*E9npb1*zEt`Px<7&Q+ zLBq$yN0EqldgLxll{xWj>D-bri6;@|Y`!B|$0G~$8hxiR%q zJG4bo6gLRdD=K3xu}y~h3nPO}-VcLqmMqa&H;d6tvhBy))JayChi-XronO=+zlR7} zE}UAs70Mxs;!8s(eI|7f6olOR@Q7wLebtqhf@a*U_>P+!`^#l|qeBmj94}uk zPj=)AgYjzNV|MhKeqZFgox)_{-nW+chUwG2Qf%IN@VZh5sWr#Y#1D{n?T_f_H#Ix@jox3$ml~}OR|Y5JI=$SKYh<>W zl89D@e(1xOYeNZ!I1xn4$d^99JD6?y%XS=|{8?(OJ<9D@5G)^{85sw&l?XmQJ|Kd} zh9Jw82c@o*0UcQ6p?1SLi?cJnH;3uVx56Yt)9ESIAc{<{=9MBE06!xmBLe`&h_Jc@ zjn{a*J@UEBQ>Jabu|mY_jzGwAi#p<+UEuJTm-}gK#OrkMTCB3KOsOKk=YSjoEa|n)&EChrklc;GOWjYSEc(^4z-ZjlM7% zT3TvpKaEFS3Bk#`8tX1X5kvJu{_u7rIF3a#5+jir0rw@b41khnB{Q;#Wl~Io%S8VtT1bog2fhwm#&>>dq|hsQd{nDSWUX}oo!aI$;ik6 zaF0nz2>`&&zl?%}+ji^9z>iW;FwHPCvb!?}6}Zv4dJl~J;m3jCDF$g(D4W^6=6#I~ zA22b7HwLmh(@i*HA(&7d*cCeCRq7||SVKc-`sE2bw?AjzclyZMo!vcLf*0~B;IAz; zu33zUeM+>OL2ch8BsI|{oPq^?iA7bc`c_PtPFZpQgdus-9vZ1?{gWdxjC|9AhRp`t zX!yNNwewWmk|c#$E&KlN?pTu~kL7LliWsP{si|rm{=WFy>p4J`fu#A8ghW!yomWFU zn0kOo@ovMP!U`qC(o%*F7sEEyY8Y8^^K*!n_Vt?$dQXg7OEF2)yTYR zy>%kRNVLdreY}3Cn=DZ!ft(F~u?ODr zu(P^R)BdQcD%VymQ_UGF+cK4c+!%Ebf8NS)-_Wk#$W~HfODp^Jt&qt@N)4%?lbRL6 zaD+<1q>R6#%M|vJvy02_QjXW<(D%W?!SLm!rb-u>9l#imy{@0t6{^qr9hX-tEKHY# z=}`~?x$%wA`?;&NPC>{o*;pVBawM@5$*DMDbt}nd3-B-73Li3;g?49K$%2D}Zw^sM zTiyRw+6|HKaZ=7B+q2#r93E8nD{FKjKG|%kI zhnJb^pJ=~W#iy^NOz-xdOXN|$6^>Vdv9D(pM|^J((&ovbh>rY-_uce7bbMmusc(Q= zV|v`W=ld&<`)jr=qAtVJNus|zibGWuSmV{>R$(ef#XfQRbe2^j0(@~W32X$8J`pJ^7h;pr>mT)sE9RgLCvF%RQLyztIR8EYGNcZb{8vzrl&P% z|!Etcn@eWAL?O&`5g1k*`e zX(zb>On+r%A^1WK<9Dk4?{5ewW#_1D92`ii?ZdX5mWw+z38w3t1(TP*IvUjn*tpo% zW>EYb9=7EVxpf~A&ySYlS$cf^y`~C#x12Oe^atwu3u zh}~f{43@(7y(7>oetQT;!l#8D=~hdZ@SM1^MRDtS!>^}=T69T z6P%%05|vQWeC@Jk1gbq+9I9u_$;*aSdXnOPxGNRP-CYg2!l-$Q9#tyYZRWq|-*UQb zUI`P1U#-toJv&-#8OV4*)2gu(%90-A_1MEt7idX@p8&E&Pw9Cp!U9h*!*Rz4A~NTJ z@xalLMfB6`2A#FQWs1u?0#7|Q>Y6vrbC={ofeSk4N`yeJ92G^nISR?tI`8owl#|y! zommk)K4Wm`s``--mlmYUEXf=T+1O@EDAN~vV0^31$It7qJ*eHRQ}=st@F0TDP1J;4 zJF?;zo~nwpton}>Xl_8m^U%;fT6HUWjozj*Ijir~L!IN*f@2jYwCaB-zOxolz5hh- z?3~25FKIS-8xtkz+Z{&8ht}Wf!N74>Ep^K!iWR%^#z2CBTI~&OaT!OK76(fVGT^SbUh*%7nxl-4`Pm=zuHv#@FOk;{VRyXIOlS(noxjx&ggl|ESj)IoW(xUMri6PumXX#M z;Ix}7LDhUYdiPG}IeQsG_eA~yCqRW2^zpoOaG;2)b7YAD&zA zvzF>zMNM~_q8Dk7kgJfpMzvBLcMk5>H#MD%!YO0(N8-SpI7jo?76Da%1~fn^hKDMu zDwb2HdKrSxqrprADe4Jpv(t8q;gUlsYGwKnKq{_2v+Eo=^F{jHMQH3nL?~;lsQA;M zn-!LLqw?kc;oKfwFw);20T7Y$!h$n>lO^HgLf-&&_i_Z{v;>t;)fiO3Nq7P`5PvOY zUM>Njw!Gr#8VjF>uLbq(aIpNhR+sxIKjTO z!mWk2Ti@-8X=)~lpTWj*GPeyG{z^S+XP-Z;T%Fj=emOoiFTOQz(Lf(W^YMh~ToyAe zdf||+ZzxKPH>gT_`}o{=Ji_^=HFs!pbxlRwK#R|>R$bmR z*_%7MQ0G!b?>qp}shhddau>xtg{9`bU4M{7us0#E0jiH*N{8P1NJvNogPA=n5I^eo zeA@dw#nKxReA6SsWing+;0b_vfG0d!P+wmS=x{#!pBLZ{419Od=9ZdRQIYhT1omuD zr{;WpZ7G#Vo8l(nPW}ZcxwHd08J6h8+$d~J6`$W}lAf#3rexTS0!6lL%8Cnk&50h6 zX?7vjrwsADyyCcV=v4xU!nerKKFD?bqmSpAJ{!NI%h6=a%J>8}yOTHvK6MmNlcF&B z$M#qd0gH|(AP|a4c&8YrkL3hU)W<;crkdofyQ3b%J^U;(H0q4u!gTIP@_W4(j3p1^*!0BJ}+8_h9$!w)4NBjL=p6qK*?{^@)wu}VhJD`a37Tn4CNM_yJj*~2COAYe7 zZ&2IA2TCqKK+D%|I$%M?CP8>3MEkA?!Dl7kGIkJc9Uy+vGCJ3g8<|Jl)*qc-u2w=q ztUU6>T>UY!nLayRKMJD~^x^DJ`Ey`8iG6NcL%oCq$5G^_r(#`+A>tbmp9;J5c`!_2 z`mBFyj!qIb;_0$CT2aD-7D@V^pIQR_sLE=&I&``r#-QbBw%Y$vuMv>%JJ(Gaa>Kfd z;Ty2IDq4Bvld&%9E`K=*BPYa;nCyc#kGNoFmz}XyA<_~Cg63F8r-4xNnoXmO0iadD z(V*@MO-S87Qk!vww{DN)ryS_oqdz|$jY|oaq`ORsF3~<-nuLVhrFzn5&<2sb3hP9LVuJ=b zViEo#%h)!f2@&huHfhldE~8nc?cqm#hOLgNxll5ar;dgFCEdEi#a$upVsOUBH2?_7 z4~Lip_qSo3f^XWZ>0)1x@?5>(brPUq-`Sykose-Evj(Vgkb@lBi2t6wq+qcpUtfE`pf&*L_`&ihgKzMn_srG`AMcr6QEe_pa@%*NB-w{g-oE6t+&q=RMpONAPSBeg@A8D5p1w)+PB# zkY>k{6-b@+yaI{+N(^i)27s*b0mXXXJ8ZFWH~XrFd%Z7qHL zhn!zjZ{JGGs;ZQxDVNq+j*rJ7qoOG<{~`rc{6EAZyi^|{0!#hr*ob>U;7#L?S??}v96s0F6)tosE*VelJbgwCmA$TolQbY;T(S-uV znHCtl%~!4L%3^Hnad|*AJw1(*QHL^B1TLX|$B7@W@-;m@efrPvf0bF@3Z&6f6qoA6SB=}C(8LH zjbBn@21REc_ak8Y&~{k#mo>gv<1=Hz^JsVEq?x`BfA1zRvs? zK@y*=g-~wfFQ}&}Ex=GQs-GU`oQUQN0cZr}6|6qiIt5!!MBD^7QQhhXhG+l!EZCc| z48?VgUixRVxSy~iTY3@ z-TdPx>NwRgbK`H+ej*nJ#CXp>Y)|Jb!C+p>7? zD%1AOa85scNmo5WsIKM|QevhpClGa+dr3#}Pn#BB#!x4tCZ8jKpX&x?^hBCY(1RG^ z!+S4=exg0XoLu{=#XZ_8>?*YJ8h(Fd$_9HjJB@G#DEVtJf$7 zeepZypr6w*RBKlhFBCZym7v zWt0%y;T&8a^zJ?|bIrv1#E(SHJYJ_g)kS|9!O^URu=>%D?bk5xN@b*2x(nvs58@E; ze^a$tn8g`&AF$gTuoFH5+yrv4_%^YedGE7AGTXtYSWy>!1gGJ4UUQ{%&EtCmj6(4b z>GI$dpaK82wDf47`FjGO+lGgS>$|ZbQz`;|)*50!#WeL?+}y-JKX-nD7%T@IQ%lJx zbbn~OPQN|1P9J7TQjn9Oq~cGw4l+@@2_m{dnIK{hutL~mC)x@>ui)kw-cp|Zic$Dv zz0zmz{Gmjn$b%HOJ)U7Ex)12T$uBM~g{em$aN92TM=p7RX6x;^4h3A+Zo;IPAH0aa z{N%07YTz+2~*xpUmxA#g;#h)JRf%L zE1COxx&q6=v^IPk9?e@f_;EMrb z@p-89{W;8vc(PQ12ksW;bMUkOIu)#)v}R%-YkV^c_k9Z>+MlY{-y*C@uTrnZrdIFB7*VU#|yhrI819amL<>UVD?85I0vA~1uNWq%^hdzhoM#mPio zzuKhhujbSxJuFz;1{aF#_?0Y3%%0Jjg_CKlHr5^8Was3FMHDiR3j%F`Auk*@HtwI_ ztBn0K%f?^6Ad**-s^_#dvI&BSdpTpA+|?PKkt^sm4@coi8roYw^qbPk750q#x#C_5 ze&00~PS~b_!agl%ryAQC0p*_G7W=b#px#nu!Fv|*?dOjc^$bxLZKyBuSMg(7+HkOX zdIcv3UByE}TqXLiuthrMJe8BVBuAUYMm_6CP2;xJqUQz)QssBYV{auQi9(um)P)~R zXhB?7lW(Z`w`)))l$Dje+4nf+J?jj+Sml#-)6yK>ioQGEoR;Oul~LV$;A3dm{Z=xF z@=)zj8kXW{b^nxW=DQEQAewA~_}?|`ZuA5%h3ri9rQX&QzN&8p=dD{_L&66L;XzDc z4?XYSRay-Q(`y#eqD)Bl^@TsU3WxU5fo%930_<#cMytda!ZEQND(g(|{9`!_RPj<7 z3F%EKH|%c}9>ADS<&u$G3a-;#-858*1EFDxe@{)7V~}8#jCp>+#%vzc5}{r|p8w8v z&MmwNCv!7NB-f1w%x$Y=)e{jKvC$)5WT8~V4|lVQHTJOdbCsDWEb-!Xd~BRxEhNnD&V8XBbAD^$0uh-*XeDolop}3 z2z!hMUFIok;8&5{1RthB+GlQk%gPni%tq?;Tuq9)AM;f3P8okZrZ>xM@!AIh<_e&B zW4JMW$a!&YvYu!>IyGV3UrjW4bLa-d-OgN#P6fs*e0q%L6OK?%KvLSvJ;zh4hY^+dOP};b`!W zb#8%LwT-S~N}VB$@@1^*vE6bswTqBexf4fIWLmam3wU-;YwV}8-mq?KUxz9T!$njj zq4j>VlU)QFlkKk&ead~4RmHP4U=DR`XyA?CJ5f=Y_m2axwze`%UqEN1bF6=X}>#U`t))eUfNtX2QxcA!PPPAL;F}gAo-kBC2 zvE{F}k_gclk|~i(_OBsMmW!ZYs02VO?Ql6GY_~3^A@oJ|3uO=Ff#j0%y!7Q0T3Y;g z8AvnXSj9W)yv=c|#}%dAFW?dlj(wN`D+ib9#c7_Fju}(|&Qi)7OXA-lVrxOmemkLIPvaH<^xt zB#FRih`E2^e1Q8t0G6oj5fK6hK;MSSrFMM5xvg}268-q`W4-5^L8*RIcND~TZMJ~p zuO$KgupCatk&>^NIS$XE1l>1yzc(K?_<9@dOj|Ic&z1q@0z@Z2VVLy~{|{ zkXO_(BReV(sMXeM(u8m~$U|j=^BFm)rcfP)6ZSC2P{%qsljApYNsEszd@vpPe&5aM zXr9T_#YTQgCUU2DOSjeKDFWk{`9noOSFVX~60b}O;fq&8#UdKVysXGHXgb0N%aQc) zY3@WMJu{F*r8)`qjFxZfW3iuGGg%SIz6Pl4T%NXz;C`WJjtsvor!j+e>o%Qz0rJc0 zR6Tj3-6AEoaEw7KQRikR;aI&L7V4!p&X)}sGvs&@<#(p!+MdM-n%=_NcHwgkmX&k5 z^OgK+u0oiaE%^Ry6n*ooA5Kd)XZU}%i@}! z5s8lQip0ew{a)edkuqH*ojJVRYm$;sAnz6FaM{oFLseyG>{9Qs#g#-1$p;$w$h-28 z@b0NSA5?u@{B~-NQ0&(6cAe||oYTj!^}&|NvY%7XTGM=_!f$M5qO-_Rs37lg?yQ$8 z-A&d^ahhK2qtQ!9Lh+iZHzJ1TmonM>g8#p+jvd+Qx8?2fTj z07llBZRP$=CqDX`l(krM)xM6%s5_S-S6^#bO`?W_&%o7lkb2so`)k~OvNn*QwWY6s z4>^kCZNKfJ9;wGEXWDg_iCjO?c&(-00lgM(YILuNm%?XzTWKdN`ZX3K*3p@~m=Kbh zB?g4Qsaedt>_uvHkQ}P3#&+|Sofzi%fUt##-=m;>D)$hiQOev~%7S)`jScW$DWF3U zNDmG@Zg&s{p1_#x9bzFwfO64CS8&gM=k@a^)vka8tNCy`Qv1kCCX!^N)6TInD$aGZ zS8J>Hd7qSiclSEr28cYIM_fI;U|wpp2#A$@jA}UCKx!{paN7Y6zVd#!UZ03TMn*k7 zyI*P8fZ&*di7P4`7f%`_jf{S(brlg4+bz%sGtRW4E zmKQIG(v5GDWoNW&Y()SsgWWRIH$}PavI~I*&pYx+S8lbk;y$9Xy>%(b$UNx2#h0dM zL@&>^hThqBAppRo6AK`@%=U?#S%`cXBviVc_MP z9qlN3{)nJ>jD)S;Gp|d*A86#5BnX!%N1BPx>jt%`jw~xJoAQCbZcY4L*7p&DW%z;xz$?w%Hbu)O z*cFglA9DQw_sQfhmC)I1Yjo$y7nSFU%xvmE zjcBUbGhgUXt#9IAvoP?N<$*gMZ}No?5S=I>$ul?QH9S8AyZ#~WDrl9vhQZhtCey{3j5+$IM%KefG25aV2cbe3F1{Zo{ z8Q?xzKb5DzJU`!=s;G&pA_W-o=Uxu%j7F)m;F`P(oHRikrOh+uqPRFUU)|>KJspOa zyGy$zn9!=KirQSu+nZC~W6O-pnVm#O;F)B}$$D);G)pw_Vp}tpLPnGZhT_3Tr7DFX zt~8(IS<};g^bev8^f&824&1t0b;jmr-`9GJ)vo*=oQztG>vG2jdf^}6{v4f|$Tk(j z0UZfr#wFzE=0>ML*CP!;5~#PcS}8B_65At<38fUI#q-o+Q=n9DI0I&bKBXNNOUo#1 zO~wl#f3?g=YS_OL28c*689fARw$F_gl!aes3*-h412Zk0VO z^~Yg24@rMIhM7Abrdg)ffCLFsBP_@lIFZ(I8w~ufaL(r||)uXTX&VfP*qx`;amk@4l{+4Uqi) z&c>Y^Fu=Eb@4s3d+1V_&#_9lulR8EF+w-G8;o2f9b+u@LsN2n7eF2*c;Mm^Y58WUV zxx@e&8EU^dfA|Cd7mZe3=T2H5~T6j?BL>B!HTg`_qc zp|`>Z1vP&I03=6o_Pl#5!s19fBvgcXbMwzWK)ESK__^vmo?c|s6iyUsiva`zX219c zs4q&FhY+4&KZlJU-XVV#?qn7!(^Aw7f%imxGEhuJC7(*Fvq4I)K5DX;JI!C~RuD+pPzl5K+91BepAjy|?dpa;t}WvDa0jlLAjkkS9KUM;r7j zDG{h)^QDD`qWb@&3g3HO5M+8sCnL^`6+M4wtbP0beY_&{zIRLKifHysXx@Ws>v(QJ z&8a-cdLiHphh?cAqy5|ClBHG?Dgeu49NUh!zg_-bqb-q3guALcD$AQsY~G7&Z9uy% zQECbQYoINPFxhNu%>s_o_Nn}EZeo$^1--X$InS*&ILR!MOag@gqp{W}v0~++yP=3@ zcec_pW~8Zjn^{j1i1Aj^TYu-e-6wxB&$ggwbCz=1HmTl6kD)#FktM^2Mwz?UCx$r0 z)1}y(m#m3{GYB1&UESS@i>a^B)rut4mo3$BYGh*FRTFR=8ekMb;1XzM4p}hjZBhac z6*aSe(k!xE1c&iQ9R`kN`?63BSMsJ0O0$rF-xy$ZBk~0`uXcqqtam z09yh}^_d_hKLEvxfcZ9d%X<2+3vy^=zA+^;B#N`7n5*)j3MwfN0^F&I+k666hy;K; zP0$M1Q8G}`56)@iYH)d?G-qBhITJn{X6Y~-0XS|f*pflZl3y4ZIb^G`?D)K$osI9S zv1_7 zkkY1zT67*6%2I_K%I26tfwh31Oon@b#kuhA{d*W#(*6grI=ysRQ6sO@@wxcN-*0oj zH2w%opN=|fu&$e{gue#Fp7G}5G6Y@vd6-9YJMK`l=EU|x9@mq!5-k~+n*rd(jB*d& ztY*+;Itl_a>RuD}X5yKR)!i`U5TT9V5lw(;OQ{HKs*u)(XraPgYG$n-6+V3LZ602j zlb;{v$oCdtE&2uC{)%D<4hm)VfMrI!30?3Q2Pl0bdv~-jFD_^e6d=mxmUh9z){PI# z^`&SL`<}Qj$^D};MZBUiVbd)kHX`mH`w^yN2J+y95LG1^tVWED;iE_ft=jy#~4*kg@%E_a-ibPK2p@bo7g_ zUbE$qHjfT#Iz;!lcp!|#dj){ob{5tkm@->e*L#q|nZF1eTBn7iR$Vc8I{!VZ93~j` zJqFQAb;D_V$)M*Pqx)Bq7HGM^ARRITcU&L0RnTpWh{+~DOr6UAX*&noF~`b4pjJrx z_0Q^E9>xX|%q0c??}=z!I;F^O?g}{sOea>$;pzhkDn$}l*kl3my=5l98hb&-f%R3AsNfvh?VllGUm=>&>2=R4aMICpL|@dtERwcxU_~ zwmZsnCrh-8rb`vDERinc=H_iBp{*ViOCz|yOqwGmJN^WzSo~lc;&%Gvl}y&W%m{Y?hOfDPMO*EnS={`i}#&iSvFc$jInoAip{1aY*wcQ!BowdrB~s~@e4wE?cl#P0Qwi(w=U z`?-N~-=*k26U?2lm@5H~vv z$N`|FF8W=+2GMxwShj@Q_O}JUDgTA|k=^e)K#Z%SRNhkwDXZ5hqxDKcZLF1Nlmb0JtKK%iC4cd{URv>`g@wwkp zGsj*qJ}l1MOIfs{q2C@9seNs7ud6F)cgYM1k`(Nj z|BVT3!P5Hlj^BxodTU_qv$=fxgacwm@Y=!Wfxr+&se#KndJIjwrHxYfTmD*`;Fbuk zOYUj4LW`a&zhbKU8w|@9&iL<1v%GQ<19+LyQbtbbuG0j6gyH;kR^7{Zu%t7Xm2cX) zN9jiSf>tu#qu}?%3deD>Uy=wZi}pQ6m^_-`j9{USdv*CeiT9Gg1{p3a(09b)5=}n0 zD%2gKGKk_;uZgOt^Cw1YBv0qhouzM!XDbtfYl@65qJ2yVwF|1jf49t0f$`20csSp1 z$%kh9lZOJDzx$~gLslfP^=+$$`eJbL-B~1jpdPs(d~J6?KAg+Ve_tJv7nzCy$P?Fs z=z!DxGxnobgkj5k{LUTSb8+%5Q}<%a}hu`=EC34JMV!t1`)f$gnCl;Pnm79SX@N3V{!di6(Esc7;( zHKQrL?3`s6un8<)otaJnev~i{@B$90@W+Ynh@J6Wp^~ksrKJj>iMUs{Vr*(C>LgQX zwux6)sOIVtgSf{Nkx`0`CqmS|$v0opKeRVvboRJ0_+ZVXAF=OvJtz)1rLa=6kXCn+ zWs~9?D-@;MjS-6i2OnQFhy2yDYioh;t_$oE!kn`z-oNE5?S^U9y;d35)0$d!EKs&p7K+fys*zg-F$iy1hvQZWG2@XFyOrI_soX(!xgAXl2M zuvyLnoNanY5TbWAPiCNDza;DN_N^<00EWr-SM$WNKml&y(CA|rsW8MJ5G>D~F`h1B z9EBem%ou>`&1nmY^Q7N2w5ks`w6p{7v?*%OLe4oQf|Kb4BKD@c<~j(xbgXTP2l>1& z*+EPs*8CG1rD`vP^vG(-1c8PjAHEYGL*0=WW#SnOCl*~$UjnVG$ybrrY5S$V{2olF z4v8ZOnhV`*mfs>8*j$lZyC7 z0JZ7va_!$|aUhU=!(6JW=M@x1K~S1&x^bJ<^0Ogqu001_G17D;;DwhN*9*v?+7%u= zop&(O(^8Mlc^d)u@4IJ-V~&qE-TjZ1 z#DGtpcE!VcHar}NtAnJr&IOdqqha2(ZTVD5VdZ&i)5K+Tklge{v z>>;?TOyQ3RGzDXGTmKO;`5cp1k^(PZ#%fn=&^Gcrfq6>hQDjw*M6kP$xtygK!>Lx# z4(9Xl{2m@jKpXjTrkhEQK_Mc>hm~zRqxz6PfXdkFE#gBDW7b~}>=0}4fMEk0UgTjm zq86?n!R-`&f$@tVVt{cxe$tOt5Qi~n6W>W1HxDJnhUmDpV_>*Yk}FU@OW~3i5I&w59PzMp6Oj&9{P$0<07NFI6uF3+Ck%;)oA}7_@eSl-OcuPMyZj$r&TXvl>Pge`^9R8^W-{GOz!JEP>s_NdJ` zwZGD%NoMl6%5;W!clp(I+jv{xE+M0~sW&ubvY-Pf5$1dj7`HJ0PaR(w6;&6uO-YyZ z5CYOE0uloQNT`5>(k)6OGtx*SQc?=)&?%h~0s{;s-Q5h`J#>BtpLcz0y+7VxGwbX# zXPdFp+dm?8eN?{Q<2`4ep04@d*Dw78V=AFIZq3f1+JJdEVlzpQ@aC0`r7-KDgy=7`r9{Xo$W74S({%s@- zLgv3@B#f&C<0!2k?jO7sVbw&X4-RSdRuE+F@2x8=1s|W=EUv$XTz!WFt!zSzL8ia5 z=d2eHZ&piYdMf|2U!1!N=Wi92RmkmZHgC>D{-Uat>>rWgo*wWGuLK z!dr5hB|UlhQEq@+%xo~@^0}8+bZdDXB`c(r@YsBrMH({Gy=V13V0Ym-IXr^Z19ksl z#@hp%nXlrepuf(^)0nNk6%k_Gz1HrVpI<5ASeyrfudj9A*qS#TDQBv3~v3!6|W4_hx;{kh7f&-+4qD#={dBV+bk!_qHL zF=y!}3Th8(o*1y_%yf%??EV&O9S3X*Hq&(_xhm2uyYblXCoJ`UvAHV^1?bgicquu< z2R2-0YEy$S^tk z-a`d(LIsoXA?*!tnD^Uq-Axy83>3xjJSQ_Muzs-NJS^2$!Ocxfwm(HBo0BLj-T*lg zadg*L|_3{mAH2iJ%bz<%?Wb-%Dn@)jyx^hAk6kJu&Sku7Tv5C-jaqx8Kw64DIaeB#MrL{O7sxMAt z*_a9Wqs9oT))?x7h_PGYJ+I7_GMtLmolH&cFUbq4S@~1c4^$M=HK{;!v`0;PygypU z1_d^wGhgTN3$y&@UmAxH1~un$x|th#<~tUd!RPCruMgLkznX{Inx{O9>+9?^U+TM_ zn9?84bmlnCPskMwNCk)tvVr;J85716?JK0x zJq2O**ke#s_jb4{@s{>a8e-yg)3%@S&(byNaG7YbO7WHf*-}4G*VMis&e2iZwXRwh zwr|6pI>hB}n-1$b^te!%yEKcz4EwC1X=TcFhG9%x8_e_4Dmyr|TknHs+i%5yKyvDxn?M(! zGo(5(M!p_g>FDk#hz_(-0{ijcnyB|tYLt*iQ_--<%CJ0!$rasVCaa@{-Or~4Hqr$( zl#VpTi}%h-pHC6{1jje8Ki9ZLt_Z?K>&LWDcV$^_RvnV;r09MOcK^s4b&?drl-i;n zDbRBClj17~xyU2Q4I-Dve}(L#(OmnH$otZ!(ooQ}uH#UrV6xu&5zt}yti;;F z;=_8!AXdr3!~x}u&-=?V?kz8tF8Ke<_eAScRcI)Y%hqIK&&#EF%l_o(G}Jt6@Ua0I z*S!MbaGFQvP0dOeGpcHq>wE!q!knRy%Tp1bHk9pnr4(y=dhpKh(9rs%I|dWt^v(H~ z(Yl*eqiQj<)p3GrutQ7?^znRadQY4rAL{&q*!vqW(~2(>g|;k+LX(K~GkG(67Rln( zH3IvtZ9en3so}QI8EKMdhKgUEGc7dyGqF4~RyF}F#k#rQadF=Fr{EbG7b$a^-=1mD z`Kp=!jb~2XDJBmOPm=7ltS_o8pnI)ve>TZa$oFtMiICticn%g0FS9>Q`J}ER$R6r@ zsG=iQav;@2JsQ|IS+e6ywhzg7XB-Kl&>tjw`qC<#pUnL)u7Z((@Q`=vQkebyV%eGQ_9mW^J!PN z^1IeJ*~M?0nMs0pogPeQa1`p7mHr)f<`5&TtmTV}x^VgeRQvj^z2)C0`EoXFg@qMP zR|G+(t6rBtOwk{PM02u$AWk?-oa(E8o32NSO?^9%1Pi$BF@{cC27Ec+NtcpvNnzE_iV05}*zz?{3JX)W`l!vj@x zTy}1Zi+l_hv`YjpZ_fgOUbr%jGxulFi~(wxv9e4u-Z*@G)S0(5_>K1Oo;^OzNj*n( z#vW}=hurvJNqoEzEru2YUG-4}?*h-3=2@pIPRuW(lD$uRlU~n;06XjIx4l$2TwrZw zump2I38rV&f5qq;+h$x(6CHw34xp@;94+c@?N9~OsRiupOyqm9U{=trMcnx=F@-18>0ocAe%{=L#1%$=Q23x=OYMKPL? zA{d!?3u1hrL|Xa&hC>ve$>l?3OER`JWexQvehC7;Eca}h0}Kb4QML;*CrfRK>OD{1 zoaaB`H`%ujn0|1JQl=>88p?2Z-hx>EPF38-g)uOUiVh4RT^juL7-<52yq!fGe>jI1 zK_~NleL}+UvVwQi2g676y1xWz(YO5wUy`Y7t^Bqr&HRz`$p`^(fTf!5BSGY|z@VUm zU&;VpT7kBWe>4FdDP?WAk${h*yu(j+x~+9hO4>*cN0J5YoM>;#Tyy!te|ZB|ihMDQ zZlHmgq3T}w$1SnKLT#Wyw77A{u+k<923P-UEMb3E<8{ruWHx^Kz#TY@&U8E5f|Mm4 zs&dCj=@(-IDu2C3fq?d46kvHWvk96mZ;sjruSj)v>gOM68N;T^e#GV+VG{wUCeZY_ z8t9(=^#kPF$mJ;s5Bnu4qY&6iSC=O75AN_EhbByPcpxr7FCk~jD3WmP5W2DX)z86#zDsy z66!&pzsAQad&^@H(LTyb)=;&ZnwX!TZ_F8%vGACu1I%;l?6So}wnqnZBheCGGM^5f zmQZ`B2gx_-m0M9T8Qs{X#E4&8D9Z`lZ455X{gnj_X%tGLNEF8VsWy>;L051o=e%L4 zqlL0z?wamo=ndG-1~%cgo)#c6TA&)ssfMwS-XmT2Dj^c~-QJS!==eKZeh*oHu|L$f z1{$a$!*~j)iOYbT=aE+cB9eY-6ai7Lf}y9cQb{f~QX~R2vV9wChqIT)dJ<2NH|*@j zTpmk?o8#_ch~T>Mx7OC}W5@Pgp0$e9Sp%JHk$2XH+lbUvJu0d$kUDb_Hf+4})_Y!r z47-aaJB0D{wN{?FrH&2E%@$A~3X0-)4(}rClTDE0mCnF;Z-Gwc ztCrx_2kn!cc{5Y&De5tYz>d6go&@Y^Gi}BsPX)Utv+It7N&<)CbE7-l2dn2?ObB8=l&;^EVrdLk~Cr+8DIT6 zQh%T48VqBS6XO=EQcJn!S-ftyxdj9>)vmM{Qbr6w90zpK|NH~u_~UT;6nNKo8Ank& zJ=&Iw8wjEdxCBIe?LoQva}45T%~LG@1b5>tEG&#c>6DA2hkR}z+3gjHI+;OwMJsLn z`Efx9{Ma`I@&icNzE^^jx=7+ejt)d{hNs<_Ev9z^{bh1ffEgCP4FclPdBO1SfqzrA zfG}M%_`#-~l~u0xsO`=yvHu?d>3Gql)X!$2SaJoUWpB~yQ6VW@5D0cva9^EpsW?E6 z)9qeZ8mf9#<|Gmjh-HK7O5`v4Y02QbrhTR~G%R8>uN{)M@JO>^PNe6?@jih#^dOoH z^%oKR1-R|h`dUuFh(RX#$}qs8o}4?aIhl8UXCkX3-8NP$BUBIrxh3q))Z428D=`jrh~5imiS+ziK5Zp*sS zSK%J7PgXMNQ9^~6rp*Q|EQd#mSb+o!AL4i4p9r2&ljuZNX&)#*P4fVxHr$T2-jO>Y zUq$`juB%XC(zIS%{+e*&&&JhX>U{gks^17-E^)PYz^;-}%J~7_WkQ{-8@s~ADa(fs z%w^6__z+ryWykUgL;1dEuXBD1!0;m9oT2MIxYjK_-5l-`HN+p-y~eNsXADL%2$|ft zn?ShqZV)gp(W~F@CtVwDW|y8;-KhreSX6SYew8C-NEG7=5KXdk%;r}(ml#w9Xvn4- ztX}VBWmBBlk*~2m?E0;i|M)I4SrA7vA} z@%+|a8}Gt^QH9$V>;r+!92|WRe?L5M4(c-wl?N&Vou&AjBW0~M&}8}OjUqR`!OG?A z;5!Y^aH^9wOfB9R8wgt0zm~{WhDEHDN9U|vp48TDI5`biSthzfL>v*jfK4PTUr6tC zeODk6I^EmDdXtq8#rJ2jpTs2hLl0_MEw;!_o`c#SMjO@sgkX$A*+FBiTyx7^qgx*0 z_Ak}8=%vT=1c=6<@3wZae_7knO_UpbYxhR#iCgs=DO$WtGS^&0*CRk#KFhk8prQ7X zvv68KQi?Sn^7Y^_E5E0ybC?#EmcO0H{RoKZLmEmR&H9AjTtf5B70ljF48XhU{L~nL zHW*{wC;LIc~(a7kFMOCil89L2T(zvfYF-aYBcG-%pN{=51Y!Uv!%J2 zvC1zzy8p)GL0Err2t4kQ@WBY=C;; zj0y-~=0a`5qTvZ&%fE@*YBL)#Y`vXE&sBeWcAV|Z<%&rhTmM4n&Lv120ErfW&e%zT zGe+$|)S^*{{*i^#-mMx6=b-!VK7Ae@Tusm14{%$>o$ic_+GgyPcAHdrZamDc zFL`%{YAf|@;RJG*ACDXyKr|9xs0+q~%xAWK{hDDrFdy(<^y4~zbCI(>eLq5>$k1En zQg!uapRL^LCYfi?M{bx?t=fb0^RT%!ovb6_&h($w$;q(rZ}5(;Aq=6lM3@1fkg~nk z0EI*ATDcW^YC>GU)(I3J9}fidIVOrY40=WL1K-#p5=B9>DCkJ>j{dr&u`%Hz1WSI( zYrK&LpKHf&C3;mA%YlvofWHrV%3e3|k;aBk@aQ>&)|`i=sD4e*zheH~iS~!29GHhT&0NGrzR*D*xTd-k^?W29Ugm@>)3W zyA2IJcmsv1CyEutqoXG!q@>Ed`b{wq$J-7QV!$CEAo8U9$;5Y&%@)Z}@&$GgfHQuiEnbs|Py!rmi?r)4(8o&}N@(z5C0k zeXi+j42{515P45;Z{&%%h{(J3G}^ew&NM&y74nN~W3e>D;4|ilf;B$~sPW5uO|}OvMR~E*{@-c_u3<37#Kx z(!O#?DCmYY`gwYSt*or{WeU%9UWw9^OioVT%Z>voFRh4Yk#Ern<>i$Y*4D4;0j9*% zhF@zP)IjC2wj7(VB`^?6L?p=E;9vq<=_wiIJ%R8H4o=R+`S~~cGOn9c`&29cBZB8y zyhZ_mLuI9ES{kJrK|(sEVeb8& z|C}$g)_j_EhP8CFdFmH;-`DkoDJ#k1VN+rw5C}ZEr;lGC5U3jP`vDdP{9kaNM-4u1 z+C6>ch(O>FBmbcw5|hah2zrFvV@XxFr{i2C?zm_nq{kTq8H$QlA;$}9`m+ZJQ zCw$x`Xg0vo;C`Ty4HsAQ#awQTLJIi6F!!aA$ig5 zgBw6k&&|D8@J~@*UfRp6q5U2V@oeutiK%G-{rA~f8rf*tj?437qFc965$0pxC@A@? zu;k_CN4~v!X+!7h>+7^NMS>X0l);&pn7D2FAtEIx2(2%X7YCu7uX_KRcC`|xC?6lG zY!tQs+qamsB5r;O3FNB9dNih{rslJCyi=8y@k^!i&A!pYInS3iC(GT={}tBE_4VP3 zdK^mRD5WS@S-qby?(^_}rU zLqo%P&?O0jT7R$z3Q`nk6o&)`N*7HR>eiE{2)mNT&o_E%+-(^x)ULL>x^PGM#m15( z^4sdMoUYsx5~A!+(XO^Jnk>?5#8y=7*EwK>)ubiSs$S@c zWh+NhUs+jM8_EdOvHU^jdx0V>T;Iy79yQnG9f6$v;oo7m<856PGUn$GKjYrOz$FZf zFEi;~te*F2%T>wx6Tt21dCtB%J~=5UFYzTO=j}j>aBm|&0|Ud_bhT~Ksxb_^#`n4j zjTgCxVkFP17iQ~S?Kda5?Q5T>i6sa*=TC6N#KZ(0ZHzDN{%%9~jTUHR!4W|hE;$C{ zZ}FL#nXkLfe;IrCiwW)>9zIr3!1X))4g;3XRn7aDu)Vn%nfEdW6%j=%ifw6W8N;H2 z3UaSmW0z5rlA22EvON>FK3WiA;^gQUSXo(F(;tA2W4G`fC5GjLx0RUdwhpzp5B2)` z`p1!Xp`mM@FIYGWXGv_&7LSo_~T<4zLcwz78NUZO=HYCYeg6ik8HD&nS4`s2YDl`-e@jaGJqdgrL z;j%fwfT1qov3q(jC~mye`EIeUE1J$M&)5`pN3+&pnSVSCIc3!a4vo^%QacwH()iWB z&!3DVMk?M6+wK36L%ct4xz>6144YQm2Nw|<5z+gRmYSM9+ib>=oQMbomiy%7e3SQb)xqImP)-grjLM%;HtKtO zI~rnlZ%KA9;Vl7OXMYlZhc{R*$8W3gLt|s4`ben;6_<@=Rr^!b%}FTgx}ALDu|AUb z;L)SLeHZ;pgR})y<8<_WoMZlghWK%JJ=#MJvEFEq?N?y z5JR~tjE^ivawU4~FVCF0OCIv`cdh-*A|fUZlzxlfGCE4arPuJi)^T;H*3qmlf&0es z_G}vnD#{mvFSb(^dF0>FFffeTLx~nk&yP0VV&G9ObVQJqR92!RA}M*X!5{?}6&2|S zK13~0FVvEhmcBv4rXKUf=QCz3CK_5gJY#LFkV>n<9L3n!n4Fya^)&kFVh7G%WofB> zkvr^bc*|%Kzirv<3J5m&BXdH80SL(h9-dwYqy_PLjZUj$;v|mp*EI=tw9P%?Hd^MjV3HvCf2P%H_7>J zs1fOK=FqQSt%j{tE+^Vvf#isYZ7;W-Cze}b4 z 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 sm|Zm|_k(($7%^z%O`%?B@`%j-7Y3tKy8r+H literal 0 HcmV?d00001 From 3017317062d95735496981887970e662cb88d39d Mon Sep 17 00:00:00 2001 From: Nok Date: Fri, 15 Nov 2024 03:47:35 +0000 Subject: [PATCH 14/21] langauge Signed-off-by: Nok --- .../databricks_ide_development_workflow.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/source/deployment/databricks/databricks_ide_development_workflow.md b/docs/source/deployment/databricks/databricks_ide_development_workflow.md index d170a3d2ff..ae9f44021c 100644 --- a/docs/source/deployment/databricks/databricks_ide_development_workflow.md +++ b/docs/source/deployment/databricks/databricks_ide_development_workflow.md @@ -111,15 +111,17 @@ kedro databricks bundle This command reads the configuration from `conf/databricks.yml` (if it exists) and generates the Databricks job configuration inside a `resource` folder. -### Use Existing Cluster to run Databricks Job -By default Databricks creates new job cluster for each job. Sometimes you may want to use existing cluster due to: -1. You do not have permission to create a cluster -2. You want to get started quickly with an all-purpose cluster +### Running a Databricks Job Using an Existing Cluster +By default, Databricks creates a new job cluster for each job. However, there are instances where you might prefer to use an existing cluster, such as: - It is [not recommended to use `all-purpose Compute`](https://docs.databricks.com/en/jobs/compute.html#should-all-purpose-compute-ever-be-used-for-jobs) to run job, but it is possible to configure Databricks Job for testing purpose. +1. Lack of permissions to create a new cluster. +2. The need for a quick start with an all-purpose cluster. + +While it is generally [**not recommended** to utilize **all-purpose compute** for running jobs](https://docs.databricks.com/en/jobs/compute.html#should-all-purpose-compute-ever-be-used-for-jobs), it is feasible to configure a Databricks job for testing purposes. + +To begin, you need to determine the `cluster_id`. Navigate to the `Compute` tab and select the `View JSON` option. -First, you need to find what is the `cluster_id`. Click the `Compute` tab, then click the `View Json` options. ![Find cluster ID through UI](../../meta/images/databricks_cluster_id1.png) From 342e179664dbe2bbd166f4d97426432aca83709c Mon Sep 17 00:00:00 2001 From: Nok Lam Chan Date: Thu, 21 Nov 2024 22:01:54 +0800 Subject: [PATCH 15/21] Update docs/source/deployment/databricks/databricks_ide_development_workflow.md Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: Nok Lam Chan --- .../databricks/databricks_ide_development_workflow.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/deployment/databricks/databricks_ide_development_workflow.md b/docs/source/deployment/databricks/databricks_ide_development_workflow.md index ae9f44021c..2fce33be6c 100644 --- a/docs/source/deployment/databricks/databricks_ide_development_workflow.md +++ b/docs/source/deployment/databricks/databricks_ide_development_workflow.md @@ -118,7 +118,7 @@ By default, Databricks creates a new job cluster for each job. However, there ar 1. Lack of permissions to create a new cluster. 2. The need for a quick start with an all-purpose cluster. -While it is generally [**not recommended** to utilize **all-purpose compute** for running jobs](https://docs.databricks.com/en/jobs/compute.html#should-all-purpose-compute-ever-be-used-for-jobs), it is feasible to configure a Databricks job for testing purposes. +While it is generally [**not recommended** to utilise **all-purpose compute** for running jobs](https://docs.databricks.com/en/jobs/compute.html#should-all-purpose-compute-ever-be-used-for-jobs), it is feasible to configure a Databricks job for testing purposes. To begin, you need to determine the `cluster_id`. Navigate to the `Compute` tab and select the `View JSON` option. From 59316687c350221470ba07999fd5d585f7a25bb3 Mon Sep 17 00:00:00 2001 From: Nok Lam Chan Date: Thu, 21 Nov 2024 22:02:03 +0800 Subject: [PATCH 16/21] Update docs/source/deployment/databricks/databricks_ide_development_workflow.md Co-authored-by: Merel Theisen <49397448+merelcht@users.noreply.github.com> Signed-off-by: Nok Lam Chan --- .../databricks/databricks_ide_development_workflow.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/deployment/databricks/databricks_ide_development_workflow.md b/docs/source/deployment/databricks/databricks_ide_development_workflow.md index 2fce33be6c..7aac6fb710 100644 --- a/docs/source/deployment/databricks/databricks_ide_development_workflow.md +++ b/docs/source/deployment/databricks/databricks_ide_development_workflow.md @@ -136,7 +136,7 @@ Next, update `conf/databricks.yml` + existing_cluster_id: 0502-*********** ``` -Then generate the bundle definition again with the `overwrite` options. +Then generate the bundle definition again with the `overwrite` option. ``` kedro databricks bundle --overwrite ``` From cbb8f56251e72516bb6b089045e9f081453f27de Mon Sep 17 00:00:00 2001 From: Nok Date: Tue, 26 Nov 2024 09:01:08 +0000 Subject: [PATCH 17/21] address review comments Signed-off-by: Nok --- ... databricks_ide_databricks_asset_budnels_workflow.md} | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) rename docs/source/deployment/databricks/{databricks_ide_development_workflow.md => databricks_ide_databricks_asset_budnels_workflow.md} (95%) diff --git a/docs/source/deployment/databricks/databricks_ide_development_workflow.md b/docs/source/deployment/databricks/databricks_ide_databricks_asset_budnels_workflow.md similarity index 95% rename from docs/source/deployment/databricks/databricks_ide_development_workflow.md rename to docs/source/deployment/databricks/databricks_ide_databricks_asset_budnels_workflow.md index 7aac6fb710..49cf1575fe 100644 --- a/docs/source/deployment/databricks/databricks_ide_development_workflow.md +++ b/docs/source/deployment/databricks/databricks_ide_databricks_asset_budnels_workflow.md @@ -1,10 +1,10 @@ -# Use Databricks Asset Bundles to deploy a Kedro project +# Use an IDE and Databricks Asset Bundles to deploy a Kedro project ```{note} -The `dbx` package is deprecated by Databricks, and dbx workflow documentation is moved to a [new page](./databricks_dbx_workflow.md). +The `dbx` package was deprecated by Databricks, and dbx workflow documentation is moved to a [new page](./databricks_dbx_workflow.md). ``` -This guide demonstrates a workflow for developing a Kedro Project on Databricks using Databricks Asset Bundles. You will learn how to develop your project using a local environment, then use `kedro-databricks` and Databricks Asset Bundle to package your code for running pipelines on Databricks. To learn more about Databricks Asset Bundles and customization, read [What are Databricks Asset Bundles](https://docs.databricks.com/en/dev-tools/bundles/index.html). +This guide demonstrates a workflow for developing a Kedro Project on Databricks using Databricks Asset Bundles. You will learn how to develop your project using a local environment, then use `kedro-databricks` and Databricks Asset Bundle to package your code for running pipelines on Databricks. To learn more about Databricks Asset Bundles and customisation, read [What are Databricks Asset Bundles](https://docs.databricks.com/en/dev-tools/bundles/index.html). ## Benefits of local development @@ -183,5 +183,4 @@ Copy that URL into your browser or go to the `Jobs Run` UI to see the run status ### Run Databricks Job with Databricks UI Alternatively, you can go to the `Workflow` tab and select the desired job to run directly: -![alt text](../../meta/images/databricks-job-run.png) -``` +![Run deployed Databricks Job with Databricks UI](../../meta/images/databricks-job-run.png) From 053d3218598dfcb5264d4430d48a11b46e669743 Mon Sep 17 00:00:00 2001 From: Nok Date: Tue, 26 Nov 2024 09:09:40 +0000 Subject: [PATCH 18/21] rename Signed-off-by: Nok --- ...low.md => databricks_ide_databricks_asset_bundles_workflow.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/source/deployment/databricks/{databricks_ide_databricks_asset_budnels_workflow.md => databricks_ide_databricks_asset_bundles_workflow.md} (100%) diff --git a/docs/source/deployment/databricks/databricks_ide_databricks_asset_budnels_workflow.md b/docs/source/deployment/databricks/databricks_ide_databricks_asset_bundles_workflow.md similarity index 100% rename from docs/source/deployment/databricks/databricks_ide_databricks_asset_budnels_workflow.md rename to docs/source/deployment/databricks/databricks_ide_databricks_asset_bundles_workflow.md From 58c1ef36b730e53a574b83e71d7cffe46230c74d Mon Sep 17 00:00:00 2001 From: Nok Date: Tue, 26 Nov 2024 09:14:26 +0000 Subject: [PATCH 19/21] fic index Signed-off-by: Nok --- docs/source/deployment/databricks/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/deployment/databricks/index.md b/docs/source/deployment/databricks/index.md index 2b969340a9..62b03b6d92 100644 --- a/docs/source/deployment/databricks/index.md +++ b/docs/source/deployment/databricks/index.md @@ -45,7 +45,7 @@ Remember, the best choice of workflow is the one that aligns best with your proj :maxdepth: 1 databricks_notebooks_development_workflow.md -databricks_ide_development_workflow.md +databricks_ide_databricks_asset_bundles_workflow.md databricks_deployment_workflow databricks_visualisation databricks_dbx_workflow.md From e24d8eb385e7686ee00ad07349ef3cab00edac39 Mon Sep 17 00:00:00 2001 From: Nok Date: Tue, 26 Nov 2024 09:18:18 +0000 Subject: [PATCH 20/21] fix reference Signed-off-by: Nok --- Makefile | 2 +- docs/source/deployment/databricks/databricks_dbx_workflow.md | 2 +- .../deployment/databricks/databricks_deployment_workflow.md | 2 +- .../databricks/databricks_notebooks_development_workflow.md | 2 +- docs/source/deployment/databricks/index.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 8095b52cc2..ccc8b5a63e 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,7 @@ secret-scan: trufflehog --max_depth 1 --exclude_paths trufflehog-ignore.txt . build-docs: - uv pip install --system -e ".[docs]" + uv pip install -e ".[docs]" ./docs/build-docs.sh "docs" show-docs: diff --git a/docs/source/deployment/databricks/databricks_dbx_workflow.md b/docs/source/deployment/databricks/databricks_dbx_workflow.md index d0ec220be3..d3d1c9c725 100644 --- a/docs/source/deployment/databricks/databricks_dbx_workflow.md +++ b/docs/source/deployment/databricks/databricks_dbx_workflow.md @@ -1,7 +1,7 @@ # Use an IDE, dbx and Databricks Repos to develop a Kedro project ```{warning} -`dbx` is deprecated in 2023, the recommended workflow now is to use [Databricks Asset Bundles](./databricks_ide_development_workflow.md) +`dbx` is deprecated in 2023, the recommended workflow now is to use [Databricks Asset Bundles](./databricks_ide_databricks_asset_bundles_workflow.md) ``` This guide demonstrates a workflow for developing Kedro projects on Databricks using your local environment for development, then using dbx and Databricks Repos to sync code for testing on Databricks. diff --git a/docs/source/deployment/databricks/databricks_deployment_workflow.md b/docs/source/deployment/databricks/databricks_deployment_workflow.md index 4cc4b2c57b..2ebe21c48e 100644 --- a/docs/source/deployment/databricks/databricks_deployment_workflow.md +++ b/docs/source/deployment/databricks/databricks_deployment_workflow.md @@ -15,7 +15,7 @@ Here are some typical use cases for running a packaged Kedro project as a Databr Running your packaged project as a Databricks job is very different from running it from a Databricks notebook. The Databricks job cluster has to be provisioned and started for each run, which is significantly slower than running it as a notebook on a cluster that has already been started. In addition, there is no way to change your project's code once it has been packaged. Instead, you must change your code, create a new package, and then upload it to Databricks again. -For those reasons, the packaging approach is unsuitable for development projects where rapid iteration is necessary. For guidance on developing a Kedro project for Databricks in a rapid build-test loop, see the [development workflow guide](./databricks_ide_development_workflow.md). +For those reasons, the packaging approach is unsuitable for development projects where rapid iteration is necessary. For guidance on developing a Kedro project for Databricks in a rapid build-test loop, see the [development workflow guide](./databricks_ide_databricks_asset_bundles_workflow.md). ## What this page covers diff --git a/docs/source/deployment/databricks/databricks_notebooks_development_workflow.md b/docs/source/deployment/databricks/databricks_notebooks_development_workflow.md index 8a0616708b..646ce0d034 100644 --- a/docs/source/deployment/databricks/databricks_notebooks_development_workflow.md +++ b/docs/source/deployment/databricks/databricks_notebooks_development_workflow.md @@ -2,7 +2,7 @@ This guide demonstrates a workflow for developing Kedro projects on Databricks using only a Databricks Repo and a Databricks notebook. You will learn how to develop and test your Kedro projects entirely within the Databricks workspace. -This method of developing a Kedro project for use on Databricks is ideal for developers who prefer developing their projects in notebooks rather than an in an IDE. It also avoids the overhead of setting up and syncing a local environment with Databricks. If you want to take advantage of the powerful features of an IDE to develop your project, consider following the [guide for developing a Kedro project for Databricks using your local environment](./databricks_ide_development_workflow.md). +This method of developing a Kedro project for use on Databricks is ideal for developers who prefer developing their projects in notebooks rather than an in an IDE. It also avoids the overhead of setting up and syncing a local environment with Databricks. If you want to take advantage of the powerful features of an IDE to develop your project, consider following the [guide for developing a Kedro project for Databricks using your local environment](./databricks_ide_databricks_asset_bundles_workflow.md). In this guide, you will store your project's code in a repository on [GitHub](https://github.com/). Databricks integrates with many [Git providers](https://docs.databricks.com/repos/index.html#supported-git-providers), including GitLab and Azure DevOps. The steps to create a Git repository and sync it with Databricks also generally apply to these Git providers, though the exact details may vary. diff --git a/docs/source/deployment/databricks/index.md b/docs/source/deployment/databricks/index.md index 62b03b6d92..762d399c0a 100644 --- a/docs/source/deployment/databricks/index.md +++ b/docs/source/deployment/databricks/index.md @@ -12,7 +12,7 @@ To avoid the overhead of setting up and syncing a local development environment **I want a hybrid workflow model combining local IDE with Databricks** -The workflow documented in ["Use Databricks Asset Bundles to deploy a Kedro project"](./databricks_ide_development_workflow.md) is for those that prefer to work in a local IDE. +The workflow documented in ["Use Databricks Asset Bundles to deploy a Kedro project"](./databricks_ide_databricks_asset_bundles_workflow.md) is for those that prefer to work in a local IDE. If you're in the early stages of learning Kedro, or your project requires constant testing and adjustments, choose this workflow. You can use your IDE's capabilities for faster, error-free development, while testing on Databricks. Later you can make the transition into a production deployment with this approach, although you may prefer to switch to use [job-based deployment](./databricks_deployment_workflow.md) and fully optimise your workflow for production. From d751c79de9248e1be470c993ded5cdbe243642fa Mon Sep 17 00:00:00 2001 From: Nok Date: Tue, 26 Nov 2024 09:27:10 +0000 Subject: [PATCH 21/21] update release noteS Signed-off-by: Nok --- RELEASE.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index 26be20d106..9475b07f46 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -14,10 +14,11 @@ ## Breaking changes to the API ## Documentation changes -* Updated CLI autocompletion docs with new Click syntax. -* Standardised `.parquet` suffix in docs and tests. +* Added Databricks Asset Bundles deployment guide. * Added a new minimal Kedro project creation guide. * Added example to explain how dataset factories work. +* Updated CLI autocompletion docs with new Click syntax. +* Standardised `.parquet` suffix in docs and tests. ## Community contributions * [Hyewon Choi](https://github.com/hyew0nChoi)