{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\"SWAN\"\n", "\"EP-SFT\"\n", "

\n", "

Integration of SWAN with Spark clusters

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The current setup allows to execute PySpark operations on CERN Hadoop and Spark clusters. \n", "\n", "This notebook illustrates the use of __Spark in SWAN to analyze the monitoring data available on HDFS (analytix)__ and plots a heatmap of loadAvg across machines in a particular service." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Connect to the cluster (analytix)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To connect to a cluster, click on the star button on the top and follow the instructions\n", "* The star button only appears if you have selected a SPARK cluster in the configuration\n", "* The star button is active after the notebook kernel is ready" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Import necessary Spark and Python dependencies" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from pyspark.sql.functions import from_unixtime, when, col\n", "from pyspark.sql.types import *\n", "from pyspark.sql.functions import from_json" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import seaborn as sns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Select the data\n", "*This reads monitoring data stored in Hadoop*" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "25/05/13 11:33:49 INFO ContextHandler: Started o.s.j.s.ServletContextHandler@75724fd7{/SQL,null,AVAILABLE,@Spark}\n", "25/05/13 11:33:49 INFO ContextHandler: Started o.s.j.s.ServletContextHandler@6fea34a8{/SQL/json,null,AVAILABLE,@Spark}\n", "25/05/13 11:33:49 INFO ContextHandler: Started o.s.j.s.ServletContextHandler@ac99653{/SQL/execution,null,AVAILABLE,@Spark}\n", "25/05/13 11:33:49 INFO ContextHandler: Started o.s.j.s.ServletContextHandler@30e85a72{/SQL/execution/json,null,AVAILABLE,@Spark}\n", "25/05/13 11:33:49 INFO ContextHandler: Started o.s.j.s.ServletContextHandler@3ca2b03{/static/sql,null,AVAILABLE,@Spark}\n" ] } ], "source": [ "# Create the dataframe from the parquet files containing monitoring data\n", "df = spark.read.parquet(\"hdfs://analytix/project/monitoring/collectd/load/2025/05/07/\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Check the data structure" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "root\n", " |-- dstype: string (nullable = true)\n", " |-- host: string (nullable = true)\n", " |-- interval: double (nullable = true)\n", " |-- plugin: string (nullable = true)\n", " |-- plugin_instance: string (nullable = true)\n", " |-- time: long (nullable = true)\n", " |-- type: string (nullable = true)\n", " |-- type_instance: string (nullable = true)\n", " |-- env: string (nullable = true)\n", " |-- region: string (nullable = true)\n", " |-- dc: string (nullable = true)\n", " |-- value: double (nullable = true)\n", " |-- value_instance: string (nullable = true)\n", " |-- _id: string (nullable = true)\n", " |-- availability_zone: string (nullable = true)\n", " |-- landb_service_name: string (nullable = true)\n", " |-- event_timestamp: long (nullable = true)\n", " |-- submitter_environment: string (nullable = true)\n", " |-- submitter_hostgroup: string (nullable = true)\n", " |-- timestamp: long (nullable = true)\n", " |-- toplevel_hostgroup: string (nullable = true)\n", " |-- version: string (nullable = true)\n", "\n" ] } ], "source": [ "df.printSchema()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create a temporary table view" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "df.createOrReplaceTempView(\"loadAvg\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Do the heavylifting in spark and collect aggregated view to panda DF" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# Extract the data running a query using Spark. \n", "# Fetch the results into a Pandas DataFrame for later plotting\n", "df_loadAvg_pandas = spark.sql(\"\"\"SELECT host,\n", " avg(value) as avg,\n", " hour(from_unixtime(timestamp / 1000, 'yyyy-MM-dd HH:mm:ss')) as hr\n", " FROM loadAvg\n", " WHERE submitter_hostgroup like 'swan%'\n", " --AND dayofmonth(from_unixtime(timestamp / 1000, 'yyyy-MM-dd HH:mm:ss')) = 7\n", " GROUP BY hr, host\"\"\").toPandas()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Visualize load heatmap" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Heatmap of loadAvg for cluster on 2025/05/07')" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# heatmap of loadAvg\n", "plt.figure(figsize=(12, 8))\n", "ax = sns.heatmap(df_loadAvg_pandas.pivot(index='host', columns='hr', values='avg'), cmap=\"Blues\")\n", "ax.set_title(\"Heatmap of loadAvg for cluster on 2025/05/07\", fontsize=20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create a histogram of uptime for the monitored entities" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# create the dataframe\n", "df = spark.read.parquet(\"hdfs://analytix/project/monitoring/collectd/uptime/2025/05/07/\")" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "# create temporary view\n", "df.createOrReplaceTempView(\"uptime\")" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "# Extract the data running a query using Spark. \n", "# Fetch the results into a Pandas DataFrame \n", "df_uptime_pandas = spark.sql(\"\"\"SELECT host, round(max(value)/60/60/24) as days\n", " FROM uptime\n", " WHERE \n", " dayofmonth(from_unixtime(timestamp / 1000, 'yyyy-MM-dd HH:mm:ss')) = 7\n", " AND hour(from_unixtime(timestamp / 1000, 'yyyy-MM-dd HH:mm:ss')) = 12\n", " GROUP BY host\"\"\").toPandas()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# visualize with seaborn\n", "# histogram of uptime (time since last reboot)\n", "\n", "plt.figure(figsize=(12, 8))\n", "ax = sns.histplot(df_uptime_pandas['days'], kde=False, color='red', bins=range(0, 1800, 20))\n", "ax.set_title(\"Histogram of uptime\", fontsize=20)\n", "ax.set_yscale('log')" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:SparkMonitorKernel:Scala socket closed - empty data\n", "INFO:SparkMonitorKernel:Socket Exiting Client Loop\n", "INFO:SparkMonitorKernel:Starting socket thread, going to accept\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "25/05/13 11:37:30 INFO AbstractConnector: Stopped Spark@499fda00{HTTP/1.1, (http/1.1)}{0.0.0.0:31526}\n" ] } ], "source": [ "spark.stop()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "@webio": { "lastCommId": null, "lastKernelId": null }, "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.11.9" }, "sparkconnect": { "bundled_options": [], "list_of_options": [] } }, "nbformat": 4, "nbformat_minor": 2 }