使用 ansible 部署 hive (远程 mysql 存储 metadata)
创建时间:2017-10-23 18:19
字数:1.7k
使用 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" 转载请保留原文链接及作者。