告别手动拷贝!用Ansible自动化部署Spark 3.x集群(基于CentOS 7)
告别手动拷贝!用Ansible自动化部署Spark 3.x集群(基于CentOS 7)
在分布式计算领域,Spark集群的部署往往伴随着大量重复性劳动。传统的手动操作不仅效率低下,还容易因人为疏忽导致配置不一致。本文将介绍如何利用Ansible这一自动化运维利器,实现Spark 3.x集群的一键式部署,让运维人员从繁琐的配置工作中彻底解放。
1. 环境准备与Ansible基础配置
部署Spark集群前,需要确保所有节点满足基本运行条件。以下是一个典型的三节点集群架构:
- 控制节点 (1台):运行Ansible,负责执行部署任务
- 工作节点 (2台):运行Spark的Worker进程
1.1 系统基础配置
所有节点需要预先完成以下配置:
# 关闭SELinux(需要重启生效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 配置主机名解析(所有节点)
echo "192.168.1.10 spark-master" >> /etc/hosts
echo "192.168.1.11 spark-worker1" >> /etc/hosts
echo "192.168.1.12 spark-worker2" >> /etc/hosts
1.2 Ansible控制节点安装
在控制节点上安装Ansible:
# CentOS 7安装EPEL源
yum install -y epel-release
# 安装Ansible
yum install -y ansible
# 验证安装
ansible --version
配置SSH免密登录到所有工作节点:
# 生成密钥对
ssh-keygen -t rsa
# 分发公钥到所有节点
ssh-copy-id root@spark-master
ssh-copy-id root@spark-worker1
ssh-copy-id root@spark-worker2
2. Ansible Inventory与Playbook设计
2.1 定义主机清单
创建
/etc/ansible/hosts
文件,定义Spark集群节点:
[spark_master]
spark-master
[spark_workers]
spark-worker1
spark-worker2
[spark_cluster:children]
spark_master
spark_workers
2.2 基础Playbook结构
创建
spark-cluster.yml
作为主Playbook:
---
- name: Deploy Spark 3.x Cluster
hosts: spark_cluster
become: yes
vars:
spark_version: "3.3.1"
spark_install_dir: "/opt/spark"
java_version: "11"
tasks:
# 后续任务将在这里添加
3. 自动化部署Spark集群
3.1 安装Java环境
Spark运行依赖Java环境,添加以下任务到Playbook:
- name: Install OpenJDK
yum:
name: "java-{{ java_version }}-openjdk-devel"
state: present
- name: Set JAVA_HOME
lineinfile:
path: /etc/environment
line: 'JAVA_HOME=/usr/lib/jvm/java-{{ java_version }}-openjdk'
state: present
3.2 下载并安装Spark
使用Ansible的
get_url
模块下载Spark二进制包:
- name: Create installation directory
file:
path: "{{ spark_install_dir }}"
state: directory
mode: '0755'
- name: Download Spark
get_url:
url: "https://archive.apache.org/dist/spark/spark-{{ spark_version }}/spark-{{ spark_version }}-bin-hadoop3.tgz"
dest: "/tmp/spark-{{ spark_version }}-bin-hadoop3.tgz"
checksum: "sha256:https://archive.apache.org/dist/spark/spark-{{ spark_version }}/spark-{{ spark_version }}-bin-hadoop3.tgz.sha256"
- name: Extract Spark
unarchive:
src: "/tmp/spark-{{ spark_version }}-bin-hadoop3.tgz"
dest: "{{ spark_install_dir }}"
remote_src: yes
extra_opts: ["--strip-components=1"]
3.3 配置环境变量
添加Spark环境变量配置:
- name: Configure Spark environment
blockinfile:
path: /etc/profile.d/spark.sh
block: |
export SPARK_HOME={{ spark_install_dir }}
export PATH=$PATH:$SPARK_HOME/bin
create: yes
4. 集群配置与优化
4.1 主节点配置
在
spark-master
节点上配置:
- name: Configure master node
hosts: spark_master
tasks:
- name: Create spark-env.sh
template:
src: templates/spark-env.sh.j2
dest: "{{ spark_install_dir }}/conf/spark-env.sh"
mode: '0644'
对应的模板文件
templates/spark-env.sh.j2
内容:
#!/usr/bin/env bash
export SPARK_MASTER_HOST={{ inventory_hostname }}
export SPARK_MASTER_PORT=7077
export SPARK_MASTER_WEBUI_PORT=8080
export SPARK_WORKER_CORES=4
export SPARK_WORKER_MEMORY=8g
4.2 工作节点配置
工作节点需要知道主节点地址:
- name: Configure worker nodes
hosts: spark_workers
tasks:
- name: Create spark-env.sh
template:
src: templates/spark-env.sh.j2
dest: "{{ spark_install_dir }}/conf/spark-env.sh"
mode: '0644'
- name: Configure workers
template:
src: templates/workers.j2
dest: "{{ spark_install_dir }}/conf/workers"
mode: '0644'
templates/workers.j2
文件内容:
{% for host in groups['spark_workers'] %}
{{ hostvars[host]['ansible_hostname'] }}
{% endfor %}
5. 服务管理与集群启动
5.1 创建Systemd服务
为Spark主节点和工作节点创建服务:
- name: Configure master service
hosts: spark_master
tasks:
- name: Create spark-master.service
template:
src: templates/spark-master.service.j2
dest: /etc/systemd/system/spark-master.service
mode: '0644'
- name: Reload systemd
systemd:
daemon_reload: yes
- name: Enable and start spark-master
systemd:
name: spark-master
state: started
enabled: yes
对应的
spark-master.service.j2
模板:
[Unit]
Description=Apache Spark Master
After=network.target
[Service]
Type=simple
User=root
ExecStart={{ spark_install_dir }}/sbin/start-master.sh
ExecStop={{ spark_install_dir }}/sbin/stop-master.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
5.2 验证集群状态
部署完成后,可以通过以下命令验证集群状态:
# 在主节点查看Spark UI
curl http://spark-master:8080
# 查看工作节点日志
journalctl -u spark-worker -f
6. 高级配置与调优
6.1 配置参数优化
根据集群硬件配置调整Spark参数:
| 参数名 | 默认值 | 推荐值 | 说明 |
|---|---|---|---|
| spark.executor.memory | 1g | 4g | 每个Executor的内存分配 |
| spark.executor.cores | 1 | 2 | 每个Executor的CPU核心数 |
| spark.driver.memory | 1g | 2g | Driver进程内存大小 |
| spark.default.parallelism | 8 | 32 | 默认并行度 |
6.2 安全配置
为生产环境添加基本安全措施:
- name: Configure Spark security
hosts: spark_cluster
tasks:
- name: Create spark-defaults.conf
template:
src: templates/spark-defaults.conf.j2
dest: "{{ spark_install_dir }}/conf/spark-defaults.conf"
mode: '0644'
对应的安全配置模板示例:
spark.authenticate=true
spark.authenticate.secret=your-secret-key
spark.ui.filters=org.apache.spark.deploy.master.ui.MasterUIFilter
7. 日常运维与扩展
7.1 集群扩展
添加新节点到现有集群:
- 将新节点添加到Ansible inventory
-
运行Playbook时使用
--limit参数只对新节点执行 -
更新主节点的
workers文件
ansible-playbook spark-cluster.yml --limit=new-worker-node
7.2 版本升级
Spark版本升级流程:
graph TD
A[备份现有配置] --> B[停止集群服务]
B --> C[下载新版本]
C --> D[安装新版本]
D --> E[恢复配置]
E --> F[启动集群]
注意:升级前务必测试新版本与现有应用的兼容性
更多推荐

所有评论(0)