使用 ansible 部署 hadoop 集群

使用 ansible 快速部署 hadoop 集群,服务器节点须有 jdk 和 sshd 服务

环境说明

节点:

  • 172.17.0.2
  • 172.17.0.3
  • 172.17.0.4

选择 172.17.0.2 作为 namenode 和 resourcemanager
修改 172.17.0.2 节点的 /etc/hosts :

1
2
3
4
127.0.0.1 localhost
172.17.0.2 namenode.com resourcemanager.com
172.17.0.3 secondarynode.com worker-01.com
172.17.0.4 worker-02.com

配置主节点 172.17.0.2 到每个节点的 ssh 免密登录:

1
2
3
shell> ssh-copy-id 172.17.0.2
shell> ssh-copy-id 172.17.0.3
shell> ssh-copy-id 172.17.0.4

初始化 role

在任意目录(这里以test文件夹为例)下执行 ansible-galaxy init hadoop ,初始化一个 roles

设置要用到的变量

test/hadoop/defaults/main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
---
# defaults file for hadoop
# 版本
hadoop_version: 3.1.0
# 下载地址
hadoop_download_url: "http://mirrors.shu.edu.cn/apache/hadoop/common/hadoop-{{ hadoop_version }}/hadoop-{{ hadoop_version }}.tar.gz"
# 下载到本地的 ~/Downloads
hadoop_download_dest: ~/Downloads/hadoop-{{ hadoop_version }}.tar.gz
# 安装目录
install_dir: /usr/local/
# 软连接地址
soft_dir: "{{ install_dir }}hadoop"
# 设置环境变量的文件
env_file: /etc/profile
# hadoop 配置文件地址
hadoop_config_dir: /usr/local/hadoop/etc/hadoop
# hdfs 副本数量
dfs_replication: 1
# hdfs 的 namenode 地址
namenode_host: namenode.com:9000
# secondary_node 地址
secondarynode_host: secondarynode.com:9001
# resourcemanager 地址
resourcemanager_host: resourcemanager.com
# jobhistory 地址
jobhistory_web: resourcemanager.com:19888
jobhistory_address: resourcemanager.com:10020
# worker 地址
worker_hosts:
- worker-01.com
- worker-02.com

JAVA_HOME: /usr/local/java
HADOOP_HOME: /usr/local/hadoop

# 默认把所有节点的 namenode 和 resourcemanager 设置为no, 在 hosts 文件中把 namenode, resourcemanager 节点的该值设置为 yes
namenode: no
resourcemanager: no

准备 hadoop 的配置文件

test/hadoop/templates/

  • core-site.xml.j2 (指定hdfs的namenode的host地址, 指定hadoop临时目录)
  • hadoop-env.sh.j2 (hadoop 启动环境, 通常在这里指定一些环境变量)
  • hdfs-site.xml.j2 (指定HDFS副本的数量, 指定 secondarynod 的地址)
  • mapred-site.xml.j2 (指定mr运行在yarn上, 指定 resourcemanager 的 host 地址, 指定 jobhistory 的 host 地址)
  • workers.j2 ( 配置 workers 节点, 过去版本名为 slaves)
  • yarn-site.xml.j2 (指定 ResourceManager 的地址, 指定 reducer获取数据的方式)

这部分配置可以点击这里参考

编写 tasks

如果一个 tasks 有很多步骤,可以把它们分置在不同的文件中,最后在 test/hadoop/tasks/main.yml 文件中引用他们,这样做方便调试,方便阅读

编写 hadoop 下载、安装过程

在 test/hadoop/tasks/ 下新建文件 download.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
---
# tasks file for ./hadoop
# 把文件下载到本地
- name: 判断 hadoop 源文件是否已经下载好了
command: ls {{ hadoop_download_dest }}
ignore_errors: true
register: file_exist
connection: local

- name: 下载文件
get_url:
url: "{{ hadoop_download_url}}"
dest: "{{ hadoop_download_dest }}"
force: yes
when: file_exist|failed
connection: local

# 解压到远程服务器的安装目录
- name: 解压
unarchive:
src: "{{ hadoop_download_dest }}"
dest: "{{ install_dir }}"
become: true

编写 hadoop 配置、启动过程

在 test/hadoop/tasks/ 下新建文件 init.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
---
# tasks file for ./hadoop
# install hadoop

- name: 安装依赖 pdsh
apt:
name: "{{item}}"
state: present
with_items:
- pdsh

- name: 创建 rcmd_default 配置文件
file:
path: /etc/pdsh/rcmd_default
state: touch

- name: 写入 rcmd_default ssh
shell: echo "ssh" > /etc/pdsh/rcmd_default

- name: 创建 hadoop 软连接
file:
src: /usr/local/hadoop-{{ hadoop_version }}
dest: /usr/local/hadoop
state: link

- name: 创建 hadoop logs 目录
file:
path: /usr/local/hadoop/logs
mode: 0755
state: directory

- name: 设置 hadoop 相关环境变量
lineinfile:
dest: "{{env_file}}"
insertafter: "{{item.position}}"
line: "{{item.value}}"
state: present
with_items:
- {position: EOF, value: "\n"}
- {position: EOF, value: "# hadoop environment"}
- {position: EOF, value: "export HADOOP_HOME=/usr/local/hadoop"}
- {position: EOF, value: "export PATH=$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin"}
- {position: EOF, value: "export HADOOP_LOG_DIR=${HADOOP_HOME}/logs"}
- {position: EOF, value: "export YARN_RESOURCEMANAGER_USER=root"}
- {position: EOF, value: "export YARN_NODEMANAGER_USER=root"}
- {position: EOF, value: "export HDFS_NAMENODE_USER=root"}
- {position: EOF, value: "export HDFS_DATANODE_USER=root"}
- {position: EOF, value: "export HDFS_SECONDARYNAMENODE_USER=root"}
- {position: EOF, value: "export HADOOP_MAPRED_HOME=${HADOOP_HOME}"}

