From 1e8515baf6fa1eaeadc905989c2c62aa0eb63a20 Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 11 Dec 2024 05:45:56 -0300 Subject: [PATCH 01/15] fix --- .github/workflows/onpush.yml | 4 +++ Makefile | 3 ++ Pipfile | 3 +- README.md | 10 ++---- conf/wf_template.yml | 36 ++++++++++++++------- conf/workflow.yml | 40 +++++++++++++++-------- docs/ci_cd.drawio | 61 +++++++++++++++++++++++++++++++++++ docs/ci_cd.png | Bin 0 -> 39086 bytes 8 files changed, 123 insertions(+), 34 deletions(-) create mode 100755 docs/ci_cd.drawio create mode 100755 docs/ci_cd.png diff --git a/.github/workflows/onpush.yml b/.github/workflows/onpush.yml index d164e4c..e307aab 100644 --- a/.github/workflows/onpush.yml +++ b/.github/workflows/onpush.yml @@ -37,6 +37,10 @@ jobs: run: | make deploy-dev + - name: Run job + run: | + make run-dev + - name: Run run: | make deploy-ci diff --git a/Makefile b/Makefile index 5e2f60c..7e037b3 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,9 @@ install: + python3 -m pip install --upgrade pip + pip install pipenv pipenv install packages pipenv run pytest tests/ + pipenv run pip list pipenv shell pre-commit: diff --git a/Pipfile b/Pipfile index f3a4ed0..f373f0d 100644 --- a/Pipfile +++ b/Pipfile @@ -5,12 +5,10 @@ name = "pypi" [packages] funcy = "==2.0" -packages = "*" numpy = "==1.23.5" pandas = "==1.5.3" pyarrow = "8.0.0" pydantic = "==2.7.4" -unidecode = "==1.3.8" wheel = "==0.44.0" coverage = "==7.6.1" setuptools = "==72.1.0" @@ -19,6 +17,7 @@ pytest = "==8.3.2" jinja2 = "==3.1.4" pyspark = "==3.5.1" pytest-cov = "==5.0.0" +packages = "*" [dev-packages] diff --git a/README.md b/README.md index 40b7168..04b347c 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,12 @@ This project template demonstrates how to: - utilize [pytest package](https://pypi.org/project/pytest/) to run unit tests on transformations. - utilize [argparse package](https://pypi.org/project/argparse/) to build a flexible command line interface to start your jobs. - utilize [funcy package](https://pypi.org/project/funcy/) to log the execution time of each transformation. -- utilize [Databricks CLI](https://docs.databricks.com/en/dev-tools/cli/index.html) and (the new!!!) [Databricks Asset Bundles](https://docs.databricks.com/en/dev-tools/bundles/index.html) to package/deploy/run a Python wheel package on Databricks. +- utilize [Databricks CLI](https://docs.databricks.com/en/dev-tools/cli/index.html) and [Databricks Asset Bundles](https://docs.databricks.com/en/dev-tools/bundles/index.html) to package/deploy/run a Python wheel package on Databricks. - utilize [Databricks SDK for Python](https://docs.databricks.com/en/dev-tools/sdk-python.html) to manage workspaces and accounts. This script enables your metastore system tables that have [relevant data about billing, usage, lineage, prices, and access](https://www.youtube.com/watch?v=LcRWHzk8Wm4). - utilize [Databricks Unity Catalog](https://www.databricks.com/product/unity-catalog) instead of Hive as your data catalog and earn for free data lineage for your tables and columns and a simplified permission model for your data. - utilize [Databricks Workflows](https://docs.databricks.com/en/workflows/index.html) to execute a DAG and [task parameters](https://docs.databricks.com/en/workflows/jobs/parameter-value-references.html) to share context information between tasks (see [Task Parameters section](#task-parameters)). Yes, you don't need Airflow to manage your DAGs here!!! - utilize [Databricks job clusters](https://docs.databricks.com/en/workflows/jobs/use-compute.html#use-databricks-compute-with-your-jobs) to reduce costs. +- define clusters on AWS and Azure. - execute a CI/CD pipeline with [Github Actions](https://docs.github.com/en/actions) after a repo push. For a debate about the use of notebooks x Python packages, please refer to: @@ -98,13 +99,6 @@ Update "job_clusters" properties on wf_template.yml file. There are different pr Configure [Github Actions repository secrets](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions) DATABRICKS_HOST and DATABRICKS_TOKEN. -### 5) enable system tables on Catalog Explorer - - python sdk_system_tables.py - - -... and now you can code the transformations for each task and run unit and integration tests. - # Task parameters diff --git a/conf/wf_template.yml b/conf/wf_template.yml index 27bee7c..f90be8d 100644 --- a/conf/wf_template.yml +++ b/conf/wf_template.yml @@ -17,7 +17,7 @@ resources: tasks: - task_key: extract_source1 - job_cluster_key: cluster-dev + job_cluster_key: cluster-dev-aws max_retries: 0 python_wheel_task: package_name: template @@ -29,7 +29,7 @@ resources: - whl: ../dist/*.whl - task_key: extract_source2 - job_cluster_key: cluster-dev + job_cluster_key: cluster-dev-aws max_retries: 0 python_wheel_task: package_name: template @@ -44,7 +44,7 @@ resources: depends_on: - task_key: extract_source1 - task_key: extract_source2 - job_cluster_key: cluster-dev + job_cluster_key: cluster-dev-aws max_retries: 0 python_wheel_task: package_name: template @@ -58,7 +58,7 @@ resources: - task_key: generate_orders_agg depends_on: - task_key: generate_orders - job_cluster_key: cluster-dev + job_cluster_key: cluster-dev-aws max_retries: 0 python_wheel_task: package_name: template @@ -70,12 +70,26 @@ resources: - whl: ../dist/*.whl job_clusters: - - job_cluster_key: cluster-dev + # - job_cluster_key: cluster-dev-azure + # new_cluster: + # spark_version: 15.3.x-scala2.12 + # node_type_id: Standard_D8as_v5 + # num_workers: 1 + # azure_attributes: + # first_on_demand: 1 + # availability: SPOT_AZURE + # data_security_mode: SINGLE_USER + + - job_cluster_key: cluster-dev-aws new_cluster: - spark_version: 15.3.x-scala2.12 - node_type_id: Standard_D8as_v5 - num_workers: 2 - azure_attributes: + spark_version: 14.2.x-scala2.12 + node_type_id: c5d.xlarge + num_workers: 1 + aws_attributes: first_on_demand: 1 - availability: SPOT_AZURE - data_security_mode: SINGLE_USER + availability: SPOT_WITH_FALLBACK + zone_id: auto + spot_bid_price_percent: 100 + ebs_volume_count: 0 + policy_id: 001934F3ABD02D4A + data_security_mode: SINGLE_USER diff --git a/conf/workflow.yml b/conf/workflow.yml index abeffca..50f913b 100644 --- a/conf/workflow.yml +++ b/conf/workflow.yml @@ -3,15 +3,15 @@ resources: jobs: default_python_job: - name: data_reporting_${bundle.target} + name: template_${bundle.target} timeout_seconds: 3600 - + tasks: - task_key: extract_source1 - job_cluster_key: cluster-dev + job_cluster_key: cluster-dev-aws max_retries: 0 python_wheel_task: package_name: template @@ -23,7 +23,7 @@ resources: - whl: ../dist/*.whl - task_key: extract_source2 - job_cluster_key: cluster-dev + job_cluster_key: cluster-dev-aws max_retries: 0 python_wheel_task: package_name: template @@ -38,7 +38,7 @@ resources: depends_on: - task_key: extract_source1 - task_key: extract_source2 - job_cluster_key: cluster-dev + job_cluster_key: cluster-dev-aws max_retries: 0 python_wheel_task: package_name: template @@ -52,7 +52,7 @@ resources: - task_key: generate_orders_agg depends_on: - task_key: generate_orders - job_cluster_key: cluster-dev + job_cluster_key: cluster-dev-aws max_retries: 0 python_wheel_task: package_name: template @@ -64,12 +64,26 @@ resources: - whl: ../dist/*.whl job_clusters: - - job_cluster_key: cluster-dev + # - job_cluster_key: cluster-dev-azure + # new_cluster: + # spark_version: 15.3.x-scala2.12 + # node_type_id: Standard_D8as_v5 + # num_workers: 1 + # azure_attributes: + # first_on_demand: 1 + # availability: SPOT_AZURE + # data_security_mode: SINGLE_USER + + - job_cluster_key: cluster-dev-aws new_cluster: - spark_version: 15.3.x-scala2.12 - node_type_id: Standard_D8as_v5 - num_workers: 2 - azure_attributes: + spark_version: 14.2.x-scala2.12 + node_type_id: c5d.xlarge + num_workers: 1 + aws_attributes: first_on_demand: 1 - availability: SPOT_AZURE - data_security_mode: SINGLE_USER + availability: SPOT_WITH_FALLBACK + zone_id: auto + spot_bid_price_percent: 100 + ebs_volume_count: 0 + policy_id: 001934F3ABD02D4A + data_security_mode: SINGLE_USER \ No newline at end of file diff --git a/docs/ci_cd.drawio b/docs/ci_cd.drawio new file mode 100755 index 0000000..a52b806 --- /dev/null +++ b/docs/ci_cd.drawio @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ci_cd.png b/docs/ci_cd.png new file mode 100755 index 0000000000000000000000000000000000000000..2dc7c895fce588b0f5605ad186894b5c6f30ca51 GIT binary patch literal 39086 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 literal 0 HcmV?d00001 From cb11592a5f1ac96d12efa3fa44f96687b2765848 Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 11 Dec 2024 05:52:30 -0300 Subject: [PATCH 02/15] fix --- .github/workflows/onpush.yml | 8 ++++---- Makefile | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/onpush.yml b/.github/workflows/onpush.yml index e307aab..7dde7dc 100644 --- a/.github/workflows/onpush.yml +++ b/.github/workflows/onpush.yml @@ -33,14 +33,14 @@ jobs: pipenv run curl -fsSL https://raw.githubusercontent.com/databricks/setup-cli/main/install.sh | sh pipenv run databricks --version - - name: Package and Deployment + - name: Deploy on dev run: | make deploy-dev - - name: Run job + - name: Run dev run: | make run-dev - - name: Run + - name: Deploy on prod run: | - make deploy-ci + make deploy-prod diff --git a/Makefile b/Makefile index 7e037b3..51ed03e 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,6 @@ install: pipenv install packages pipenv run pytest tests/ pipenv run pip list - pipenv shell pre-commit: pre-commit autoupdate @@ -18,5 +17,5 @@ run-dev: databricks bundle run default_python_job --target dev deploy-ci: - pipenv run python ./scripts/generate_template_workflow.py ci - pipenv run databricks bundle deploy --target ci + pipenv run python ./scripts/generate_template_workflow.py prod + pipenv run databricks bundle deploy --target prod From 519600d42d490fcec43b26b612b552079092c5fc Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 11 Dec 2024 07:03:33 -0300 Subject: [PATCH 03/15] fix --- .github/workflows/onpush.yml | 2 +- Makefile | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/onpush.yml b/.github/workflows/onpush.yml index 7dde7dc..e1b5436 100644 --- a/.github/workflows/onpush.yml +++ b/.github/workflows/onpush.yml @@ -26,7 +26,7 @@ jobs: - name: Install dependencies run: | - make install + make install-ci - name: Install Databricks CLI run: | diff --git a/Makefile b/Makefile index 51ed03e..92fd556 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,14 @@ install: pipenv install packages pipenv run pytest tests/ pipenv run pip list + pipenv shell + +install-ci: + python3 -m pip install --upgrade pip + pip install pipenv + pip install packages + pytest tests/ + pip list pre-commit: pre-commit autoupdate From ca21ca6f80b5acdf6e32af622e2fbf7f39ae38d3 Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 11 Dec 2024 07:09:10 -0300 Subject: [PATCH 04/15] fix --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 92fd556..d9eb02a 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ install: install-ci: python3 -m pip install --upgrade pip pip install pipenv - pip install packages + pipenv install pytest tests/ pip list From a14a7f9a44dd9b4f95c6bb3530a52a9272be2590 Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 11 Dec 2024 07:22:57 -0300 Subject: [PATCH 05/15] fix --- .github/workflows/onpush.yml | 8 ++++---- Makefile | 18 +++++------------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/.github/workflows/onpush.yml b/.github/workflows/onpush.yml index e1b5436..247c744 100644 --- a/.github/workflows/onpush.yml +++ b/.github/workflows/onpush.yml @@ -33,13 +33,13 @@ jobs: pipenv run curl -fsSL https://raw.githubusercontent.com/databricks/setup-cli/main/install.sh | sh pipenv run databricks --version - - name: Deploy on dev + - name: Deploy on ci run: | - make deploy-dev + make deploy-ci - - name: Run dev + - name: Run ci run: | - make run-dev + make run-ci - name: Deploy on prod run: | diff --git a/Makefile b/Makefile index d9eb02a..b3d5428 100644 --- a/Makefile +++ b/Makefile @@ -4,14 +4,6 @@ install: pipenv install packages pipenv run pytest tests/ pipenv run pip list - pipenv shell - -install-ci: - python3 -m pip install --upgrade pip - pip install pipenv - pipenv install - pytest tests/ - pip list pre-commit: pre-commit autoupdate @@ -19,11 +11,11 @@ pre-commit: deploy-dev: python ./scripts/generate_template_workflow.py dev - databricks bundle deploy --target dev - -run-dev: databricks bundle run default_python_job --target dev -deploy-ci: - pipenv run python ./scripts/generate_template_workflow.py prod +deploy-run-ci: + pipenv run python ./scripts/generate_template_workflow.py stag + pipenv run databricks bundle deploy --target stag + +deploy-prod: pipenv run databricks bundle deploy --target prod From 2d2cb2c144cf2522e4874e495270b323a99ae5c9 Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 11 Dec 2024 07:23:59 -0300 Subject: [PATCH 06/15] fix --- .github/workflows/onpush.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/onpush.yml b/.github/workflows/onpush.yml index 247c744..dcbbb4d 100644 --- a/.github/workflows/onpush.yml +++ b/.github/workflows/onpush.yml @@ -26,7 +26,7 @@ jobs: - name: Install dependencies run: | - make install-ci + make install - name: Install Databricks CLI run: | From 1552c6e924c6c2aab0dec953271449fd0741716e Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 11 Dec 2024 07:39:03 -0300 Subject: [PATCH 07/15] fix --- Makefile | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index b3d5428..03e81c6 100644 --- a/Makefile +++ b/Makefile @@ -11,11 +11,15 @@ pre-commit: deploy-dev: python ./scripts/generate_template_workflow.py dev - databricks bundle run default_python_job --target dev + databricks bundle deploy --target dev -deploy-run-ci: - pipenv run python ./scripts/generate_template_workflow.py stag - pipenv run databricks bundle deploy --target stag +deploy-ci: + pipenv run python ./scripts/generate_template_workflow.py ci + pipenv run databricks bundle deploy --target ci + +run-ci: + pipenv run databricks bundle run --target ci deploy-prod: + pipenv run python ./scripts/generate_template_workflow.py prod pipenv run databricks bundle deploy --target prod From fec866aa448bce876726e57366baa0dd45b1f0cd Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 11 Dec 2024 07:45:26 -0300 Subject: [PATCH 08/15] fix --- .github/workflows/onpush.yml | 8 ++++---- Makefile | 10 +++++----- databricks.yml | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/onpush.yml b/.github/workflows/onpush.yml index dcbbb4d..1287a22 100644 --- a/.github/workflows/onpush.yml +++ b/.github/workflows/onpush.yml @@ -33,13 +33,13 @@ jobs: pipenv run curl -fsSL https://raw.githubusercontent.com/databricks/setup-cli/main/install.sh | sh pipenv run databricks --version - - name: Deploy on ci + - name: Deploy on staging run: | - make deploy-ci + make deploy-staging - - name: Run ci + - name: Run on staging run: | - make run-ci + make run-staging - name: Deploy on prod run: | diff --git a/Makefile b/Makefile index 03e81c6..1e4a0b5 100644 --- a/Makefile +++ b/Makefile @@ -13,12 +13,12 @@ deploy-dev: python ./scripts/generate_template_workflow.py dev databricks bundle deploy --target dev -deploy-ci: - pipenv run python ./scripts/generate_template_workflow.py ci - pipenv run databricks bundle deploy --target ci +deploy-staging: + pipenv run python ./scripts/generate_template_workflow.py staging + pipenv run databricks bundle deploy --target staging -run-ci: - pipenv run databricks bundle run --target ci +run-staging: + pipenv run databricks bundle run --target staging deploy-prod: pipenv run python ./scripts/generate_template_workflow.py prod diff --git a/databricks.yml b/databricks.yml index 9cf2cce..68204ff 100644 --- a/databricks.yml +++ b/databricks.yml @@ -30,10 +30,10 @@ targets: # Optionally, there could be a 'staging' target here. # (See Databricks docs on CI/CD at https://docs.databricks.com/dev-tools/bundles/index.html.) - # - # staging: - # workspace: - # host: https://myworkspace.databricks.com + + staging: + workspace: + profile: dev # The 'prod' target, used for production deployment. prod: From 9bd2ae42df6ce06d91311fc875269f23cc31e8e5 Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 11 Dec 2024 08:07:12 -0300 Subject: [PATCH 09/15] fix --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 1e4a0b5..33a1134 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ deploy-staging: pipenv run databricks bundle deploy --target staging run-staging: - pipenv run databricks bundle run --target staging + pipenv run databricks bundle run default_python_job --target staging deploy-prod: pipenv run python ./scripts/generate_template_workflow.py prod From c01426eb856c591a19f6f557442ea5a66b396a60 Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 11 Dec 2024 08:18:09 -0300 Subject: [PATCH 10/15] fix --- README.md | 15 ++++++++++----- src/template/main.py | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 04b347c..58bb619 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This project template provides a structured approach to enhance your productivit This project template demonstrates how to: - structure your PySpark code inside classes/packages. -- package your code and move it on different environments on a CI/CD pipeline. +- package your code and move it on different environments (dev, staging, prod) on a CI/CD pipeline. - configure your workflow to run in different environments with different configurations with [jinja package](https://pypi.org/project/jinja2/) - use a [medallion architecure](https://www.databricks.com/glossary/medallion-architecture) pattern by improving the data quality as it goes trought more refinement. - use a Make file to automate repetitive tasks on local env. @@ -75,12 +75,17 @@ For a debate about the use of notebooks x Python packages, please refer to: # Instructions -### 1) install and configure Databricks CLI +### 1) (optional) create a Databricks Workspace with Terraform + +Follow instructions [here](https://github.com/databricks/terraform-databricks-examples) + + +### 2) install and configure Databricks CLI on your local machine Follow instructions [here](https://docs.databricks.com/en/dev-tools/cli/install.html) -### 2) build python env and execute unit tests +### 3) build python env and execute unit tests on your local machine make install @@ -88,14 +93,14 @@ You can also execute unit tests from your preferred IDE. Here's a screenshot fro -### 3) deploy and execute on dev and prod workspaces. +### 4) deploy and execute on dev workspace. Update "job_clusters" properties on wf_template.yml file. There are different properties for AWS and Azure. make deploy-dev -### 4) configure CI/CD automation +### 5) configure CI/CD automation Configure [Github Actions repository secrets](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions) DATABRICKS_HOST and DATABRICKS_TOKEN. diff --git a/src/template/main.py b/src/template/main.py index 7e3a86c..552ab56 100644 --- a/src/template/main.py +++ b/src/template/main.py @@ -10,7 +10,7 @@ def arg_parser(): parser = argparse.ArgumentParser() - parser.add_argument("--env", required=True, choices=["dev", "ci", "prod"]) + parser.add_argument("--env", required=True, choices=["dev", "staging", "prod"]) parser.add_argument("--default_schema") parser.add_argument( "--task", From ebff86e471c31bb5b9fdc48b48e366a7c705ce27 Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 11 Dec 2024 08:30:22 -0300 Subject: [PATCH 11/15] fix --- databricks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/databricks.yml b/databricks.yml index 68204ff..09b6065 100644 --- a/databricks.yml +++ b/databricks.yml @@ -49,4 +49,4 @@ targets: # This runs as username@company.com in production. Alternatively, # a service principal could be used here using service_principal_name # (see Databricks documentation). - user_name: username@company.com + user_name: user.two@domain.com From 385e1659c8f374f1d3f4bb5b7a6ef98d84cee8ad Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 11 Dec 2024 08:46:22 -0300 Subject: [PATCH 12/15] fix --- .github/workflows/onpush.yml | 12 ++++++------ databricks.yml | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/onpush.yml b/.github/workflows/onpush.yml index 1287a22..090ee93 100644 --- a/.github/workflows/onpush.yml +++ b/.github/workflows/onpush.yml @@ -33,13 +33,13 @@ jobs: pipenv run curl -fsSL https://raw.githubusercontent.com/databricks/setup-cli/main/install.sh | sh pipenv run databricks --version - - name: Deploy on staging - run: | - make deploy-staging + # - name: Deploy on staging + # run: | + # make deploy-staging - - name: Run on staging - run: | - make run-staging + # - name: Run on staging + # run: | + # make run-staging - name: Deploy on prod run: | diff --git a/databricks.yml b/databricks.yml index 09b6065..b98bf1f 100644 --- a/databricks.yml +++ b/databricks.yml @@ -45,8 +45,8 @@ targets: workspace: profile: prod root_path: /Shared/.bundle/prod/${bundle.name} - run_as: - # This runs as username@company.com in production. Alternatively, - # a service principal could be used here using service_principal_name - # (see Databricks documentation). - user_name: user.two@domain.com + # run_as: + # # This runs as username@company.com in production. Alternatively, + # # a service principal could be used here using service_principal_name + # # (see Databricks documentation). + # user_name: user.two@domain.com From c65ce5971ff78b7ef15498b34c1f870e36994d48 Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 11 Dec 2024 08:50:25 -0300 Subject: [PATCH 13/15] fix --- databricks.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/databricks.yml b/databricks.yml index b98bf1f..09b6065 100644 --- a/databricks.yml +++ b/databricks.yml @@ -45,8 +45,8 @@ targets: workspace: profile: prod root_path: /Shared/.bundle/prod/${bundle.name} - # run_as: - # # This runs as username@company.com in production. Alternatively, - # # a service principal could be used here using service_principal_name - # # (see Databricks documentation). - # user_name: user.two@domain.com + run_as: + # This runs as username@company.com in production. Alternatively, + # a service principal could be used here using service_principal_name + # (see Databricks documentation). + user_name: user.two@domain.com From 58b21111e93472696be375486fe1cfe1f87c1ece Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 11 Dec 2024 09:13:03 -0300 Subject: [PATCH 14/15] fix --- .github/workflows/onpush.yml | 12 ++--- README.md | 2 +- conf/workflow.yml | 89 ----------------------------------- databricks.yml | 2 + docs/ci_cd.drawio | 80 +++++++++++++++++++------------ docs/ci_cd.png | Bin 39086 -> 41393 bytes src/template/config.ini | 2 +- src/template/config.py | 2 +- 8 files changed, 60 insertions(+), 129 deletions(-) delete mode 100644 conf/workflow.yml mode change 100755 => 100644 docs/ci_cd.png diff --git a/.github/workflows/onpush.yml b/.github/workflows/onpush.yml index 090ee93..1287a22 100644 --- a/.github/workflows/onpush.yml +++ b/.github/workflows/onpush.yml @@ -33,13 +33,13 @@ jobs: pipenv run curl -fsSL https://raw.githubusercontent.com/databricks/setup-cli/main/install.sh | sh pipenv run databricks --version - # - name: Deploy on staging - # run: | - # make deploy-staging + - name: Deploy on staging + run: | + make deploy-staging - # - name: Run on staging - # run: | - # make run-staging + - name: Run on staging + run: | + make run-staging - name: Deploy on prod run: | diff --git a/README.md b/README.md index 58bb619..90f49e7 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# Project Template for Spark/Databricks with Python packaging and CI/CD automation +# Databricks template project with Asset Bundles, Python packaging and CI/CD automation This project template provides a structured approach to enhance your productivity when delivering ETL pipelines on Databricks. Feel free to customize it based on your project's specific nuances and the audience you are targeting. diff --git a/conf/workflow.yml b/conf/workflow.yml deleted file mode 100644 index 50f913b..0000000 --- a/conf/workflow.yml +++ /dev/null @@ -1,89 +0,0 @@ -# The main job for default_python -resources: - jobs: - - default_python_job: - name: template_${bundle.target} - timeout_seconds: 3600 - - - - tasks: - - - task_key: extract_source1 - job_cluster_key: cluster-dev-aws - max_retries: 0 - python_wheel_task: - package_name: template - entry_point: main - parameters: ["--task={{task.name}}", - "--env=${bundle.target}", - "${var.debug}"] - libraries: - - whl: ../dist/*.whl - - - task_key: extract_source2 - job_cluster_key: cluster-dev-aws - max_retries: 0 - python_wheel_task: - package_name: template - entry_point: main - parameters: ["--task={{task.name}}", - "--env=${bundle.target}", - "${var.debug}"] - libraries: - - whl: ../dist/*.whl - - - task_key: generate_orders - depends_on: - - task_key: extract_source1 - - task_key: extract_source2 - job_cluster_key: cluster-dev-aws - max_retries: 0 - python_wheel_task: - package_name: template - entry_point: main - parameters: ["--task={{task.name}}", - "--env=${bundle.target}", - "${var.debug}"] - libraries: - - whl: ../dist/*.whl - - - task_key: generate_orders_agg - depends_on: - - task_key: generate_orders - job_cluster_key: cluster-dev-aws - max_retries: 0 - python_wheel_task: - package_name: template - entry_point: main - parameters: ["--task={{task.name}}", - "--env=${bundle.target}", - "${var.debug}"] - libraries: - - whl: ../dist/*.whl - - job_clusters: - # - job_cluster_key: cluster-dev-azure - # new_cluster: - # spark_version: 15.3.x-scala2.12 - # node_type_id: Standard_D8as_v5 - # num_workers: 1 - # azure_attributes: - # first_on_demand: 1 - # availability: SPOT_AZURE - # data_security_mode: SINGLE_USER - - - job_cluster_key: cluster-dev-aws - new_cluster: - spark_version: 14.2.x-scala2.12 - node_type_id: c5d.xlarge - num_workers: 1 - aws_attributes: - first_on_demand: 1 - availability: SPOT_WITH_FALLBACK - zone_id: auto - spot_bid_price_percent: 100 - ebs_volume_count: 0 - policy_id: 001934F3ABD02D4A - data_security_mode: SINGLE_USER \ No newline at end of file diff --git a/databricks.yml b/databricks.yml index 09b6065..0a90078 100644 --- a/databricks.yml +++ b/databricks.yml @@ -27,6 +27,8 @@ targets: default: true workspace: profile: dev + run_as: + user_name: user.two@domain.com # Optionally, there could be a 'staging' target here. # (See Databricks docs on CI/CD at https://docs.databricks.com/dev-tools/bundles/index.html.) diff --git a/docs/ci_cd.drawio b/docs/ci_cd.drawio index a52b806..e029a49 100755 --- a/docs/ci_cd.drawio +++ b/docs/ci_cd.drawio @@ -1,59 +1,77 @@ - + - - + + - - + + - - + + - - + + - - + + - + - - + + - + - - + + - + - - + + - - + + - - + + - - + + - + - - + + - - + + + + + + + + + + + + + + + + + + + + diff --git a/docs/ci_cd.png b/docs/ci_cd.png old mode 100755 new mode 100644 index 2dc7c895fce588b0f5605ad186894b5c6f30ca51..57b9956c37c435b0ab7df4710ffbe0ec68ca961e GIT binary patch literal 41393 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 diff --git a/src/template/config.ini b/src/template/config.ini index c7883cd..2eb90df 100644 --- a/src/template/config.ini +++ b/src/template/config.ini @@ -1,4 +1,4 @@ -[andre.f.salvati@gmail.com] +[user.two@domain.com] extract_source1 = true extract_source2 = true generate_orders = true diff --git a/src/template/config.py b/src/template/config.py index 75f1c5b..e20cce4 100644 --- a/src/template/config.py +++ b/src/template/config.py @@ -75,7 +75,7 @@ def skip_task(self): ): print("Skipped with config file for 'dev' and 'ci' envs.") return True - elif self.params["env"] in ("stag", "prod") and self.in_table_for_skip(self.params["task"]): + elif self.params["env"] in ("staging", "prod") and self.in_table_for_skip(self.params["task"]): print("Skipped with config table for 'prod' env.") return True From a64cabc878c0e69d08d0174567c3883c911678d7 Mon Sep 17 00:00:00 2001 From: Andre Date: Wed, 11 Dec 2024 09:24:53 -0300 Subject: [PATCH 15/15] fix --- .github/workflows/onpush.yml | 2 +- README.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/onpush.yml b/.github/workflows/onpush.yml index 1287a22..9c30a0c 100644 --- a/.github/workflows/onpush.yml +++ b/.github/workflows/onpush.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest strategy: - max-parallel: 4 + max-parallel: 1 env: DATABRICKS_HOST: ${{ secrets.DATABRICKS_HOST }} diff --git a/README.md b/README.md index 90f49e7..2ff862c 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ This project template demonstrates how to: - structure your PySpark code inside classes/packages. - package your code and move it on different environments (dev, staging, prod) on a CI/CD pipeline. - configure your workflow to run in different environments with different configurations with [jinja package](https://pypi.org/project/jinja2/) +- configure your workflow to selectively run tasks, preventing collisions and interference between developers working in parallel. - use a [medallion architecure](https://www.databricks.com/glossary/medallion-architecture) pattern by improving the data quality as it goes trought more refinement. - use a Make file to automate repetitive tasks on local env. - lint and format the code with [ruff](https://docs.astral.sh/ruff/) and [pre-commit](https://pre-commit.com/).