DataSkills Hub

JupyterHub

JupyterHub es el servidor multi-usuario de notebooks Jupyter para equipos de datos. Proporciona un entorno compartido donde analistas y científicos de datos acceden a instancias personales de Jupyter, conectadas a Trino, Ceph/S3 y repositorios de datos.

#Getting Started

#Acceder a JupyterHub

Abrir en el navegador

<tu-url>

Ingresar con tus credenciales de usuario (LDAP/Okta)

Seleccionar el kernel y perfil de recursos:

  • Python 3.11 (pandas/scipy) — para análisis general y EDA
  • PySpark — para procesamiento distribuido
  • Data Science — stack completo (numpy, pandas, sklearn, matplotlib)

Una vez autenticado, JupyterHub inicia una instancia Jupyter personalizada bajo demanda.

#Verificar conexión

Dentro de una celda:

import jupyterhub
print(jupyterhub.__version__)

# Verificar usuario actual
import os
print(os.getenv('JUPYTERHUB_USER'))

#Conexión a Trino desde Notebooks

#Configurar conexión Trino

from trino.dbapi import connect

conn = connect(
    host='<tu-url>',
    port=<puerto>,
    user='<tu_usuario>',
    catalog='hive',  # o 'minio', según tu source
    schema='analytics',
)
cursor = conn.cursor()

#Ejecutar queries

import pandas as pd

query = """
SELECT
    date_trunc('month', fecha) AS mes,
    COUNT(*) AS transacciones,
    SUM(monto) AS total
FROM analytics.transacciones
WHERE fecha >= DATE '2026-01-01'
GROUP BY 1
ORDER BY 1 DESC
"""

df = pd.read_sql(query, conn)
print(df)

#Usar magic commands de Trino (si está instalado)

%load_ext trino.ipython
%trino hive.analytics.transacciones --limit 10

#Lectura de Datos Ceph/S3

#Configurar acceso a Ceph desde Jupyter

from minio import Minio

client = Minio(
    "<tu-url>",
    access_key="<TU_ACCESS_KEY>",
    secret_key="<TU_SECRET_KEY>",
    secure=True,
)

#Leer archivos Parquet desde Ceph

import pandas as pd
import s3fs

fs = s3fs.S3FileSystem(
    endpoint_url='<tu-url>',
    key='<TU_ACCESS_KEY>',
    secret='<TU_SECRET_KEY>',
)

# Leer un único archivo
df = pd.read_parquet(
    's3://data-analytics/ventas/2026/03/kpi_mensual.parquet',
    filesystem=fs
)

# Leer múltiples archivos (particionados)
df = pd.read_parquet(
    's3://data-analytics/ventas/2026/',
    filesystem=fs
)

#Trabajar con CSV desde Ceph

df = pd.read_csv(
    's3://data-raw/comercial/clientes/2026/03/clientes.csv',
    storage_options={
        'key': '<TU_ACCESS_KEY>',
        'secret': '<TU_SECRET_KEY>',
        'client_kwargs': {'endpoint_url': '<tu-url>'},
    }
)

#Kernels y Entornos

#Kernels disponibles

Kernel Stack Cuándo usar
Python 3.11 pandas, scipy, matplotlib, requests Análisis general, EDA
PySpark spark 3.2, hadoop Procesamiento big data (>5GB)
Data Science scikit-learn, tensorflow, xgboost ML, modelos, predicción
R R 4.0, ggplot2, dplyr Análisis estadístico (si está disponible)

Cambiar kernel: Menú "Kernel" → "Change Kernel" → seleccionar

#Instalar paquetes adicionales

En una celda, instalar temporalmente (solo en tu instancia):

%pip install pyspark-stubs dbt-core polars

Para paquetes permanentes, contactar a Data Engineering

#Mejores Prácticas

#Estructura recomendada de notebook

1. Importes (datos, librerías)
2. Conectarse a Ceph / Trino
3. Exploración (EDA, shape, dtypes, nulls)
4. Transformaciones
5. Visualizaciones
6. Resultados y exportación

#Convenciones de archivo

  • Nombre: {tu_usuario}_{proyecto}_{fecha}.ipynb
  • Ejemplo: jrodriguez_kpi_pipeline_2026-03-14.ipynb
  • Carpeta: Guardar en /home/<tu_usuario>/notebooks/

#Compartir notebooks

Guardar a Ceph para que otros puedan acceder:

notebook_file = 'analisis_ventas.ipynb'

s3.upload_file(
    Filename=notebook_file,
    Bucket='data-analytics',
    Key=f'shared/notebooks/{notebook_file}',
    ExtraArgs={'Metadata': {'owner': os.getenv('JUPYTERHUB_USER')}}
)

Otros acceden descargando:

s3.download_file(
    Bucket='data-analytics',
    Key=f'shared/notebooks/{notebook_file}',
    Filename=notebook_file
)

#Troubleshooting

#La instancia Jupyter tarda en iniciar

  • Causa: Kernel seleccionado tiene recursos limitados
  • Solución: Cambiar a un kernel más ligero (Python 3.11 en lugar de PySpark)

#No puedo conectar a Trino

# Verificar credenciales y host
import socket
socket.gethostbyname('<tu-url>')  # Debe resolver IP

#Error: "No space left on device"

  • Limpiar archivos temporales en /tmp/
  • Pedir extensión a DevOps

#Kernel muere al leer archivo muy grande

  • Usar .parquet() con columns= para leer columnas selectivas
  • Usar dask para procesamiento fuera-de-memoria:
import dask.dataframe as dd

df = dd.read_parquet(
    's3://data-analytics/dataset/',
    storage_options={...}
).compute()

#Also see