一、节点信息

  • 内核版本:3.10.0-1062.el7.x86_64
  • 系统版本:Red Hat Enterprise Linux Server release 7.7 (Maipo)
节点 ip 内存 jdk hadoop ZK NN DN RN NM JN ZKFC
hdp-01 192.186.10.11 1G
hdp-02 192.186.10.12 1G
hdp-03 192.186.10.13 1G
hdp-04 192.186.10.14 1G
hdp-05 192.186.10.15 4G
hdp-06 192.186.10.16 4G
hdp-07 192.186.10.17 4G

二、准备工作

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 varsinclude_vars:dir: vars/depth: 1tags: "always"- name: config ssh ymlimport_tasks: "01-ssh.yml"tags: "confg-ssh"- name: install soft ymlimport_tasks: "02-install-soft.yml"tags: "install-soft"- name: config zkimport_tasks: "03-config_zk.yml"tags: "config-zk"- name: copy config fileimport_tasks: "04-copy_conf_file.yml"tags: "copy-con-file"- name: init haimport_tasks: "05-init_ha.yml"tags: "ini-ha"- name: start clusterimport_tasks: "06-start-cluster.yml"tags: "start-cluster"

01-ssh.yml

# 1.执行生成主机名脚本
- name: 1. make hostsscript: hosts.shregister: rwhen: ansible_hostname in groups['nn1']# 2.输出到hosts文件中
- name: 2. out varslineinfile:path: /etc/hostsline: "{{ hostname }}"regexp: '^{{ hostname }}'owner: rootgroup: rootmode: '0644'with_items: "{{ r.stdout_lines }}"loop_control:loop_var: hostname  when: ansible_hostname in groups['nn1']#3.在NameNode主机上生成密钥对
- name: gen-pub-keyshell: echo 'y' |ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsawhen: ansible_hostname in groups['nn']#4.将hdp-01中的host文件复制给所有主机
- name: copy-hostscopy:src: /etc/hostsdest: /etc/hostsmode: '0644'force: yeswhen: ansible_hostname in groups['nn1']#5.设置所有主机名
- name: set-hostnameshell: hostnamectl set-hostname $(cat /etc/hosts|grep  `ifconfig |grep "inet "|awk '{print $2}'|grep "{{ network }}"`|cut -d " "  -f2)#6.将NameNode主机上将公钥复制给所有的主机
- name: ssh-pub-key-copyshell: sshpass -p "{{ ansible_ssh_pass }}" ssh-copy-id -i ~/.ssh/id_rsa.pub "{{ ansible_user }}"@"{{ host }}" -o StrictHostKeyChecking=nowith_items: "{{ groups['hdp'] }}"loop_control:loop_var: hostwhen: ansible_hostname in groups['nn']#8.清除所有主机的iptables规则,关闭selinux
- name: cleanshell: '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 directoryfile:path: "{{ soft_install_path }}"state: directorymode: '0755'#2.所有主机安装jdk与hadoop
- name: install-jdk-hadoopunarchive:src: "{{ soft }}"dest: "{{ soft_install_path }}"with_items:- [ "{{ hadoop_soft }}", "{{ jdk_soft }}" ]loop_control:loop_var: softtags: install-ha-jdk#3.清掉原来的jdk,hadoop环境变量
- name: clean jdk,hadoop envshell: sed -ri '/HADOOP_HOME/d;/JAVA_HOME/d;/ZOOKEEPER_HOME/d'  "{{ env_file }}"tags: set-env#4.配置用户的jdk,hadoop环境变量
- name: set jdk hadoop envlineinfile:dest: "{{ env_file }}" line: "{{ soft_env.env }}"regexp: "{{ soft_env.reg }}"state: presentwith_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_envtags: set-env#5.在指定主机组,安装zookeeper集群
- name: install zookeeperunarchive:src: "{{ zookeeper_soft }}"dest: "{{ soft_install_path }}"when: ansible_hostname in groups['zk']tags: install-zookeeper#6.设置zookeeper的用户环境变量
- name: set zookeeper envlineinfile:dest: "{{ env_file }}"line: "{{ zk_env.env }}"regexp: "{{ zk_env.reg }}"state: presentwith_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 envlineinfile:dest: "{{ env_file }}"line: 'export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$JAVA_HOME/bin'regexp: "^export PATH"state: presenttags: set-env# 8.export zookeeper集群主机的环境变量
- name: export zookeeper envreplace: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 filecopy:src: "{{ zk_home }}/conf/zoo_sample.cfg"dest: "{{ zk_home }}/conf/zoo.cfg"remote_src: yeswhen: ansible_hostname in groups['zk']# 2.创建zk运行时的数据目录
- name: create zk data directoryfile:path: "{{ zk_data_dir  }}"state: directorymode: '0755'when: ansible_hostname in groups['zk']# 3.在配置文件中指定数据目录
- name: set zookeeper dataDirlineinfile:dest: "{{ zk_home }}/conf/zoo.cfg"line: "dataDir={{ zk_data_dir }}"regexp: "^dataDir="state: presentwhen: ansible_hostname in groups['zk']# 4.设置集群信息
- name: set cluster infolineinfile: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 idshell: '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: hadoopathshell: 'source {{ env_file }} ; hadoop classpath'register: r# 2.复制配置文件到所有主机中
- name: templatetemplate: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 zookeepershell: "source {{ env_file }} ; zkServer.sh restart"when: ansible_hostname in groups['zk']# 启动dfs
- name: start dfsshell: "source {{ env_file }} ;nohup stop-dfs.sh ; nohup start-dfs.sh"when: ansible_hostname in groups['nn1']# 启动yarn
- name: start yarnshell: "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>sshfenceshell(/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: allroles:- { 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 DFSZKFailoverControllerhdp-04 | CHANGED | rc=0 >>
11219 Jps
9802 ResourceManagerhdp-03 | CHANGED | rc=0 >>
9827 ResourceManager
11436 Jpshdp-01 | CHANGED | rc=0 >>
2882 Jps
1829 NameNode
1957 DFSZKFailoverControllerhdp-05 | CHANGED | rc=0 >>
12560 Jps
10281 JournalNode
10026 QuorumPeerMain
10219 DataNode
10475 NodeManagerhdp-06 | CHANGED | rc=0 >>
10197 JournalNode
9942 QuorumPeerMain
10135 DataNode
12430 Jps
10399 NodeManagerhdp-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

