219 lines
9.4 KiB
Plaintext
219 lines
9.4 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "module1-intro",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Модуль 1. Вход в стенд и базовая диагностика\n",
|
||
"\n",
|
||
"Этот ноутбук является канонической практикой Модуля 1.\n",
|
||
"\n",
|
||
"На выходе ты должен:\n",
|
||
"\n",
|
||
"- понимать, что стенд уже поднят на хосте;\n",
|
||
"- подключиться к Spark-кластеру из ноутбука;\n",
|
||
"- выполнить базовый smoke test;\n",
|
||
"- сопоставить сервисы стенда с их ролями;\n",
|
||
"- знать первый маршрут диагностики через `docker compose ps -a`, логи и UI.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "module1-before-start",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Перед стартом\n",
|
||
"\n",
|
||
"Если стенд еще не готов, выполни подготовку и запуск по [START_HERE](../START_HERE.md#быстрый-запуск).\n",
|
||
"Если возвращаешься после паузы, используй [памятку учащегося](../docs/study_workflow.md).\n",
|
||
"\n",
|
||
"Важно: `docker compose build`, `docker compose up -d`, `docker compose ps -a` и просмотр логов выполняются в терминале хоста; терминал браузерного VS Code работает внутри контейнера.\n",
|
||
"\n",
|
||
"Ожидаемое состояние перед началом:\n",
|
||
"\n",
|
||
"- контейнеры `spark-master`, `spark-worker-1`, `spark-worker-2`, `minio`, `postgres-iceberg`, `trino`, `jupyter`, `ide` уже подняты;\n",
|
||
"- открываются `Spark UI`, `Trino UI`, `MinIO Console` и браузерный VS Code;\n",
|
||
"- ты выбрал ядро Python `/usr/bin/python3` внутри контейнера `ide` (Select Kernel → Python Environments).\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "module1-service-map",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Карта сервисов\n",
|
||
"\n",
|
||
"| Сервис | Роль |\n",
|
||
"| --- | --- |\n",
|
||
"| `MinIO` | `storage`: объектное хранилище для данных и файлов Iceberg |\n",
|
||
"| `PostgreSQL` | `catalog`: хранит метаданные JDBC-каталога Iceberg |\n",
|
||
"| `Spark` | `compute`: выполняет PySpark и Spark SQL |\n",
|
||
"| `Trino` | `compute`: читает те же таблицы через общий каталог |\n",
|
||
"| `VS Code / JupyterLab` | Точка входа в учебные ноутбуки |\n",
|
||
"\n",
|
||
"В этом модуле мы не строим пайплайн и не создаём Iceberg-таблицы. Задача только одна: убедиться, что среда рабочая и понятная.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "module1-create-session",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from spark.cluster_smoke import (\n",
|
||
" create_spark_session,\n",
|
||
" format_smoke_report,\n",
|
||
" run_cluster_smoke,\n",
|
||
")\n",
|
||
"\n",
|
||
"spark = create_spark_session(app_name=\"module-01-environment-and-smoke-test\")\n",
|
||
"spark\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "module1-cluster-demo",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Демонстрация: подключение к кластеру\n",
|
||
"\n",
|
||
"Сначала посмотрим на базовые признаки того, что ноутбук говорит именно с кластером, а не с локальным `local[*]` режимом.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "module1-connection-details",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"connection_details = {\n",
|
||
" \"app_name\": spark.sparkContext.appName,\n",
|
||
" \"master_url\": spark.sparkContext.master,\n",
|
||
" \"default_parallelism\": spark.sparkContext.defaultParallelism,\n",
|
||
" \"spark_version\": spark.version,\n",
|
||
"}\n",
|
||
"connection_details\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "module1-visual-check",
|
||
"metadata": {},
|
||
"source": [
|
||
"Проверь глазами:\n",
|
||
"\n",
|
||
"- `master_url` должен быть `spark://spark-master:7077`, а не `local[*]`;\n",
|
||
"- `default_parallelism` должен быть больше `1`;\n",
|
||
"- в `Spark UI` должны быть видны master и worker-ы.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "module1-smoke-explanation",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Демонстрация: Spark smoke test\n",
|
||
"\n",
|
||
"Smoke test запускает распределённое вычисление на `range(0, 1_000_000)` и сверяет детерминированный результат.\n",
|
||
"\n",
|
||
"Если тест проходит, это означает минимум следующее:\n",
|
||
"\n",
|
||
"- ядро ноутбука может создать SparkSession;\n",
|
||
"- Spark подключён к кластерному master;\n",
|
||
"- задание действительно выполняется, а не падает на первом действии.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "module1-run-smoke",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"smoke_report = run_cluster_smoke(spark)\n",
|
||
"print(format_smoke_report(smoke_report))\n",
|
||
"smoke_report\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "module1-self-check",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Самостоятельное повторение\n",
|
||
"\n",
|
||
"Сделай руками и проверь себя:\n",
|
||
"\n",
|
||
"1. Открой `Spark UI`, `Trino UI`, `MinIO Console` и браузерный VS Code.\n",
|
||
"2. Сопоставь каждый сервис с одной из ролей: `storage`, `catalog`, `compute`, `entrypoint`.\n",
|
||
"3. Объясни, почему этот smoke test не должен работать в `local[*]` режиме.\n",
|
||
"4. На хосте выполни `docker compose ps -a` и посмотри, какие контейнеры должны быть в состоянии `Up`.\n",
|
||
"5. На хосте выполни `docker compose logs -f trino` или `docker compose logs -f spark-master`, чтобы посмотреть, где начинается первичная диагностика.\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "module1-service-roles",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"service_roles = {\n",
|
||
" # Заполни значения самостоятельно: storage, catalog, compute или entrypoint.\n",
|
||
" \"MinIO\": \"TODO\",\n",
|
||
" \"PostgreSQL\": \"TODO\",\n",
|
||
" \"Spark\": \"TODO\",\n",
|
||
" \"Trino\": \"TODO\",\n",
|
||
" \"IDE\": \"TODO\",\n",
|
||
"}\n",
|
||
"service_roles\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "module1-checkpoint",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Checkpoint\n",
|
||
"\n",
|
||
"К концу модуля ты должен уметь подтвердить:\n",
|
||
"\n",
|
||
"- стенд поднят и основные контейнеры живы;\n",
|
||
"- `Spark UI`, `MinIO Console`, `Trino UI` и браузерный VS Code открываются;\n",
|
||
"- smoke test напечатал `Spark cluster smoke test passed.` и `result_sum=499999500000`;\n",
|
||
"- ты понимаешь назначение `MinIO`, `PostgreSQL`, `Spark`, `Trino` и IDE;\n",
|
||
"- ты знаешь, что первый маршрут диагностики начинается с `docker compose ps -a`, `docker compose logs -f <service>` и проверки UI.\n",
|
||
"\n",
|
||
"После последней ячейки `spark.stop()` сохрани ноутбук. Дальше — [Модуль 2](./02_lakehouse_mental_model.ipynb)\n",
|
||
"или [завершение занятия](../docs/study_workflow.md#закончить-занятие).\n",
|
||
"Все уроки собраны в [маршруте по модулям](../docs/course_program.md#маршрут-по-модулям)."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "module1-stop-session",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"spark.stop()\n"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"name": "python"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 5
|
||
}
|