告别手动拷贝!用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/hosts1.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-worker22. 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_workers2.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: present3.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: yes4. 集群配置与优化
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=8g4.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.target5.2 验证集群状态
部署完成后,可以通过以下命令验证集群状态:
# 在主节点查看Spark UI curl http://spark-master:8080 # 查看工作节点日志 journalctl -u spark-worker -f6. 高级配置与调优
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.MasterUIFilter7. 日常运维与扩展
7.1 集群扩展
添加新节点到现有集群:
- 将新节点添加到Ansible inventory
- 运行Playbook时使用
--limit参数只对新节点执行 - 更新主节点的
workers文件
ansible-playbook spark-cluster.yml --limit=new-worker-node7.2 版本升级
Spark版本升级流程:
graph TD A[备份现有配置] --> B[停止集群服务] B --> C[下载新版本] C --> D[安装新版本] D --> E[恢复配置] E --> F[启动集群]注意:升级前务必测试新版本与现有应用的兼容性
