Skip to content

Instantly share code, notes, and snippets.

@rabernat
Created February 6, 2018 21:38
Show Gist options
  • Save rabernat/7fe92f2a41dbfe651493d6864e46031a to your computer and use it in GitHub Desktop.
Save rabernat/7fe92f2a41dbfe651493d6864e46031a to your computer and use it in GitHub Desktop.
sea surface height notebook for pangeo.pydata.org
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import numpy as np\n",
"import xarray as xr\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0.10.0+dev54.g5184365'"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"xr.__version__"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Connect to Dask Distributed Cluster"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "254744ccc57f4a1e8ab7c588601865b8",
"version_major": 2,
"version_minor": 0
},
"text/html": [
"<p>Failed to display Jupyter Widget of type <code>VBox</code>.</p>\n",
"<p>\n",
" If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n",
" that the widgets JavaScript is still loading. If this message persists, it\n",
" likely means that the widgets JavaScript library is either not installed or\n",
" not enabled. See the <a href=\"https://ipywidgets.readthedocs.io/en/stable/user_install.html\">Jupyter\n",
" Widgets Documentation</a> for setup instructions.\n",
"</p>\n",
"<p>\n",
" If you're reading this message in another frontend (for example, a static\n",
" rendering on GitHub or <a href=\"https://nbviewer.jupyter.org/\">NBViewer</a>),\n",
" it may mean that your frontend doesn't currently support widgets.\n",
"</p>\n"
],
"text/plain": [
"VBox(children=(HTML(value='<b>Dashboard:</b> <a href=\"/user/rabernat/proxy/8787/status\" target=\"_blank\">/user/rabernat/proxy/8787/status</a>'), IntText(value=0, description='Requested', layout=Layout(width='150px')), Text(value='0', description='Actual', layout=Layout(width='150px')), Button(description='Scale', layout=Layout(width='150px'), style=ButtonStyle())))"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from dask.distributed import Client, progress\n",
"# HPC\n",
"# client = Client(scheduler_file='/glade/scratch/jhamman/scheduler.json')\n",
"# client\n",
"\n",
"from daskernetes import KubeCluster\n",
"cluster = KubeCluster(n_workers=20)\n",
"cluster"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0.16.1+41.g7f5c6eb9'"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import dask\n",
"dask.__version__"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\u001b[0;31mSignature:\u001b[0m \u001b[0mvisualize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mSource:\u001b[0m \n",
"\u001b[0;32mdef\u001b[0m \u001b[0mvisualize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0;34m\"\"\"\u001b[0m\n",
"\u001b[0;34m Visualize several dask graphs at once.\u001b[0m\n",
"\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m Requires ``graphviz`` to be installed. All options that are not the dask\u001b[0m\n",
"\u001b[0;34m graph(s) should be passed as keyword arguments.\u001b[0m\n",
"\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m Parameters\u001b[0m\n",
"\u001b[0;34m ----------\u001b[0m\n",
"\u001b[0;34m dsk : dict(s) or collection(s)\u001b[0m\n",
"\u001b[0;34m The dask graph(s) to visualize.\u001b[0m\n",
"\u001b[0;34m filename : str or None, optional\u001b[0m\n",
"\u001b[0;34m The name (without an extension) of the file to write to disk. If\u001b[0m\n",
"\u001b[0;34m `filename` is None, no file will be written, and we communicate\u001b[0m\n",
"\u001b[0;34m with dot using only pipes.\u001b[0m\n",
"\u001b[0;34m format : {'png', 'pdf', 'dot', 'svg', 'jpeg', 'jpg'}, optional\u001b[0m\n",
"\u001b[0;34m Format in which to write output file. Default is 'png'.\u001b[0m\n",
"\u001b[0;34m optimize_graph : bool, optional\u001b[0m\n",
"\u001b[0;34m If True, the graph is optimized before rendering. Otherwise,\u001b[0m\n",
"\u001b[0;34m the graph is displayed as is. Default is False.\u001b[0m\n",
"\u001b[0;34m **kwargs\u001b[0m\n",
"\u001b[0;34m Additional keyword arguments to forward to ``to_graphviz``.\u001b[0m\n",
"\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m Returns\u001b[0m\n",
"\u001b[0;34m -------\u001b[0m\n",
"\u001b[0;34m result : IPython.diplay.Image, IPython.display.SVG, or None\u001b[0m\n",
"\u001b[0;34m See dask.dot.dot_graph for more information.\u001b[0m\n",
"\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m See Also\u001b[0m\n",
"\u001b[0;34m --------\u001b[0m\n",
"\u001b[0;34m dask.dot.dot_graph\u001b[0m\n",
"\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m Notes\u001b[0m\n",
"\u001b[0;34m -----\u001b[0m\n",
"\u001b[0;34m For more information on optimization see here:\u001b[0m\n",
"\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m http://dask.pydata.org/en/latest/optimize.html\u001b[0m\n",
"\u001b[0;34m \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mdask\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mdot_graph\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0mfilename\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'filename'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'mydask'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0moptimize_graph\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'optimize_graph'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0mdsks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0marg\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margs\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0marg\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margs\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_dask_collection\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0mdsk\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcollections_to_dsk\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptimize_graph\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0moptimize_graph\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0md\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdsks\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0mdsk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdot_graph\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdsk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfilename\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfilename\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mFile:\u001b[0m /opt/conda/lib/python3.6/site-packages/dask/base.py\n",
"\u001b[0;31mType:\u001b[0m function\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from dask.base import visualize\n",
"visualize??"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'1.20.2+62.g053b4d6f'"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import distributed\n",
"distributed.__version__\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<table style=\"border: 2px solid white;\">\n",
"<tr>\n",
"<td style=\"vertical-align: top; border: 0px solid white\">\n",
"<h3>Client</h3>\n",
"<ul>\n",
" <li><b>Scheduler: </b>tcp://10.20.12.17:36809\n",
" <li><b>Dashboard: </b><a href='http://10.20.12.17:8787/status' target='_blank'>http://10.20.12.17:8787/status</a>\n",
"</ul>\n",
"</td>\n",
"<td style=\"vertical-align: top; border: 0px solid white\">\n",
"<h3>Cluster</h3>\n",
"<ul>\n",
" <li><b>Workers: </b>0</li>\n",
" <li><b>Cores: </b>0</li>\n",
" <li><b>Memory: </b>0 B</li>\n",
"</ul>\n",
"</td>\n",
"</tr>\n",
"</table>"
],
"text/plain": [
"<Client: scheduler='tcp://10.20.12.17:36809' processes=0 cores=0>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"client = Client(cluster)\n",
"client"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [
{
"data": {
"text/plain": [
"<xarray.Dataset>\n",
"Dimensions: (latitude: 720, longitude: 1440, nv: 2, time: 8901)\n",
"Coordinates:\n",
" crs int32 ...\n",
" lat_bnds (time, latitude, nv) float32 dask.array<shape=(8901, 720, 2), chunksize=(5, 720, 2)>\n",
" * latitude (latitude) float32 -89.875 -89.625 -89.375 -89.125 -88.875 ...\n",
" lon_bnds (longitude, nv) float32 dask.array<shape=(1440, 2), chunksize=(1440, 2)>\n",
" * longitude (longitude) float32 0.125 0.375 0.625 0.875 1.125 1.375 1.625 ...\n",
" * nv (nv) int32 0 1\n",
" * time (time) datetime64[ns] 1993-01-01 1993-01-02 1993-01-03 ...\n",
"Data variables:\n",
" adt (time, latitude, longitude) float64 dask.array<shape=(8901, 720, 1440), chunksize=(5, 720, 1440)>\n",
" err (time, latitude, longitude) float64 dask.array<shape=(8901, 720, 1440), chunksize=(5, 720, 1440)>\n",
" sla (time, latitude, longitude) float64 dask.array<shape=(8901, 720, 1440), chunksize=(5, 720, 1440)>\n",
" ugos (time, latitude, longitude) float64 dask.array<shape=(8901, 720, 1440), chunksize=(5, 720, 1440)>\n",
" ugosa (time, latitude, longitude) float64 dask.array<shape=(8901, 720, 1440), chunksize=(5, 720, 1440)>\n",
" vgos (time, latitude, longitude) float64 dask.array<shape=(8901, 720, 1440), chunksize=(5, 720, 1440)>\n",
" vgosa (time, latitude, longitude) float64 dask.array<shape=(8901, 720, 1440), chunksize=(5, 720, 1440)>\n",
"Attributes:\n",
" Conventions: CF-1.6\n",
" Metadata_Conventions: Unidata Dataset Discovery v1.0\n",
" cdm_data_type: Grid\n",
" comment: Sea Surface Height measured by Altimetry...\n",
" contact: servicedesk.cmems@mercator-ocean.eu\n",
" creator_email: servicedesk.cmems@mercator-ocean.eu\n",
" creator_name: CMEMS - Sea Level Thematic Assembly Center\n",
" creator_url: http://marine.copernicus.eu\n",
" date_created: 2014-02-26T16:09:13Z\n",
" date_issued: 2014-01-06T00:00:00Z\n",
" date_modified: 2015-11-10T19:42:51Z\n",
" geospatial_lat_max: 89.875\n",
" geospatial_lat_min: -89.875\n",
" geospatial_lat_resolution: 0.25\n",
" geospatial_lat_units: degrees_north\n",
" geospatial_lon_max: 359.875\n",
" geospatial_lon_min: 0.125\n",
" geospatial_lon_resolution: 0.25\n",
" geospatial_lon_units: degrees_east\n",
" geospatial_vertical_max: 0.0\n",
" geospatial_vertical_min: 0.0\n",
" geospatial_vertical_positive: down\n",
" geospatial_vertical_resolution: point\n",
" geospatial_vertical_units: m\n",
" history: 2014-02-26T16:09:13Z: created by DUACS D...\n",
" institution: CLS, CNES\n",
" keywords: Oceans > Ocean Topography > Sea Surface ...\n",
" keywords_vocabulary: NetCDF COARDS Climate and Forecast Stand...\n",
" license: http://marine.copernicus.eu/web/27-servi...\n",
" platform: ERS-1, Topex/Poseidon\n",
" processing_level: L4\n",
" product_version: 5.0\n",
" project: COPERNICUS MARINE ENVIRONMENT MONITORING...\n",
" references: http://marine.copernicus.eu\n",
" source: Altimetry measurements\n",
" ssalto_duacs_comment: The reference mission used for the altim...\n",
" standard_name_vocabulary: NetCDF Climate and Forecast (CF) Metadat...\n",
" summary: SSALTO/DUACS Delayed-Time Level-4 sea su...\n",
" time_coverage_duration: P1D\n",
" time_coverage_end: 1993-01-01T12:00:00Z\n",
" time_coverage_resolution: P1D\n",
" time_coverage_start: 1992-12-31T12:00:00Z\n",
" title: DT merged all satellites Global Ocean Gr..."
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import gcsfs\n",
"#gcsmap = gcsfs.mapping.GCSMap('pangeo-data/dataset-duacs-rep-global-merged-allsat-phy-l4-v3')\n",
"gcsmap = gcsfs.mapping.GCSMap('pangeo-data/dataset-duacs-rep-global-merged-allsat-phy-l4-v3-alt')\n",
"ds = xr.open_zarr(gcsmap)\n",
"ds"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"73.8284544"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ds.sla.nbytes / 1e9"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"sla_timeseries = ds.sla.mean(dim=('latitude', 'longitude')).persist()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f0632519c50>]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f06324904e0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sla_timeseries.plot()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<xarray.Dataset>\n",
"Dimensions: (latitude: 720, longitude: 1440, month: 12, nv: 2)\n",
"Coordinates:\n",
" * latitude (latitude) float32 -89.875 -89.625 -89.375 -89.125 -88.875 ...\n",
" lon_bnds (longitude, nv) float32 0.0 0.25 0.25 0.5 0.5 0.75 0.75 1.0 ...\n",
" * longitude (longitude) float32 0.125 0.375 0.625 0.875 1.125 1.375 1.625 ...\n",
" * nv (nv) int32 0 1\n",
" * month (month) int64 1 2 3 4 5 6 7 8 9 10 11 12\n",
"Data variables:\n",
" adt (month, latitude, longitude) float64 dask.array<shape=(12, 720, 1440), chunksize=(1, 720, 1440)>\n",
" err (month, latitude, longitude) float64 dask.array<shape=(12, 720, 1440), chunksize=(1, 720, 1440)>\n",
" sla (month, latitude, longitude) float64 dask.array<shape=(12, 720, 1440), chunksize=(1, 720, 1440)>\n",
" ugos (month, latitude, longitude) float64 dask.array<shape=(12, 720, 1440), chunksize=(1, 720, 1440)>\n",
" ugosa (month, latitude, longitude) float64 dask.array<shape=(12, 720, 1440), chunksize=(1, 720, 1440)>\n",
" vgos (month, latitude, longitude) float64 dask.array<shape=(12, 720, 1440), chunksize=(1, 720, 1440)>\n",
" vgosa (month, latitude, longitude) float64 dask.array<shape=(12, 720, 1440), chunksize=(1, 720, 1440)>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ds_mm = ds.groupby('time.month').mean(dim='time')\n",
"ds_mm"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.696749864"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ds_mm.nbytes /1e9"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"tornado.application - ERROR - Exception in callback <bound method WorkStealing.balance of <distributed.stealing.WorkStealing object at 0x7f0747afe780>>\n",
"Traceback (most recent call last):\n",
" File \"/opt/conda/lib/python3.6/site-packages/tornado/ioloop.py\", line 1026, in _run\n",
" return self.callback()\n",
" File \"/opt/conda/lib/python3.6/site-packages/distributed/stealing.py\", line 332, in balance\n",
" stealable.remove(ts)\n",
"KeyError: <Task \"('zarr-vgos-getitem-29a065de9258b983a53e9570b918b0c6', 65, 0, 0)\" processing>\n",
"tornado.application - ERROR - Exception in callback <bound method WorkStealing.balance of <distributed.stealing.WorkStealing object at 0x7f0747afe780>>\n",
"Traceback (most recent call last):\n",
" File \"/opt/conda/lib/python3.6/site-packages/tornado/ioloop.py\", line 1026, in _run\n",
" return self.callback()\n",
" File \"/opt/conda/lib/python3.6/site-packages/distributed/stealing.py\", line 332, in balance\n",
" stealable.remove(ts)\n",
"KeyError: <Task \"('zarr-sla-getitem-453ed0cf1aab33146a7d8b830a0f63af', 70, 0, 0)\" memory>\n",
"tornado.application - ERROR - Exception in callback <bound method WorkStealing.balance of <distributed.stealing.WorkStealing object at 0x7f0747afe780>>\n",
"Traceback (most recent call last):\n",
" File \"/opt/conda/lib/python3.6/site-packages/tornado/ioloop.py\", line 1026, in _run\n",
" return self.callback()\n",
" File \"/opt/conda/lib/python3.6/site-packages/distributed/stealing.py\", line 332, in balance\n",
" stealable.remove(ts)\n",
"KeyError: <Task \"('zarr-err-getitem-b4ef20c160bc0e632d685a6c35581650', 82, 0, 0)\" released>\n",
"tornado.application - ERROR - Exception in callback <bound method WorkStealing.balance of <distributed.stealing.WorkStealing object at 0x7f0747afe780>>\n",
"Traceback (most recent call last):\n",
" File \"/opt/conda/lib/python3.6/site-packages/tornado/ioloop.py\", line 1026, in _run\n",
" return self.callback()\n",
" File \"/opt/conda/lib/python3.6/site-packages/distributed/stealing.py\", line 332, in balance\n",
" stealable.remove(ts)\n",
"KeyError: <Task \"('zarr-err-getitem-56fe902ed1eff1d89793bc1e03b65b9b', 9, 0, 0)\" released>\n",
"tornado.application - ERROR - Exception in callback <bound method WorkStealing.balance of <distributed.stealing.WorkStealing object at 0x7f0747afe780>>\n",
"Traceback (most recent call last):\n",
" File \"/opt/conda/lib/python3.6/site-packages/tornado/ioloop.py\", line 1026, in _run\n",
" return self.callback()\n",
" File \"/opt/conda/lib/python3.6/site-packages/distributed/stealing.py\", line 332, in balance\n",
" stealable.remove(ts)\n",
"KeyError: <Task \"('zarr-sla-getitem-453ed0cf1aab33146a7d8b830a0f63af', 144, 0, 0)\" memory>\n",
"tornado.application - ERROR - Exception in callback <bound method WorkStealing.balance of <distributed.stealing.WorkStealing object at 0x7f0747afe780>>\n",
"Traceback (most recent call last):\n",
" File \"/opt/conda/lib/python3.6/site-packages/tornado/ioloop.py\", line 1026, in _run\n",
" return self.callback()\n",
" File \"/opt/conda/lib/python3.6/site-packages/distributed/stealing.py\", line 332, in balance\n",
" stealable.remove(ts)\n",
"KeyError: <Task \"('zarr-sla-getitem-ef09b564f2602108276c7193a05bef9d', 134, 0, 0)\" processing>\n",
"tornado.application - ERROR - Exception in callback <bound method WorkStealing.balance of <distributed.stealing.WorkStealing object at 0x7f0747afe780>>\n",
"Traceback (most recent call last):\n",
" File \"/opt/conda/lib/python3.6/site-packages/tornado/ioloop.py\", line 1026, in _run\n",
" return self.callback()\n",
" File \"/opt/conda/lib/python3.6/site-packages/distributed/stealing.py\", line 332, in balance\n",
" stealable.remove(ts)\n",
"KeyError: <Task \"('zarr-err-getitem-ac0f88df71851092cb63dc607d305fe7', 133, 0, 0)\" released>\n",
"tornado.application - ERROR - Exception in callback <bound method WorkStealing.balance of <distributed.stealing.WorkStealing object at 0x7f0747afe780>>\n",
"Traceback (most recent call last):\n",
" File \"/opt/conda/lib/python3.6/site-packages/tornado/ioloop.py\", line 1026, in _run\n",
" return self.callback()\n",
" File \"/opt/conda/lib/python3.6/site-packages/distributed/stealing.py\", line 332, in balance\n",
" stealable.remove(ts)\n",
"KeyError: <Task \"('zarr-vgos-getitem-29a065de9258b983a53e9570b918b0c6', 162, 0, 0)\" released>\n",
"tornado.application - ERROR - Exception in callback <bound method WorkStealing.balance of <distributed.stealing.WorkStealing object at 0x7f0747afe780>>\n",
"Traceback (most recent call last):\n",
" File \"/opt/conda/lib/python3.6/site-packages/tornado/ioloop.py\", line 1026, in _run\n",
" return self.callback()\n",
" File \"/opt/conda/lib/python3.6/site-packages/distributed/stealing.py\", line 332, in balance\n",
" stealable.remove(ts)\n",
"KeyError: <Task \"('zarr-vgos-getitem-bde6e2bbcfa88594415ca26d6bb0e3da', 96, 0, 0)\" released>\n",
"tornado.application - ERROR - Exception in callback <bound method WorkStealing.balance of <distributed.stealing.WorkStealing object at 0x7f0747afe780>>\n",
"Traceback (most recent call last):\n",
" File \"/opt/conda/lib/python3.6/site-packages/tornado/ioloop.py\", line 1026, in _run\n",
" return self.callback()\n",
" File \"/opt/conda/lib/python3.6/site-packages/distributed/stealing.py\", line 332, in balance\n",
" stealable.remove(ts)\n",
"KeyError: <Task \"('zarr-sla-getitem-80db18454a7927074b4b6a9dd7053b8a', 113, 0, 0)\" memory>\n",
"tornado.application - ERROR - Exception in callback <bound method WorkStealing.balance of <distributed.stealing.WorkStealing object at 0x7f0747afe780>>\n",
"Traceback (most recent call last):\n",
" File \"/opt/conda/lib/python3.6/site-packages/tornado/ioloop.py\", line 1026, in _run\n",
" return self.callback()\n",
" File \"/opt/conda/lib/python3.6/site-packages/distributed/stealing.py\", line 332, in balance\n",
" stealable.remove(ts)\n",
"KeyError: <Task \"('zarr-vgosa-getitem-6be14088263b14471b4e8ffb060a8929', 10, 0, 0)\" erred>\n",
"tornado.application - ERROR - Exception in callback <bound method WorkStealing.balance of <distributed.stealing.WorkStealing object at 0x7f0747afe780>>\n",
"Traceback (most recent call last):\n",
" File \"/opt/conda/lib/python3.6/site-packages/tornado/ioloop.py\", line 1026, in _run\n",
" return self.callback()\n",
" File \"/opt/conda/lib/python3.6/site-packages/distributed/stealing.py\", line 349, in balance\n",
" duration, cost_multiplier)\n",
" File \"/opt/conda/lib/python3.6/site-packages/distributed/stealing.py\", line 274, in perhaps_move_task\n",
" self.move_task_request(ts, sat, idl)\n",
" File \"/opt/conda/lib/python3.6/site-packages/distributed/stealing.py\", line 176, in move_task_request\n",
" self.scheduler.worker_comms[victim.address].send(\n",
"KeyError: 'tcp://10.20.11.26:33793'\n"
]
}
],
"source": [
"ds_mm_p = ds_mm.persist()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [default]",
"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.6.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment