Ansible搭建hadoop3.1.3高可用集群

432 篇文章 15 订阅

一、节点信息

  • 内核版本:3.10.0-1062.el7.x86_64
  • 系统版本:Red Hat Enterprise Linux Server release 7.7 (Maipo)
节点ip内存jdkhadoopZKNNDNRNNMJNZKFC
hdp-01192.186.10.111G
hdp-02192.186.10.121G
hdp-03192.186.10.131G
hdp-04192.186.10.141G
hdp-05192.186.10.154G
hdp-06192.186.10.164G
hdp-07192.186.10.174G

二、准备工作

1.登录环境

系统启动时进入字符界面

systemctl set-default multi-user.target &&\
systemctl isolate multi-user.target

2.网卡

ens33用来连接外网,下载软件

TYPE="Ethernet"
BOOTPROTO="dhcp"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"

ens34用来连接内网,进行集群间的通信

BOOTPROTO=static
NAME=ens34
DEVICE=ens34
ONBOOT=yes
IPADDR=192.186.10.13
PREFIX=24

3.防火墙、Selinux

关闭防火墙与Selinux

yum install -y iptables-services
iptables -F && \
service iptables save && \
systemctl stop firewalld && \
systemctl disable firewalld && \
setenforce 0 && \
sed -ri 's#(SELINUX=)(enforcing)#\1disabled#' /etc/selinux/config

4.ssh免密登录

因为hdp-01hdp-02hdfs-ha,所以它们之间必须要自己可以免密登录自己,自己可以登录免密对方

此功能在剧本中已经配置完毕

  • hdp-01->hdp-01
  • hdp-01->hdp-02
  • hdp-01->其它所有主机
  • hdp-02->hdp-02
  • hdp-02->hdp-01
  • hdp-02->其它所有主机

5.安装软件

jdk,hadoop ,zookeeper安装环境变量的配置均已在剧本中写好

6.配置hosts

hosts配置已经在剧本中写好

三、配置文件

  • ansible.cfg配置文件的时候注意,所有的配置栏目不能少,否则使用ansible时就会报错
[defaults]
inventory    	= /root/ansible/inventory	
roles_path   	= /root/ansible/roles	
remote_user  	= root
ask_pass     	= Flase							
forks		= 10								
[inventory]
[privilege_escalation]
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]

四、目录信息

[root@hdp-01 ~]# tree ansible/
ansible/
├── hadoop_ha.yml #角色启动文件
├── inventory # 主机清单
└── roles
    └── hadoop_ha
        ├── defaults
        ├── files
        ├── handlers
        ├── meta
        ├── README.md # 帮助文档
        ├── tasks
        │   ├── 01-ssh.yml # 生成hosts文件设置主机名及nn主机免密登录集群
        │   ├── 02-install-soft.yml # 安装jdk hadoop zookeeper软件及配置环境变量
        │   ├── 03-config_zk.yml # 配置zookeeper集群
        │   ├── 04-copy_conf_file.yml # 复制配置文件到所有主机
        │   ├── 05-init_ha.yml # 初始化集群
        │   ├── 06-start-cluster.yml # 启动集群
        │   └── main.yml # 任务入口执行文件
        ├── templates
        │   ├── core-site.xml.j2 # core-site.xml模板文件
        │   ├── hadoop-env.sh.j2 # hadoop-env.sh模板文件
        │   ├── hdfs-site.xml.j2 # hdfs-site.xml模板文件
        │   ├── mapred-site.xml.j2 # mapred-site.xml模板文件
        │   ├── workers.j2 # workers模板文件
        │   └── yarn-site.xml.j2 # 
        ├── tests
        └── vars
            ├── core.yml # core-site.xml变量
            ├── hdfs.yml # hdfs-site.xml变量
            ├── soft.yml # 软件环境及网络变量
            └── yarn.yml # yarn-site.xml变量

五、主机清单

[hdp]
hdp-0[1:7] ansible_user=root ansible_ssh_pass="123456"

[nn]
hdp-0[1:2]

[rm]
hdp-0[3:4]

[zk]
hdp-0[5:7]

[jn]
hdp-0[5:7]

[dn]
hdp-0[5:7]

[nm]
hdp-0[5:7]