# 配置 hadoop
- name: 配置 hadoop-env.sh, 保持默认
template:
src: hadoop-env.sh.j2
dest: "{{hadoop_config_dir}}/hadoop-env.sh"

- name: 配置 core-site.xml, 指定hdfs的namenode的host地址, 指定hadoop临时目录
template:
src: core-site.xml.j2
dest: "{{hadoop_config_dir}}/core-site.xml"

- name: 配置 hdfs-site.xml, 指定HDFS副本的数量, 指定 secondarynod 的地址
template:
src: hdfs-site.xml.j2
dest: "{{hadoop_config_dir}}/hdfs-site.xml"

- name: 配置 mapred-site.xml, 指定mr运行在yarn上, 指定 resourcemanager 的 host 地址, 指定 jobhistory 的 host 地址
template:
src: mapred-site.xml.j2
dest: "{{hadoop_config_dir}}/mapred-site.xml"

- name: 配置 yarn-site.xml, 指定 ResourceManager 的地址, 指定 reducer获取数据的方式
template:
src: yarn-site.xml.j2
dest: "{{hadoop_config_dir}}/yarn-site.xml"

- name: 配置 workers, 过去版本名为 slaves
template:
src: workers.j2
dest: "{{hadoop_config_dir}}/workers"

- name: 格式化 active namenode hdfs
shell: /usr/local/hadoop/bin/hdfs namenode -format
when: namenode=='yes'
args:
executable: /bin/bash

- name: 启动 hdfs
shell: "source {{ env_file }} &&/usr/local/hadoop/sbin/start-dfs.sh"
when: namenode=='yes'
args:
executable: /bin/bash

- name: 启动 yarn
shell: "source {{ env_file }} && /usr/local/hadoop/sbin/start-yarn.sh"
when: resourcemanager=='yes'
args:
executable: /bin/bash

#- name: 启动 historyserver
# shell: "source {{ env_file }} && /usr/local/hadoop/bin/mapred --daemon start historyserver"
# when: resourcemanager=='yes'
# args:
# executable: /bin/bash

合并所有 tasks

在 test/hadoop/tasks/ 下修改文件 main.yml

1
2
3
4
5
6
---
# tasks file for hadoop
##
- import_tasks: download.yml
#####
- import_tasks: init.yml

编写 hosts 文件

在 test/ 目录下新建文件 hosts

变量 namenode, resourcemanager 分别表示启动 namenode 和 resourcemanager 的节点,即主节点

1
2
3
4
[test]
172.17.0.2 namenode=yes resourcemanager=yes
172.17.0.3
172.17.0.4

编写启动文件

在 test/ 目录下新建文件 run.xml

1
2
3
4
- hosts: test
remote_user: root
roles:
- hadoop

执行

在 test/ 目录下执行

1
2
3
# ansible 是通过 ssh 执行命令的,所以最佳实践中推荐的是设置 ssh 免密码登录
# 如果没有设置,而已在执行命令后加 -k 参数,手动输入密码, 这里 root 用户的密码是 root
ansible-playbook -i hosts run.yml -k

项目地址

记录遇到的问题

Resource Manager 不能启动

日志:
1
2
3
4
5
6
7
8
9
Caused by: com.google.inject.ProvisionException: Unable to provision, see the following errors:
402
403 1) Error injecting constructor, java.lang.NoClassDefFoundError: javax/activation/DataSource
404 at org.apache.hadoop.yarn.server.resourcemanager.webapp.
.<init>(JAXBContextResolver.java:41)
405 at org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWebApp.setup(RMWebApp.java:50)
406 while locating org.apache.hadoop.yarn.server.resourcemanager.webapp.JAXBContextResolver
407
408 1 error
解决:

我这里的情况是由于 java 9 版本引起的, hadoop3.1.0 不兼容 java 9 ,解决方法有两种

一、 修改环境中 jdk 的版本为 8(推荐)
二、修改配置文件 $HADOOP_HOME/etc/hadoop/yarn-env.sh

加入:
export YARN_RESOURCEMANAGER_OPTS="--add-modules=ALL-SYSTEM"
export YARN_NODEMANAGER_OPTS="--add-modules=ALL-SYSTEM"

Hadoop 启动停止方式

各个服务组件逐一启动

  • 分别启动hdfs组件:
    hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode
  • 启动yarn
    yarn-daemon.sh start|stop resourcemanager|nodemanager

    各个模块分开启动(配置ssh是前提)常用

  • 整体启动/停止hdfs
    start-dfs.sh
    stop-dfs.sh
  • 整体启动/停止yarn
    start-yarn.sh
    stop-yarn.sh

    全部启动(不建议使用)

    start-all.sh
    stop-all.sh

文章标题:使用 ansible 部署 hadoop 集群

文章字数:1.8k

本文作者:Waterandair

发布时间:2017-10-16, 18:19:32

最后更新:2019-12-28, 14:03:59

原始链接:https://waterandair.github.io/2017-10-16-install-hadoop.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

github