{
"cells": [
{
"cell_type": "markdown",
"id": "b387c4cd",
"metadata": {},
"source": [
"# distrdf002_dask_connection\n",
"Configure a Dask connection and fill two histograms distributedly.\n",
"\n",
"This tutorial shows the ingredients needed to setup the connection to a Dask\n",
"cluster (e.g. a `LocalCluster` for a single machine). After this initial\n",
"setup, an RDataFrame with distributed capabilities is created and connected\n",
"to a Dask `Client` instance. Finally, a couple of histograms are drawn from\n",
"the created columns in the dataset. Relevant documentation can be found at\n",
"http://distributed.dask.org/en/stable .\n",
"\n",
"\n",
"\n",
"\n",
"**Author:** Vincenzo Eduardo Padulano \n",
"This notebook tutorial was automatically generated with ROOTBOOK-izer from the macro found in the ROOT repository on Tuesday, March 19, 2024 at 07:07 PM."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "8731549a",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:07:50.687545Z",
"iopub.status.busy": "2024-03-19T19:07:50.687166Z",
"iopub.status.idle": "2024-03-19T19:07:55.146602Z",
"shell.execute_reply": "2024-03-19T19:07:55.122834Z"
}
},
"outputs": [],
"source": [
"from dask.distributed import LocalCluster, Client\n",
"import ROOT"
]
},
{
"cell_type": "markdown",
"id": "dfe2ea76",
"metadata": {},
"source": [
"Point RDataFrame calls to Dask RDataFrame object"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "8130c7ec",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:07:55.163966Z",
"iopub.status.busy": "2024-03-19T19:07:55.163341Z",
"iopub.status.idle": "2024-03-19T19:07:55.612713Z",
"shell.execute_reply": "2024-03-19T19:07:55.603776Z"
}
},
"outputs": [],
"source": [
"RDataFrame = ROOT.RDF.Experimental.Distributed.Dask.RDataFrame\n",
"\n",
"\n",
"def create_connection():\n",
" \"\"\"\n",
" Setup connection to a Dask cluster. Two ingredients are needed:\n",
" 1. Creating a cluster object that represents computing resources. This can be\n",
" done in various ways depending on the type of resources at disposal. To use\n",
" only the local machine (e.g. your laptop), a `LocalCluster` object can be\n",
" used. This step can be skipped if you have access to an existing Dask\n",
" cluster; in that case, the cluster administrator should provide you with a\n",
" URL to connect to the cluster in step 2. More options for cluster creation\n",
" can be found in the Dask docs at\n",
" http://distributed.dask.org/en/stable/api.html#cluster .\n",
" 2. Creating a Dask client object that connects to the cluster. This accepts\n",
" directly the object previously created. In case the cluster was setup\n",
" externally, you need to provide an endpoint URL to the client, e.g.\n",
" 'https://myscheduler.domain:8786'.\n",
"\n",
" Through Dask, you can connect to various types of cluster resources. For\n",
" example, you can connect together a set of machines through SSH and use them\n",
" to run your computations. This is done through the `SSHCluster` class. For\n",
" example:\n",
"\n",
" ```python\n",
" from dask.distributed import SSHCluster\n",
" cluster = SSHCluster(\n",
" # A list with machine host names, the first name will be used as\n",
" # scheduler, following names will become workers.\n",
" hosts=[\"machine1\",\"machine2\",\"machine3\"],\n",
" # A dictionary of options for each worker node, here we set the number\n",
" # of cores to be used on each node.\n",
" worker_options={\"nprocs\":4,},\n",
" )\n",
" ```\n",
"\n",
" Another common usecase is interfacing Dask to a batch system like HTCondor or\n",
" Slurm. A separate package called dask-jobqueue (https://jobqueue.dask.org)\n",
" extends the available Dask cluster classes to enable running Dask computations\n",
" as batch jobs. In this case, the cluster object usually receives the parameters\n",
" that would be written in the job description file. For example:\n",
"\n",
" ```python\n",
" from dask_jobqueue import HTCondorCluster\n",
" cluster = HTCondorCluster(\n",
" cores=1,\n",
" memory='2000MB',\n",
" disk='1000MB',\n",
" )\n",
" # Use the scale method to send as many jobs as needed\n",
" cluster.scale(4)\n",
" ```\n",
"\n",
" In this tutorial, a cluster object is created for the local machine, using\n",
" multiprocessing (processes=True) on 2 workers (n_workers=2) each using only\n",
" 1 core (threads_per_worker=1) and 2GiB of RAM (memory_limit=\"2GiB\").\n",
" \"\"\"\n",
" cluster = LocalCluster(n_workers=2, threads_per_worker=1, processes=True, memory_limit=\"2GiB\")\n",
" client = Client(cluster)\n",
" return client"
]
},
{
"cell_type": "markdown",
"id": "04546ef1",
"metadata": {},
"source": [
"This tutorial uses Python multiprocessing, so the creation of the cluster\n",
"needs to be wrapped in the main clause as described in the Python docs\n",
"https://docs.python.org/3/library/multiprocessing.html"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "e3e1ed38",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:07:55.730990Z",
"iopub.status.busy": "2024-03-19T19:07:55.730543Z",
"iopub.status.idle": "2024-03-19T19:08:19.187757Z",
"shell.execute_reply": "2024-03-19T19:08:19.186539Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.8/dist-packages/distributed/node.py:182: UserWarning: Port 8787 is already in use.\n",
"Perhaps you already have a cluster running?\n",
"Hosting the HTTP server on port 43607 instead\n",
" warnings.warn(\n",
"/usr/local/lib/python3.8/dist-packages/dask_jobqueue/core.py:20: FutureWarning: tmpfile is deprecated and will be removed in a future release. Please use dask.utils.tmpfile instead.\n",
" from distributed.utils import tmpfile\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Saved figure to distrdf002_dask_connection.png\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Info in : png file distrdf002_dask_connection.png has been created\n"
]
}
],
"source": [
"if __name__ == \"__main__\":\n",
"\n",
" # Create the connection to the mock Dask cluster on the local machine\n",
" connection = create_connection()\n",
" # Create an RDataFrame that will use Dask as a backend for computations\n",
" df = RDataFrame(1000, daskclient=connection)\n",
"\n",
" # Set the random seed and define two columns of the dataset with random numbers.\n",
" ROOT.gRandom.SetSeed(1)\n",
" df_1 = df.Define(\"gaus\", \"gRandom->Gaus(10, 1)\").Define(\"exponential\", \"gRandom->Exp(10)\")\n",
"\n",
" # Book an histogram for each column\n",
" h_gaus = df_1.Histo1D((\"gaus\", \"Normal distribution\", 50, 0, 30), \"gaus\")\n",
" h_exp = df_1.Histo1D((\"exponential\", \"Exponential distribution\", 50, 0, 30), \"exponential\")\n",
"\n",
" # Plot the histograms side by side on a canvas\n",
" c = ROOT.TCanvas(\"distrdf002\", \"distrdf002\", 800, 400)\n",
" c.Divide(2, 1)\n",
" c.cd(1)\n",
" h_gaus.DrawCopy()\n",
" c.cd(2)\n",
" h_exp.DrawCopy()\n",
"\n",
" # Save the canvas\n",
" c.SaveAs(\"distrdf002_dask_connection.png\")\n",
" print(\"Saved figure to distrdf002_dask_connection.png\")"
]
},
{
"cell_type": "markdown",
"id": "9c5f6352",
"metadata": {},
"source": [
"Draw all canvases "
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "885a47bb",
"metadata": {
"collapsed": false,
"execution": {
"iopub.execute_input": "2024-03-19T19:08:19.225760Z",
"iopub.status.busy": "2024-03-19T19:08:19.225356Z",
"iopub.status.idle": "2024-03-19T19:08:19.705179Z",
"shell.execute_reply": "2024-03-19T19:08:19.704150Z"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from ROOT import gROOT \n",
"gROOT.GetListOfCanvases().Draw()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"state": {
"12ed079ea2644825937b889812b3d25f": {
"model_module": "@jupyter-widgets/base",
"model_module_version": "2.0.0",
"model_name": "LayoutModel",
"state": {
"_model_module": "@jupyter-widgets/base",
"_model_module_version": "2.0.0",
"_model_name": "LayoutModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/base",
"_view_module_version": "2.0.0",
"_view_name": "LayoutView",
"align_content": null,
"align_items": null,
"align_self": null,
"border_bottom": null,
"border_left": null,
"border_right": null,
"border_top": null,
"bottom": null,
"display": null,
"flex": null,
"flex_flow": null,
"grid_area": null,
"grid_auto_columns": null,
"grid_auto_flow": null,
"grid_auto_rows": null,
"grid_column": null,
"grid_gap": null,
"grid_row": null,
"grid_template_areas": null,
"grid_template_columns": null,
"grid_template_rows": null,
"height": null,
"justify_content": null,
"justify_items": null,
"left": null,
"margin": null,
"max_height": null,
"max_width": null,
"min_height": null,
"min_width": null,
"object_fit": null,
"object_position": null,
"order": null,
"overflow": null,
"padding": null,
"right": null,
"top": null,
"visibility": null,
"width": null
}
},
"8961d4923f9d475ea8f95b2e4bca6c38": {
"model_module": "@jupyter-widgets/controls",
"model_module_version": "2.0.0",
"model_name": "VBoxModel",
"state": {
"_dom_classes": [],
"_model_module": "@jupyter-widgets/controls",
"_model_module_version": "2.0.0",
"_model_name": "VBoxModel",
"_view_count": null,
"_view_module": "@jupyter-widgets/controls",
"_view_module_version": "2.0.0",
"_view_name": "VBoxView",
"box_style": "",
"children": [],
"layout": "IPY_MODEL_12ed079ea2644825937b889812b3d25f",
"tabbable": null,
"tooltip": null
}
}
},
"version_major": 2,
"version_minor": 0
}
}
},
"nbformat": 4,
"nbformat_minor": 5
}