[nn1]
hdp-01

[nn2]
hdp-02

六、角色

tasks

00-main.yml
- name: include vars
  include_vars:
    dir: vars/
    depth: 1
  tags: "always"

- name: config ssh yml
  import_tasks: "01-ssh.yml"
  tags: "confg-ssh"

- name: install soft yml
  import_tasks: "02-install-soft.yml"
  tags: "install-soft"

- name: config zk
  import_tasks: "03-config_zk.yml"
  tags: "config-zk"

- name: copy config file
  import_tasks: "04-copy_conf_file.yml"
  tags: "copy-con-file"

- name: init ha
  import_tasks: "05-init_ha.yml"
  tags: "ini-ha"

- name: start cluster
  import_tasks: "06-start-cluster.yml"
  tags: "start-cluster"
01-ssh.yml
# 1.执行生成主机名脚本
- name: 1. make hosts
  script: hosts.sh
  register: r
  when: ansible_hostname in groups['nn1']

# 2.输出到hosts文件中
- name: 2. out vars
  lineinfile:
    path: /etc/hosts
    line: "{{ hostname }}"
    regexp: '^{{ hostname }}'
    owner: root
    group: root
    mode: '0644'
  with_items: "{{ r.stdout_lines }}"
  loop_control:
    loop_var: hostname  
  when: ansible_hostname in groups['nn1']

#3.在NameNode主机上生成密钥对
- name: gen-pub-key
  shell: echo 'y' |ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
  when: ansible_hostname in groups['nn']

#4.将hdp-01中的host文件复制给所有主机
- name: copy-hosts
  copy:
    src: /etc/hosts
    dest: /etc/hosts
    mode: '0644'
    force: yes
  when: ansible_hostname in groups['nn1']

#5.设置所有主机名
- name: set-hostname
  shell: hostnamectl set-hostname $(cat /etc/hosts|grep  `ifconfig |grep "inet "|awk '{print $2}'|grep "{{ network }}"`|cut -d " "  -f2)

#6.将NameNode主机上将公钥复制给所有的主机
- name: ssh-pub-key-copy
  shell: sshpass -p "{{ ansible_ssh_pass }}" ssh-copy-id -i ~/.ssh/id_rsa.pub "{{ ansible_user }}"@"{{ host }}" -o StrictHostKeyChecking=no
  with_items: "{{ groups['hdp'] }}"
  loop_control:
    loop_var: host
  when: ansible_hostname in groups['nn']


#8.清除所有主机的iptables规则,关闭selinux
- name: clean
  shell: 'source /etc/profile ; iptables -F ; setenforce 0 ; sed -ri "s#(SELINUX=)(enforcing)#\1disabled#" /etc/selinux/config'
  ignore_errors: true
02-install-soft.yml
#1.创建软件安装目录
- name: create apps directory
  file:
    path: "{{ soft_install_path }}"
    state: directory
    mode: '0755'

#2.所有主机安装jdk与hadoop
- name: install-jdk-hadoop
  unarchive:
    src: "{{ soft }}"
    dest: "{{ soft_install_path }}"
  with_items:
  - [ "{{ hadoop_soft }}", "{{ jdk_soft }}" ]
  loop_control:
    loop_var: soft
  tags: install-ha-jdk

  
#3.清掉原来的jdk,hadoop环境变量
- name: clean jdk,hadoop env
  shell: sed -ri '/HADOOP_HOME/d;/JAVA_HOME/d;/ZOOKEEPER_HOME/d'  "{{ env_file }}"
  tags: set-env

#4.配置用户的jdk,hadoop环境变量
- name: set jdk hadoop env
  lineinfile:
    dest: "{{ env_file }}" 
    line: "{{ soft_env.env }}"
    regexp: "{{ soft_env.reg }}"
    state: present
  with_items:
  - { env: 'export JAVA_HOME={{ jdk_home }}' ,reg: '^export JAVA_HOME=' }
  - { env: 'export HADOOP_HOME={{ hdp_home }}' ,reg: '^export HADOOP_HOME' }
  loop_control:
    loop_var: soft_env
  tags: set-env
 
#5.在指定主机组,安装zookeeper集群
- name: install zookeeper
  unarchive:
    src: "{{ zookeeper_soft }}"
    dest: "{{ soft_install_path }}"
  when: ansible_hostname in groups['zk']
  tags: install-zookeeper
   
#6.设置zookeeper的用户环境变量
- name: set zookeeper env
  lineinfile:
    dest: "{{ env_file }}"
    line: "{{ zk_env.env }}"
    regexp: "{{ zk_env.reg }}"
    state: present
  with_items:
  - { env: 'export ZOOKEEPER_HOME={{ zk_home }}' ,reg: '^export ZOOKEEPER_HOME=' }  
  loop_control:
    loop_var: zk_env  
  when: ansible_hostname in groups['zk']
  tags: set-env
   
#7.export所有主机的jdk与hadoop环境变量
- name: export jdk hadoop env
  lineinfile:
    dest: "{{ env_file }}"
    line: 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$JAVA_HOME/bin'
    regexp: "^export PATH"
    state: present
  tags: set-env

# 8.export zookeeper集群主机的环境变量
- name: export zookeeper env
  replace:
    path: "{{ env_file }}"
    regexp: "^(export PATH=)(.+)$"
    replace: '\1\2:$ZOOKEEPER_HOME/bin'
  when: ansible_hostname in groups['zk']
  tags: set-env
03-config_zk.yml
# 1.复制配置文件
- name: copy config file
  copy:
    src: "{{ zk_home }}/conf/zoo_sample.cfg"
    dest: "{{ zk_home }}/conf/zoo.cfg"
    remote_src: yes
  when: ansible_hostname in groups['zk']

# 2.创建zk运行时的数据目录
- name: create zk data directory
  file:
    path: "{{ zk_data_dir  }}"
    state: directory
    mode: '0755'
  when: ansible_hostname in groups['zk']

# 3.在配置文件中指定数据目录
- name: set zookeeper dataDir
  lineinfile:
    dest: "{{ zk_home }}/conf/zoo.cfg"
    line: "dataDir={{ zk_data_dir }}"
    regexp: "^dataDir="
    state: present
  when: ansible_hostname in groups['zk']

# 4.设置集群信息
- name: set cluster info
  lineinfile:
    dest: "{{ zk_home }}/conf/zoo.cfg"
    line: "server.{{ item.0 + 1 }}={{ item.1 }}:2888:3888"
    regexp: "^server{{ item.0 + 1 }}"
  with_indexed_items: "{{ groups['zk'] }}"
  when: ansible_hostname in groups['zk']

# 5.根据集群信息,创建对应的myid文件
- name: make server id
  shell: 'cat {{ zk_home }}/conf/zoo.cfg |grep {{ ansible_hostname }}|cut -d "." -f2|head -c1 > {{ zk_data_dir }}/myid'
  when: ansible_hostname in groups['zk']
04-copy_conf_file
# 1.生成classpath变量
- name: hadoopath
  shell: 'source {{ env_file }} ; hadoop classpath'
  register: r

# 2.复制配置文件到所有主机中
- name: template
  template:
    src: "{{ item }}"
    dest: "{{ hdp_conf }}/{{ item |  replace('.j2','') }}"
    mode: '0644'        
  vars:
    hdp_classpath: "{{ r.stdout }}"
  with_items: ["core-site.xml.j2","hdfs-site.xml.j2","mapred-site.xml.j2","yarn-site.xml.j2","hadoop-env.sh.j2","workers.j2"]
05-init_ha.yml
# 1.首先在zk上要删除hadoop数据目录下所有文件- name: delete hdp data  shell: "rm -rf {{ hdp_data }}/*"  when: ansible_hostname in groups['zk']# 2.启动zkServer- name: start zookeeper  shell: 'source {{ env_file }} && nohup zkServer.sh  restart'  when: ansible_hostname in groups['zk']# 3.启动journalnode- name: start journalnode  shell: 'source {{ env_file }}  ; nohup hdfs --daemon stop journalnode ; nohup hdfs --daemon start journalnode'  when: ansible_hostname in groups['jn']# 4.首先在nn上要删除hadoop数据目录下所有文件- name: delete hdp data  shell: "rm -rf {{ hdp_data }}/*"  when: ansible_hostname in groups['nn']# 5.格式化前要能连接journnode,并且journnode的目录是空的  - name: format namenode  shell: 'source {{ env_file }} && nohup echo y | hdfs namenode -format'      when: ansible_hostname in groups['nn1']    # 6.nn1启动namenode- name: start namenode  shell: 'source {{ env_file }} ; nohup hdfs --daemon stop namenode ; nohup hdfs --daemon start namenode'  when: ansible_hostname in groups['nn1']# 7.nn2在复制nn1的元数据之前,nn1要启动namenode- name: copy mate data  shell: 'source {{ env_file }} && nohup hdfs namenode -bootstrapStandby'  when: ansible_hostname in groups['nn2']# 8.nn1格式化zkfc- name: format zkfc  shell: 'source {{ env_file }} && nohup echo y |hdfs zkfc -formatZK'  when: ansible_hostname in groups['nn1']
06-start-cluster.yml
- name: start zookeeper
  shell: "source {{ env_file }} ; zkServer.sh restart"
  when: ansible_hostname in groups['zk']

# 启动dfs
- name: start dfs
  shell: "source {{ env_file }} ;nohup stop-dfs.sh ; nohup start-dfs.sh"
  when: ansible_hostname in groups['nn1']

# 启动yarn
- name: start yarn
  shell: "source {{ env_file }} ; nohup stop-yarn.sh ; nohup start-yarn.sh"
  when: ansible_hostname in groups['nn1']

vars

00-soft.yml
# 主机网段
network: "192.186.10."

# 软件安装路径
soft_install_path: "/root/apps"

# hadoop安装包
hadoop_soft: "/root/soft/hadoop-3.1.3.tar.gz"

# hadoop家目录
hdp_home: "{{ soft_install_path }}/hadoop-3.1.3"

# hadoop配置文件目录
hdp_conf: "{{ hdp_home }}/etc/hadoop"

# hadoop 数据目录
hdp_data: "/root/hdpdata"

# hadoop执行用户
hdp_user: "root"

# jdk安装包
jdk_soft: "/root/soft/jdk1.8.0.tar.gz"

# jdk家目录
jdk_home: "{{ soft_install_path }}/jdk1.8.0"

# zookeeper安装包
zookeeper_soft: "/root/soft/apache-zookeeper-3.5.8-bin.tar.gz"

# zookeeper的安装目录
zk_home: "{{ soft_install_path }}/apache-zookeeper-3.5.8-bin"

# zookeeper运行时数据目录
zk_data_dir: "/root/zkdata"

# 环境变量文件
env_file: "/root/.bashrc"
01-core.yml
# hdfs集群名称dfs_cluster_name: "mycluster"# hadoop的临时目录tmp_dir: "/root/hdpdata/tmp"# zookeeper集群地址zk_cluster: "hdp-05:2181,hdp-06:2181,hdp-07:2181"
03-hdfs.yml
# 名称目录
name_dir: "/root/hdpdata/name"

# 数据目录
data_dir: "/root/hdpdata/data"

# namesnodes的名称
nn_names: ["nn1","nn2"]

# namesnodes的rpc地址
nn_rpc_address: ["hdp-01:9000","hdp-02:9000"]

# namesnodes的http地址
nn_http_address: ["hdp-01:9870","hdp-02:9870"]

# NameNode的共享edits元数据在存放的位置
edits_dir: "qjournal://hdp-05:8485;hdp-06:8485;hdp-07:8485/{{ dfs_cluster_name }}"

# JournalNode数据存入的位置
jn_data_dir: "/root/hdpdata/journaldata"

# ssh私钥存入的位置
pri_key: /root/.ssh/id_rsa

#sshfence隔离机制超时时间
ssh_fen_con_timeout: 3000
04-yarn.yml
# yarn集群id
yarn_cluster_id: yrc

# resoucemanager名称
rm_names: ["rm1","rm2"]

# resoucemanager主机名称
rm_hostnames: ["hdp-03","hdp-04"]

# resoucemanager的Web地址
rm_webapp_address: ["hdp-03:8088","hdp-04:8088"]

# 环境白名单列表
env_whitelist: ["JAVA_HOME","HADOOP_HOME"]

templates

1.hadoop-env.sh.j2
export HADOOP_OS_TYPE=${HADOOP_OS_TYPE:-$(uname -s)}export HADOOP_HOME={{ hdp_home }}export HADOOP_MAPRED_HOME=$HADOOP_HOMEexport HADOOP_COMMON_HOME=$HADOOP_HOMEexport HADOOP_HDFS_HOME=$HADOOP_HOMEexport HADOOP_MAPRED_HOME=$HADOOP_HOMEexport HADOOP_YARN_HOME=$HADOOP_HOMEexport HADOOP_INSTALL=$HADOOP_HOMEexport HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoopexport HADOOP_LIBEXEC_DIR=$HADOOP_HOME/libexecexport HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/nativeexport JAVA_LIBRARY_PATH=$HADOOP_COMMON_LIB_NATIVE_DIR:$JAVA_LIBRARY_PATHexport HDFS_NAMENODE_USER={{ hdp_user }}export HDFS_DATANODE_USER={{ hdp_user }}export YARN_NODEMANAGER_USER={{ hdp_user }}export YARN_RESOURCEMANAGER_USER={{ hdp_user }}export HDFS_JOURNALNODE_USER={{ hdp_user }}export HDFS_ZKFC_USER={{ hdp_user }}export JAVA_HOME={{ jdk_home }}
2.core-site.xml.j2
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
	<!-- 配置集群地址 -->
    <property>
      <name>fs.defaultFS</name>
      <value>hdfs://{{ dfs_cluster_name }}/</value>
    </property>

    <!-- 指定hadoop临时目录 -->
    <property>
      <name>hadoop.tmp.dir</name>
      <value>{{ tmp_dir }}</value>
    </property>

    <!-- 指定zookeeper地址 -->
    <property>
      <name>ha.zookeeper.quorum</name>
      <value>{{ zk_cluster }}</value>
    </property>     
</configuration>
3.hdfs-site.xml.j2
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <!--指定hdfs的nameservice,需要和core-site.xml中的保持一致 -->
    <property>
        <name>dfs.nameservices</name>
        <value>{{ dfs_cluster_name }}</value>
    </property>

    <!-- 指定namenodes的名称 -->
    <property>
        <name>dfs.ha.namenodes.{{ dfs_cluster_name }}</name>
        <value>        
        {% for nn in nn_names %}
            {%- set sep=',' -%}
            {%- if loop.last -%}
                {%- set sep='' -%} 
            {%- endif -%} 
            {{ nn }}{{ sep }}
        {%- endfor -%}
        </value>
    </property>


	{% for nn in nn_names %}
    <!-- {{ nn }}RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.{{ dfs_cluster_name }}.{{ nn }}</name>
        <value>{{ nn_rpc_address[loop.index0] }}</value>
    </property>

	{% endfor %}


	{% for nn in nn_names %}
    <!-- {{ nn }}的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.{{ dfs_cluster_name }}.{{ nn }}</name>
        <value>{{ nn_http_address[loop.index0] }}</value>
    </property>

	{% endfor %}

		<!-- 名称目录位置 -->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>{{ name_dir }}</value>
    </property>

		<!-- 数据目录位置 -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>{{ data_dir }}</value>
    </property>

    <!-- 指定NameNode的共享edits元数据在JournalNode上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>{{ edits_dir }}</value>
    </property>

    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>{{ jn_data_dir }}</value>
    </property>

    <!-- 开启NameNode失败自动切换 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>

    <!-- 配置失败自动切换实现方式 -->
    <property>
        <name>dfs.client.failover.proxy.provider.{{ dfs_cluster_name }}</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>
		  sshfence
  		  shell(/bin/true)
		 </value>
    </property>

    <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>{{ pri_key }}</value>
    </property>

    <!-- 配置sshfence隔离机制超时时间 -->
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>{{ ssh_fen_con_timeout }}</value>
    </property>
