使用 ansible 部署 hive (远程 mysql 存储 metadata)

使用 ansible 快速部署 hadoop 集群,服务器节点须有 jdk ,sshd, hadoop, 关于 hadoop 的部署可以参考使用 ansible 部署 hadoop 集群

环境说明

节点:

  • 172.17.0.2
  • 172.17.0.3
  • 172.17.0.4

选择 172.17.0.2 作为 namenode 和 resourcemanager, 在 172.17.0.2 节点安装hive

/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

数据库地址: 192.168.1.102:3306 (用于存储hive元数据)

hadoop 版本: 3.1.0
hive 版本:2.3.3
jdk 版本: 8
mysql-connector 版本: 5.1.46

初始化 role

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

设置要用到的变量

test/hive/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
---
# defaults file for hive
# 版本
hive_version: 2.3.3
# 下载地址
hive_download_url: "https://mirrors.tuna.tsinghua.edu.cn/apache/hive/stable-2/apache-hive-{{ hive_version }}-bin.tar.gz"
# 下载到本地的 ~/Downloads
hive_download_dest: ~/Downloads/apache-hive-{{ hive_version }}-bin.tar.gz
# 下载 mysql-connector 地址
mysql_connector_name: mysql-connector-java-5.1.46
mysql_connector_url: "https://dev.mysql.com/get/Downloads/Connector-J/{{ mysql_connector_name }}.tar.gz"
mysql_connector_download_dest: ~/Downloads/{{ mysql_connector_name }}.tar.gz
# 安装目录
install_dir: /usr/local/
# 软连接地址
soft_dir: "{{ install_dir }}hive"
# 设置环境变量的文件
env_file: /etc/profile
# 部分操作要在 hosts 中设置 hive 为 yes 时才能执行
hive: no
# hive 配置目录
hive_conf_dir: "{{ soft_dir }}/conf/"
hive_lib_dir: "{{ install_dir }}apache-hive-{{ hive_version }}-bin/lib/"

# 配置相关
# mysql 元数据管理 注意字符编码必须是 latin1
mysql_metadata_url: jdbc:mysql://192.168.1.102:3306/docker_hive_metadata?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=latin1
# mysql 用户
mysql_user: root
# mysql 密码
mysql_password: '000000'
hive_metastore_uris: thrift://172.17.0.2:9083

准备 hive 配置文件

test/hive/templates/

  • hive-site.xml.j2 (主要包括 metadata 的 mysql地址, hiveserver 地址)
  • hive-log4j2.properties.j2 (日志地址, 日志级别)
  • llap-cli-log4j2.properties.j2

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

编写 tasks

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

编写 hive,mysql-connector 的下载安装过程

在 test/hive/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
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
---
# 把文件下载到本地
- name: 判断 hive 源文件是否已经下载好了
command: ls {{ hive_download_dest }}
ignore_errors: true
register: file_exist
connection: local

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

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


- name: 判断 mysql connecrtor 源文件是否已经下载好了
command: ls {{ mysql_connector_download_dest }}
ignore_errors: true
register: file_exist
connection: local

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

# 解压到远程服务器的安装目录
- name: 解压 mysql-connector-java-5.1.46.tar.gz
unarchive:
src: "{{ mysql_connector_download_dest }}"
dest: "{{ install_dir }}"
become: true

- name: 移动 mysql-connector-java-5.1.46-bin.jar 到 hive 下的 lib 目录中
shell: "mv {{ install_dir + mysql_connector_name + '/' + mysql_connector_name + '-bin.jar' }} {{ hive_lib_dir }}"
become: true

- name: 删除 mysql-connector-java-5.1.46 文件夹
shell: "rm -rf {{ install_dir + mysql_connector_name }}"
become: true

编写 hive 配置、启动过程

在 test/hive/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
---
- name: 创建软连接
file:
src: "{{ install_dir + 'apache-hive-' + hive_version + '-bin'}}"
dest: "{{ soft_dir }}"
state: link

- name: 设置 hive 环境变量
lineinfile:
dest: "{{env_file}}"
insertafter: "{{item.position}}"
line: "{{item.value}}"
state: present
with_items:
- {position: EOF, value: "\n"}
- {position: EOF, value: "# hive environment"}
- {position: EOF, value: "export HIVE_HOME=/usr/local/hive"}
- {position: EOF, value: "export PATH=$PATH:${HIVE_HOME}/bin"}

# 创建 /tmp 和 /user/hive/warehouse (必须提前启动好 hadoop)
- name: 创建 /tmp
shell: /usr/local/hadoop/bin/hadoop fs -mkdir /tmp
args:
executable: /bin/bash
when: hive == 'yes'

- name: 创建 /user/hive/warehouse
shell: /usr/local/hadoop/bin/hadoop fs -mkdir -p /user/hive/warehouse
args:
executable: /bin/bash
when: hive == 'yes'

- name: 为 /tmp 添加权限
shell: /usr/local/hadoop/bin/hadoop fs -chmod g+w /tmp
args:
executable: /bin/bash
when: hive == 'yes'

- name: 为 /user/hive/warehouse 添加权限
shell: /usr/local/hadoop/bin/hadoop fs -chmod g+w /user/hive/warehouse
args:
executable: /bin/bash
when: hive == 'yes'

- name: 配置 hive-site.xml, 主要包括 metadata 的 mysql地址, hiveserver 地址, Thrift 地址
template:
src: hive-site.xml.j2
dest: "{{ hive_conf_dir }}hive-site.xml"

- name: 配置 llap-cli-log4j2.properties
template:
src: llap-cli-log4j2.properties.j2
dest: "{{ hive_conf_dir }}llap-cli-log4j2.properties"

- name: 配置 hive-log4j2.properties, 日志地址, 日志级别
template:
src: hive-log4j2.properties.j2
dest: "{{ hive_conf_dir }}hive-log4j2.properties"

- name: 初始化 metadata
shell: "source /etc/profile && schematool -dbType mysql -initSchema"
when: hive == 'yes'
args:
executable: /bin/bash

- name: 启动metaStore服务
shell: "source {{ env_file }} && nohup /usr/local/hive/bin/hive --service metastore 1>2&"
when: hive == 'yes'
args:
executable: /bin/bash

#
#- name: 启动thrift2服务
# shell: "source {{ env_file }} && /usr/local/hive/bin/hive --service hiveserver2 &"
# when: hive == 'yes'
# args:
# executable: /bin/bash
# become: true

合并所有 tasks

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

1
2
3
4
---
# tasks file for hive
- import_tasks: download.yml
- import_tasks: init.yml

编写 hosts 文件

在 test/ 目录下新建文件 hosts

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

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

编写启动文件

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

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

执行

在 test/ 目录下执行

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

项目地址

遇到的问题

字符集的问题

ERROR 信息
1
2
3
4
hive> show tables;
FAILED: Error in metadata: MetaException(message:Got exception: javax.jdo.JDODataStoreException An exception was thrown while adding/validating class(es) : Specified key was too long; max key length is 767 bytes
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
解决

这个问题是由于 mysql 数据库数据表的字符集引起的, 应该把字符集改为 latin1

文章标题:使用 ansible 部署 hive (远程 mysql 存储 metadata)

文章字数:1.7k

本文作者:Waterandair

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

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

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

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

目录
×

喜欢就点赞,疼爱就打赏

github