Ansible搭建hadoop3.1.3高可用集群相关推荐

  1. kubeadm一键搭建kubernetes1.14.1高可用集群

    一,基础环境配置 环境 版本 debian09 Debian 4.9.144-3 (2019-02-02) x86_64 GNU/Linux kubectl 1.14.1 kubeadmin 1.14 ...

  2. Linux 搭建 MariaDB Galera Cluster 高可用集群

    MariaDB Galera Cluster 集群介绍 MariaDB Galera Cluster(下文简称MGC集群),是一套在MySQL innodb存储引擎上面实现多主.数据实时同步以及强一致 ...

  3. 采用 redis主从 + 哨兵(sentinel) + vip漂移搭建一套redis高可用集群

    一.单个实例 当系统中只有一台redis运行时,一旦该redis挂了,会导致整个系统无法运行. 单个实例 二.备份 由于单台redis出现单点故障,就会导致整个系统不可用,所以想到的办法自然就是备份( ...

  4. 采用ipvsadm管理工具,及Keepalived软件检测服务器的状态,搭建负载均衡的高可用集群

    前言 ipvsadm是Linux虚拟服务器的管理命令,是用于设置.维护和检查Linux内核中虚拟服务器列表的命令.Linux虚拟服务器可用于基于两个或更多个节点的集群构建可扩展的网络服务.群集的活动节 ...

  5. MHA+Cetus+Mysql搭建读写分离的高可用集群

    架构图 Centos配置 免密登录 #先修改hostname(也会影响relay-log的名字,如果主从复制已经开始了,再修改hostname会导致主从复制断开),避免后续ssh key相互覆盖 ho ...

  6. 手动搭建k8s-1.16.6高可用集群之部署worker节点-部署kubelet组件

    kubelet 运行在每个 worker 节点上,接收 kube-apiserver 发送的请求,管理 Pod 容器,执行交互式命令,如 exec.run.logs 等. kubelet 启动时自动向 ...

  7. Hadoop的HA机制原理解析,与HA高可用集群环境搭建

    2019独角兽企业重金招聘Python工程师标准>>> Hadoop的HA工作机制示意图 下面我们开始搭建这一套高可用集群环境 hadoop2.0已经发布了稳定版本了,增加了很多特性 ...

  8. RocketMQ的组织架构和基本概念,Dledger高可用集群架构原理

    文章目录 1. MQ产品介绍 2. rocketMQ组织架构 ①:NameServer ②:Broker ③:生产者(Producer) ④:消费者(Consumer) ⑤:主题(Topic) ⑥:消 ...

  9. Hadoop HA 高可用集群启动报错 Encountered exception loading fsimage 解决方案

    笔者在搭建好Hadoop HA 高可用集群启动时报如下错误,后面是解决方案. 报错信息: 2018-08-24 11:18:07,475 INFO org.apache.hadoop.hdfs.ser ...

最新文章

  1. 如何从NumPy直接创建RNN?
  2. java 文件提前结束_java – org.xml.sax.SAXParseException:过早结束文件
  3. Spring Cloud Gateway
  4. 前端学习(3217):prop的基本使用
  5. DTW动态时间规整算法
  6. DM8168的SPI接口
  7. Java学习笔记_180704_final和static关键字
  8. 解决springboot jar包冲突
  9. (GCC)STM32跑马灯代码的前世今生
  10. 2021年高压电工考试内容及高压电工考试报名
  11. 计算机主机包括哪两大部分,电脑硬件分为哪几个部分
  12. 统计学基础12-秩和检验
  13. Java制作推箱子小游戏
  14. vue 移动端进入页面自动弹出软键盘
  15. HTTP Error503 错误解决办法
  16. 数字文化下的未来柔性团队
  17. 系统集成项目管理工程师学习
  18. Java生成随机数字和字母组合10位数
  19. 利用FFmpeg将H.264文件读入内存,再输出封装格式文件
  20. kafka安装基于脚本

热门文章

  1. 第四范式受邀参加信息技术大讲堂 共探新基建发展趋势
  2. python3精要(20)-函数(1)
  3. .net随笔-vb.net Accord.Net机器学习之SVM分类
  4. 五个工业风满满的 Look-alike 算法
  5. 【数学基础】一份非常适合人工智能学习的概率论基础材料中文版 (国内教材精华)...
  6. 【算法知识】详解选择排序算法
  7. AI基础:一文看懂BERT
  8. 推荐系统炼丹笔记:RecSys2020-SSE-PT解锁序列数据挖掘新姿势
  9. 【入门】WebRTC知识点概览 | 内有技术干货免费下载
  10. 使用应用程序(Java/Python)访问MaxCompute Lightning进行数据开发