</configuration>
4.yarn-site.xml.j2
<?xml version="1.0"?>
<configuration>
        <!-- 开启RM高可用 -->
        <property>
            <name>yarn.resourcemanager.ha.enabled</name>
            <value>true</value>
        </property>

        <!-- 指定RM的cluster id -->
        <property>
            <name>yarn.resourcemanager.cluster-id</name>
            <value>{{ yarn_cluster_id }}</value>
        </property>

        <!-- 指定RM的逻辑名字 -->
        <property>
            <name>yarn.resourcemanager.ha.rm-ids</name>
            <value>
                {%- for rm in rm_names -%}
                    {%- set sep=',' -%}
                    {%- if loop.last -%}
                        {%- set sep='' -%} 
                    {%- endif -%} 
                    {{ rm }}{{ sep }}
                {%- endfor -%}
            </value>
        </property>
			
		{%- for rm in rm_names -%}
        <!-- 指定{{ rm }}的地址 -->
        <property>
            <name>yarn.resourcemanager.hostname.{{ rm }}</name>
            <value>{{ rm_hostnames[loop.index0] }}</value>
        </property>
		{%- endfor -%}

        <!-- 至关重要,即使默认有也要配置 -->

	    {%- for rm in rm_names -%}

        <!-- {{ rm }}的webapp地址 -->
        
        <property>
            <name>yarn.resourcemanager.webapp.address.{{ rm }}</name>
            <value>{{ rm_webapp_address[loop.index0] }}</value>
        </property>
		{%- endfor -%}


        <!-- 指定zk集群地址 -->
        <property>
            <name>yarn.resourcemanager.zk-address</name>
            <value>{{ zk_cluster }}</value>
        </property>

        <!--启用自动恢复--> 
        <property>
            <name>yarn.resourcemanager.recovery.enabled</name>
            <value>true</value>
        </property>

        
        <!-- 启用自动切换 -->
        <property>
            <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
            <value>true</value>
        </property>

    
        <!-- 指定resourcemanager的状态信息存储在zookeeper集群 --> 
        <property>
            <name>yarn.resourcemanager.store.class</name>
            <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
        </property>

         <!-- NodeManager上运行的附属服务,需配置成mapreduce_shuffle,才可运行MapReduce程序 -->
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>

        <!-- 配置nm环境环境变量白名单 -->
        <property>
            <name>yarn.nodemanager.env-whitelist</name>
            <value>{{ env_whitelist }}</value>
        </property>

         <!-- yarn程序运行环境变量 -->
        <property>
            <name>yarn.application.classpath</name>
            <value>{{ hdp_classpath }}</value>
        </property>

        <!-- 让NodeManager自动检测内存和CPU -->
        <property>
            <name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
            <value>true</value>
        </property>

</configuration>
5.mapred-site.xml.j2
<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration>    <property>            <name>mapreduce.framework.name</name>            <value>yarn</value>    </property></configuration>
6.workers.j2
{% for host in groups['dn'] %}{{ host }}{% endfor %}

七、使用方法

1.执行所有

  • 查看hadoop_ha角色文件
[root@hdp-01 ansible]# cat hadoop_ha.yml
- hosts: all
  roles:
  - { role: hadoop_ha }
  • 从头开始执行所有步骤,适合初化环境下运行
[root@hdp-01 ansible]# ansible-playbook hadoop_ha.yml

2.指定执行

  • 查看角色tasks中的所有标签
[root@hdp-01 ~]# ansible-playbook --list-tags hadoop_ha.yml
[always, config-ssh, config-zk, copy-con-file, ini-ha, install-ha-jdk, install-soft, install-zookeeper, set-env, start-cluster]
  • 可以指定标签执行对应的功能,适合精确的使用某个功能
ansible -t config-ssh hadoop_ha.yml

八、测试集群

1.查看集群进程信息

[root@hdp-01 ~]# ansible -m shell -a 'jps' hdp
hdp-02 | CHANGED | rc=0 >>
13909 Jps
11597 NameNode
11663 DFSZKFailoverController

hdp-04 | CHANGED | rc=0 >>
11219 Jps
9802 ResourceManager

hdp-03 | CHANGED | rc=0 >>
9827 ResourceManager
11436 Jps

hdp-01 | CHANGED | rc=0 >>
2882 Jps
1829 NameNode
1957 DFSZKFailoverController

hdp-05 | CHANGED | rc=0 >>
12560 Jps
10281 JournalNode
10026 QuorumPeerMain
10219 DataNode
10475 NodeManager

hdp-06 | CHANGED | rc=0 >>
10197 JournalNode
9942 QuorumPeerMain
10135 DataNode
12430 Jps
10399 NodeManager

hdp-07 | CHANGED | rc=0 >>
10112 DataNode
12518 Jps
9927 QuorumPeerMain
10375 NodeManager

2.测试mapreduce

1).查看yarn集群信息

[root@hdp-02 ~]# yarn rmadmin -getAllServiceState
hdp-03:8033                                        active    
hdp-04:8033                                        standby

2).进入示例目录

[root@hdp-01 ~]# cd /root/apps/hadoop-3.1.3/share/hadoop/mapreduce

3).执行pimapreduce程序

[root@hdp-01 mapreduce]# hadoop jar hadoop-mapreduce-examples-3.1.3.jar pi 3 5

4).执行结果

Estimated value of Pi is 3.73333333333333333333

3.测试hdfs高可用

1).上传一个文件到hdfs中*

[root@hdp-01 ~]# hadoop fs -put /var/log/messages /

2).获取active状态的主机,kill掉namenode

[root@hdp-01 ~]# hdfs haadmin -getAllServiceState
hdp-01:9000                                        standby   
hdp-02:9000                                        active 

[root@hdp-02 ~]# jps
14020 Jps
11597 NameNode
11663 DFSZKFailoverController

[root@hdp-02 ~]# kill -9 11597

3).查看nn1对应hdp-01namenode状态

[root@hdp-01 ~]# hdfs haadmin -getServiceState nn1
active

4).再次查看hdfs中的文件信息,发现仍然可以访问,说明成功

[root@hdp-01 ~]# hadoop fs -ls /messages
-rw-r--r--   3 root supergroup     684483 2020-08-10 14:48 /messages

5).再次启动刚刚kill掉的namdenode,查看集群状态信息,发现hdp-02已经是standby

[root@hdp-02 ~]# hdfs --daemon start namenode
[root@hdp-02 ~]# hdfs haadmin -getAllServiceState
hdp-01:9000                                        active    
hdp-02:9000                                        standby 

参考链接:https://cloud.tencent.com/developer/article/1676789

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以使用Ansible来实现一键部署高可用集群项目。下面是一个简的步骤: 1. 创建一个Ansible的Inventory文件,定义你的服务器列表。例如: ``` [web] server1 ansible_host=<IP地址> ansible_user=<用户名> ansible_ssh_private_key_file=<私钥路径> [database] server2 ansible_host=<IP地址> ansible_user=<用户名> ansible_ssh_private_key_file=<私钥路径> ``` 2. 创建一个Ansible的Playbook文件,用于定义你的部署任务。例如: ```yaml --- - hosts: web become: true tasks: - name: 安装依赖软件包 yum: name: "{{ item }}" state: present with_items: - package1 - package2 - name: 配置Web服务器 template: src: web.conf.j2 dest: /etc/web.conf notify: - restart web handlers: - name: 重启Web服务器 service: name: web state: restarted - hosts: database become: true tasks: - name: 安装依赖软件包 yum: name: "{{ item }}" state: present with_items: - package3 - package4 - name: 配置数据库 template: src: db.conf.j2 dest: /etc/db.conf notify: - restart db handlers: - name: 重启数据库服务 service: name: db state: restarted ``` 在上面的例子中,我们通过使用`yum`模块安装了一些软件包,并使用`template`模块配置了一些配置文件。当配置文件发生变化时,会触发相应服务的重启。 3. 创建模板文件,用于生成配置文件。例如,`web.conf.j2`可以是一个Jinja2模板文件,如下所示: ``` server_name: {{ ansible_hostname }} listen_port: 80 ``` 在模板文件中,你可以使用Jinja2的语法来插入变量。 4. 运行Ansible Playbook来执行部署任务。使用以下命令: ``` ansible-playbook -i inventory.ini playbook.yaml ``` 其中,`inventory.ini`是你的Inventory文件,`playbook.yaml`是你的Playbook文件。 通过以上步骤,你就可以使用Ansible来一键部署高可用集群项目了。当然,具体的配置和任务根据你的项目需求可能会有所不同。这只是一个简的例子,你可以根据实际情况进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学亮编程手记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值