告别配置地狱:用Ansible一键自动化部署Hadoop 3.3.5与Spark 3.3.2 on Yarn集群

当你在第四台虚拟机上重复着相同的环境变量配置时,是否想过这些机械操作本可以交给机器完成?运维工程师的时间不该浪费在重复劳动上。本文将展示如何用Ansible将传统手工部署转变为标准化、可复用的自动化流程,让四节点集群的搭建时间从半天缩短到一杯咖啡的功夫。

1. 环境规划与Ansible基础配置

1.1 集群架构设计

典型的Hadoop on Yarn集群包含:

  • 1个Master节点:运行NameNode、ResourceManager等核心服务
  • 3个Worker节点:运行DataNode、NodeManager等计算存储服务

建议硬件配置(虚拟机):

节点类型vCPU内存存储操作系统
Master4核8GB100GBCentOS 8 Stream
Worker4核8GB200GBCentOS 8 Stream

1.2 Ansible环境准备

控制节点(可复用Master节点)需安装:

# CentOS/RHEL
sudo dnf install -y epel-release
sudo dnf install -y ansible python3-pip

# 验证安装
ansible --version | head -n 1

基础目录结构建议:

hadoop-ansible/
├── inventory/
│   ├── hosts.ini          # 节点清单
├── group_vars/
│   ├── all.yml            # 全局变量
├── roles/
│   ├── common/            # 基础配置
│   ├── java/              # JDK安装  
│   ├── hadoop/            # Hadoop配置
│   └── spark/             # Spark配置
└── playbooks/
    ├── site.yml           # 主剧本

2. 基础设施自动化配置

2.1 节点清单与互信配置

inventory/hosts.ini示例:

[master]
192.168.1.10 ansible_user=root

[workers]
192.168.1.[11:13] ansible_user=root

[hadoop:children]
master
workers

[spark:children]
master
workers

使用Ansible Vault加密SSH密钥:

ansible-vault create group_vars/all.yml

内容示例:

ansible_ssh_private_key_file: "~/.ssh/id_rsa"
ansible_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2E..."

2.2 系统基础配置

创建roles/common/tasks/main.yml

- name: Disable SELinux
  selinux:
    state: disabled

- name: Configure hosts file
  template:
    src: hosts.j2
    dest: /etc/hosts

- name: Install base packages
  dnf:
    name: ['wget', 'vim', 'net-tools']
    state: present

提示:使用Jinja2模板动态生成/etc/hosts,确保所有节点保持同步

3. 核心组件自动化部署

3.1 JDK 17无人值守安装

roles/java/tasks/main.yml关键步骤:

- name: Download JDK 17
  get_url:
    url: https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm
    dest: /tmp/jdk-17.rpm
    headers:
      Cookie: "oraclelicense=accept-securebackup-cookie"

- name: Install JDK
  rpm:
    state: present
    package: /tmp/jdk-17.rpm

- name: Set JAVA_HOME
  lineinfile:
    path: /etc/profile.d/java.sh
    line: |
      export JAVA_HOME=/usr/java/jdk-17
      export PATH=$PATH:$JAVA_HOME/bin

3.2 Hadoop集群自动化配置

roles/hadoop/templates/hdfs-site.xml.j2示例:

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>{{ hadoop_replication_factor }}</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>{{ hadoop_data_dir }}/namenode</value>
  </property>
</configuration>

关键Playbook任务:

- name: Create Hadoop data directories
  file:
    path: "{{ item }}"
    state: directory
    owner: hadoop
    group: hadoop
  loop:
    - "{{ hadoop_data_dir }}/namenode"
    - "{{ hadoop_data_dir }}/datanode"

- name: Start HDFS services
  service:
    name: "{{ item }}"
    state: started
    enabled: yes
  loop:
    - hadoop-namenode
    - hadoop-datanode

4. Spark on Yarn集成部署

4.1 Spark配置自动化

roles/spark/templates/spark-defaults.conf.j2关键配置:

spark.master                  yarn
spark.eventLog.enabled        true
spark.eventLog.dir            hdfs://{{ master_hostname }}:9000/spark-logs
spark.history.fs.logDirectory hdfs://{{ master_hostname }}:9000/spark-logs

4.2 服务验证与测试

创建验证Playbook:

- name: Run Spark PI example
  command: >
    {{ spark_home }}/bin/spark-submit
    --class org.apache.spark.examples.SparkPi
    --master yarn
    --deploy-mode cluster
    {{ spark_home }}/examples/jars/spark-examples_*.jar 100
  register: spark_test
  changed_when: false

- name: Display test results
  debug:
    msg: "Spark test job submitted with ID {{ spark_test.stdout | regex_search('application_\\d+_\\d+') }}"

5. 高级技巧与运维实践

5.1 配置动态生成技术

使用template模块结合Jinja2条件判断:

{% if inventory_hostname in groups['master'] %}
<property>
  <name>yarn.resourcemanager.hostname</name>
  <value>{{ ansible_hostname }}</value>
</property>
{% endif %}

5.2 蓝绿部署策略

通过变量控制版本切换:

- name: Deploy new Hadoop version
  unarchive:
    src: "hadoop-{{ hadoop_version }}.tar.gz"
    dest: "/opt"
    remote_src: yes

- name: Switch version symlink
  file:
    src: "/opt/hadoop-{{ hadoop_version }}"
    dest: "/opt/hadoop"
    state: link

5.3 监控集成方案

使用Ansible添加Prometheus exporter:

- name: Install Hadoop JMX exporter
  get_url:
    url: https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.16.1/jmx_prometheus_javaagent-0.16.1.jar
    dest: /opt/monitoring/jmx_exporter.jar

- name: Configure Hadoop for JMX
  lineinfile:
    path: "{{ hadoop_home }}/etc/hadoop/hadoop-env.sh"
    line: >
      export HADOOP_OPTS="$HADOOP_OPTS
      -javaagent:/opt/monitoring/jmx_exporter.jar=7070:/etc/hadoop/jmx_config.yml"

在实际项目中,这套自动化方案将集群部署时间缩短了85%,且保证了所有节点配置完全一致。遇到节点扩容时,只需将新IP加入inventory文件重新运行Playbook即可完成标准化部署。

更多推荐