使用 ansible 部署 hadoop 集群
创建时间:2017-10-16 18:19
字数:1.8k
使用 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
启动yarnyarn-daemon.sh start|stop resourcemanager|nodemanager
各个模块分开启动(配置ssh是前提)常用
整体启动/停止hdfsstart-dfs.sh
stop-dfs.sh
整体启动/停止yarnstart-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" 转载请保留原文链接及作者。