Современные Android-устройства обладают достаточной вычислительной мощностью, чтобы использовать их как узлы небольшого учебного или экспериментального кластера. В этой статье мы разберём практический подход к созданию распределённого вычислительного кластера на базе Termux, с запуском Hadoop и Spark в контейнеризованной среде и объединением узлов в локальную сеть. Такой подход удобен для лабораторных задач, PoC-проектов и отладки архитектуры распределённых систем.
Материал ориентирован на безопасные и легальные сценарии: работа в рамках вашей локальной сети (без целей обхода ограничений), с применением стандартных инструментов и конфигураций.
Концепция архитектуры кластера
Распределённый кластер на базе Android обычно строится как набор «узлов» (например, 2–5 устройств), которые:
- имеют общий доступ через локальную сеть (Wi‑Fi);
- в каждом узле запускают вычислительные компоненты;
- обмениваются данными по сети в соответствии с ролями Hadoop/Spark.
На практике для демонстраций и тестов можно ограничиться компактной топологией:
- Hadoop: NameNode + DataNode (или mini-кластер), YARN (ResourceManager/NodeManager);
- Spark: Spark master (в роли драйвера/координатора) + Spark workers.
Container-подход позволяет изолировать зависимости (Java, системные библиотеки, переменные окружения) и повторяемо разворачивать окружение на разных Android-устройствах.
Что потребуется
Перед началом подготовьте:
- Устройства Android (минимум 2): одинаковая версия/ветка ОС упрощает совместимость;
- Termux на каждом устройстве;
- доступ в локальную сеть (одна Wi‑Fi сеть/роутер);
- поддержку контейнеров: для Android чаще всего используют контейнеризацию в пользовательском пространстве (например, via proot/дистрибуции) или Docker-совместимые решения, где они доступны. В рамках статьи мы опираемся на подход «контейнероподобной среды», который реально применим через Termux.
Важно: производительность Android-узлов ниже серверной. Планируйте объём данных и размеры задач так, чтобы кластер работал стабильно (не «упирайтесь» в память и CPU).
Шаг 1. Подготовка Termux на каждом узле
Обновите пакеты и установите базовые утилиты. На каждом устройстве выполните:
pkg update -y
pkg upgrade -y
pkg install -y wget curl tar gzip unzip openjdk-17 procps coreutils
Далее проверьте Java:
java -version
Для Hadoop и Spark обычно требуется Java (часто рекомендуют 8/11, но для экспериментальных стендов допустим подход с подстройкой версий). Если ваша сборка Hadoop/Spark требует конкретной версии Java, меняйте JDK под требование.
Шаг 2. Организация локальной сети и адресации узлов
Чтобы узлы Hadoop/Spark видели друг друга, обеспечьте локальную сеть. Один Wi‑Fi роутер на всех устройствах — самый простой вариант. Убедитесь, что на узлах известны IP-адреса.
В Termux узнайте IP:
ip addr show
Примечание: используйте разрешение/открытие портов только в рамках вашей локальной сети, а не публично в интернет. VPN допускается только для создания локальной сети между устройствами в пределах вашего сценария (без обхода блокировок).
Шаг 3. Выбор контейнеризованной среды
Вместо полного Docker на Android (что зависит от модели/прав/реализации) целесообразно использовать контейнероподобную среду через «chroot-like» подходы и минимальную файловую систему дистрибутива. Суть: вы создаёте «контейнер» в виде отдельного корня файловой системы и запускаете внутри него нужные процессы.
Практическая цель контейнеризации для нашей задачи:
- внутри контейнера проще управлять версиями Java/библиотек;
- проще воспроизвести конфигурацию на всех узлах;
- проще изолировать порты и окружение.
Ниже приведён ориентир по созданию отдельного окружения (упрощённый лабораторный подход). При необходимости адаптируйте под вашу выбранную технологию контейнеров.
Шаг 4. Подготовка файловой системы для «контейнера»
Создайте папку окружения и распакуйте базовую среду. В качестве примера рассмотрим загрузку минимального rootfs (источник выбирайте самостоятельно и легально):
mkdir -p $HOME/cluster-container/rootfs
cd $HOME/cluster-container
# Пример: распакуйте подготовленный rootfs-архив, если у вас есть подходящий образ
# tar -xzf rootfs-android-min.tar.gz -C rootfs
Если вы используете готовую утилиту/скрипт для контейнера в Termux, замените этот шаг на ваш рабочий процесс. Главное — зафиксировать корневую структуру и используемую архитектуру.
Шаг 5. Установка Hadoop в контейнере
Скачайте исходный выпуск Hadoop и распакуйте в контейнер. В примере предполагаем, что вы выполняете команды внутри окружения или «как будто» внутри.
export HADOOP_VERSION="3.3.6"
export HADOOP_HOME="$HOME/hadoop"
mkdir -p $HADOOP_HOME
cd $HOME
wget https://downloads.apache.org/hadoop/common/hadoop-${HADOOP_VERSION}/hadoop-${HADOOP_VERSION}.tar.gz
tar -xzf hadoop-${HADOOP_VERSION}.tar.gz
mv hadoop-${HADOOP_VERSION} $HADOOP_HOME
export PATH="$HADOOP_HOME/bin:$PATH"
Проверьте:
$HADOOP_HOME/bin/hadoop version
Шаг 6. Конфигурация Hadoop для распределённого режима
Создайте конфигурационные файлы (внутри контейнера) и настройте адреса узлов. На учебных кластерах удобно хранить конфигурацию в одном месте и развернуть на всех узлах одинаково.
Типовые файлы:
core-site.xml— настройки файловой системы и адреса;hdfs-site.xml— репликации и HDFS параметры;yarn-site.xml— YARN настройки;mapred-site.xml— если используете MR;workersиmasters(для старых сценариев) — для координации.
Примерно (псевдонастройки для мини-кластера):
mkdir -p $HADOOP_HOME/etc/hadoop
# core-site.xml
cat > $HADOOP_HOME/etc/hadoop/core-site.xml <<'EOF'
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://<IP_NAME_NODE>:9000</value>
</property>
</configuration>
EOF
# hdfs-site.xml
cat > $HADOOP_HOME/etc/hadoop/hdfs-site.xml <<'EOF'
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
EOF
# yarn-site.xml
cat > $HADOOP_HOME/etc/hadoop/yarn-site.xml <<'EOF'
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value><IP_RESOURCE_MANAGER></value>
</property>
</configuration>
EOF
Обязательно замените <IP_NAME_NODE> и <IP_RESOURCE_MANAGER> на реальные IP-адреса узлов в вашей локальной сети.
Шаг 7. Запуск Hadoop: форматирование HDFS и поднятие процессов
На узле с NameNode выполните форматирование:
$HADOOP_HOME/bin/hdfs namenode -format
Далее запустите HDFS и YARN (в мини-стенде это можно сделать по месту на каждом узле либо через один управляющий скрипт, в зависимости от вашей схемы).
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
Проверьте доступность web-интерфейсов (в локальной сети):
- HDFS NameNode: обычно
http://<IP>:9870(или аналог); - YARN ResourceManager: обычно
http://<IP>:8088.
Шаг 8. Подключение Spark к кластеру Hadoop/YARN
Чтобы Spark работал как распределённая система поверх Hadoop/YARN, установите Spark и настройте его на использование YARN.
Скачайте и распакуйте Spark (в контейнере/окружении):
export SPARK_VERSION="3.5.1"
export SPARK_HOME="$HOME/spark"
cd $HOME
wget https://downloads.apache.org/spark/spark-${SPARK_VERSION}/spark-${SPARK_VERSION}-bin-hadoop3.tgz
tar -xzf spark-${SPARK_VERSION}-bin-hadoop3.tgz
mv spark-${SPARK_VERSION}-bin-hadoop3 $SPARK_HOME
Установите переменные окружения:
export PATH="$SPARK_HOME/bin:$PATH"
Настройте конфигурацию Spark. На практике нужно указать master и способ запуска — для YARN обычно используют соответствующие параметры запуска (а в конфиге можно закрепить базовые параметры).
Проверьте версию:
$SPARK_HOME/bin/spark-submit --version
Шаг 9. Тестовый запуск Spark в распределённом режиме
Для проверки подойдёт примерный тест с минимальной нагрузкой. Например, запустите приложение, которое создаёт RDD/DataFrame и выполняет небольшой job.
Пример команды с использованием YARN:
$SPARK_HOME/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--class org.apache.spark.examples.SparkPi \
$SPARK_HOME/examples/jars/spark-examples_2.12-3.5.1.jar \
10
Параметры --deploy-mode и версию jar подберите под вашу сборку Spark. В локальной сети следите за логами и доступностью ResourceManager.
Шаг 10. Практические рекомендации для Android-кластера
- Ограничьте репликации: на двух устройствах ставьте
dfs.replication=1. - Сразу учитывайте лимиты памяти: Android может убивать фоновые процессы. Настройте энерго-ограничения, держите устройства в режиме «заряд/без сна».
- Смотрите логи: храните логи на узле и периодически проверяйте
logsкаталог Hadoop/YARN и Spark. - Фиксируйте IP: используйте DHCP reservation на роутере или скрипт проверки адресации.
- Не перегружайте сеть: большие shuffle-операции на слабых каналах дадут нестабильность.
Безопасность и легальность
В рамках данного проекта рекомендуется:
- использовать кластер только в вашей локальной сети;
- не выставлять сервисы наружу;
- по возможности ограничивать доступ к web-интерфейсам и портам внутри сети;
- не применять инструменты для обхода ограничений и блокировок. В VPN следует использовать только сценарий создания локальной сети между устройствами.
Технически вы управляете узлами и сервисами в пределах собственных устройств; это соответствует типовым лабораторным и обучающим сценариям.
Заключение
Создание распределённого кластера на базе Termux на Android — реалистичная задача для лабораторных исследований и PoC: вы поднимаете Hadoop и Spark в контейнеризованной/изолированной среде, объединяете узлы через локальную сеть и выполняете тестовые распределённые вычисления. Ключ к успеху — корректная адресация, продуманная конфигурация Hadoop/YARN, аккуратные ресурсы под Android и регулярная проверка логов.
Нужна помощь в настройке под ваши устройства, подборе версий Hadoop/Spark под конкретные требования или сопровождение лабораторного стенда? Обратитесь в РыбинскЛАБ — поможем спроектировать и реализовать инфраструктуру под вашу задачу.