[toc]
CentOS7中用Ambari快速搭建大数据平台
公司的产品是基于大数据平台的,近期要做公司产品私有化部署,因此学习一下 Ambari
本文参考地址 原文链接
1.Ambari简介
Ambari是什么
Ambari 是创建、管理、监视 Hadoop 的集群的软件。这里的 Hadoop 是广义,指的是 Hadoop 整个生态圈(例如 Hive,Hbase,Sqoop,Zookeeper ,Spark ,Flink ,Flume ,Oozie 等),而并不仅是特指 Hadoop。用一句话来说,Ambari 就是为了让 Hadoop 以及相关的大数据软件更容易使用的一个工具。 Ambari 现在所支持的平台组件也越来越多,例如流行的 Spark,Storm 等计算框架,以及资源调度平台 YARN 等,我们都能轻松地通过 Ambari 来进行部署,为想构建大数据平台的初学者提供了很大的便捷。
Ambari 自身也是一个分布式架构的软件,主要由两部分组成:Ambari Server
和 Ambari Agent
。简单来说,用户通过 Ambari Server
通知 Ambari Agent
安装对应的软件;Agent 会定时地发送各个机器每个软件模块的状态给 Ambari Server
,最终这些状态信息会呈现在 Ambari 的 GUI,方便用户了解到集群的各种状态,并进行相应的维护。
Ambari
基于Web的工具,支持Apache Hadoop集群的创建、管理和监控。
HDP
包含了hadoop生态系统的所有软件项目,比如HBase、Zookeeper、Hive
、Pig等等。
HDP-UTILS
工具类库。
HDP-GPL
LZO压缩库软件包存储在单独的HDP-GPL存储库中。
Ambari安装说明
Ambari类似于Ansible,并没有明确的 master/slave 之分
2.环境准备
2.0 安装纯净系统后执行的脚本
#!/usr/bin/env bash
#
# 修改系统yum源为aliyun并添加epel源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
[ ! -e /etc/yum.repos.d/CentOS-Base.repo ] && curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[ ! -e /etc/yum.repos.d/epel.repo ] && curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum makecache
yum -y install tar wget net-tools git vim tree lrzsz htop iftop iotop psmisc python36 python3-devel zlib zlib-devel gcc gcc-c++ conntrack-tools jq socat bash-completion telnet nload strace tcpdump lsof sysstat
# 关闭防火墙、selinux、NetworkManager
systemctl disable firewalld NetworkManager
sed -i '7s/enforcing/disabled/' /etc/selinux/config
# 同步时间计划任务 由于后续要用到ntpserver,因此ntpdate选择不执行
#sed -i '/*\/10 \* \* \* \* \/usr\/sbin\/ntpdate ntp2\.aliyun\.com &>\/dev\/null/d' /var/spool/cron/root
#echo "*/10 * * * * /usr/sbin/ntpdate ntp2.aliyun.com &>/dev/null" >>/var/spool/cron/root
# 历史命令显示时间
sed -i '/HISTFILESIZE=2000/d' /etc/bashrc
sed -i '/HISTSIZE=2000/d' /etc/bashrc
sed -i '/HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "/d' /etc/bashrc
sed -i '/export HISTTIMEFORMAT/d' /etc/bashrc
cat >>/etc/bashrc<<'EOF'
HISTFILESIZE=2000
HISTSIZE=2000
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
export HISTTIMEFORMAT
EOF
source /etc/bashrc
# 修改系统最大文件描述符
sed -i '/root soft nofile 65535/d' /etc/security/limits.conf
sed -i '/root hard nofile 65535/d' /etc/security/limits.conf
sed -i '/* soft nofile 65535/d' /etc/security/limits.conf
sed -i '/* hard nofile 65535/d' /etc/security/limits.conf
cat >>/etc/security/limits.conf<<'EOF'
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
EOF
# 设置pip国内源
mkdir ~/.pip
cat >~/.pip/pip.conf<<EOF
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple/
EOF
# 个人习惯执行命令 netstat -ntpl,所以做一个别名
sed -i.bak "8c alias n='netstat -ntpl'" ~/.bashrc && source ~/.bashrc
reboot
2.1 实验环境
角色 | IP地址 | 主机名 | ambari版本 | 硬件配置 | 系统 | 内核 |
---|---|---|---|---|---|---|
master | 10.0.0.136 | ambari-server01.test.com | 2.6.2.2 | 2c8g | CentOS7.8 | 3.10.0-1127.el7.x86_64 |
slave | 10.0.0.137 | ambari-agent01.test.com | 2.6.2.2 | 2c8g | CentOS7.8 | 3.10.0-1127.el7.x86_64 |
slave | 10.0.0.138 | ambari-agent02.test.com | 2.6.2.2 | 2c8g | CentOS7.8 | 3.10.0-1127.el7.x86_64 |
2.2 配置ssh免密
如无特殊说明,以下操作均在 ambari-server01
节点
2.2.1 编辑环境变量文件
环境变量文件中IP、主机名、子网网段可自行修改
[ -d /opt/ambari/script ] || mkdir -p /opt/ambari/script && cd /opt/ambari/script
cat > env.sh <<EOF
export NODE_IPS=(10.0.0.136 10.0.0.137 10.0.0.138)
export NODE_NAMES=(ambari-server01.test.com ambari-agent01.test.com ambari-agent02.test.com)
export NODE_SUBNET='10.0.0.0/24'
EOF
2.2.2 生成密钥对
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
2.2.3 编辑expect自动化交互脚本
这里机器用户名是 root
,密码是国际标准通用密码 1
,ssh端口 22
执行路径在 /opt/ambari/script
cat > ssh.exp <<'EOF'
#!/usr/bin/expect
if { $argc !=2 } {
send_user "usage: expect ssh.exp file ip\n"
exit
}
set file [lindex $argv 0]
set ip [lindex $argv 1]
set password "1"
spawn ssh-copy-id -i $file -p 22 root@$ip
expect {
"yes/no" {send "yes\r";exp_continue}
"*password" {send "$password\r"}
}
expect eof
EOF
2.2.4 编辑shell脚本循环执行expect脚本
# 编辑脚本
source env.sh
cat > ssh.sh <<'EOF'
#!/bin/bash
for i in ${NODE_IPS[@]}
do
expect ./ssh.exp ~/.ssh/id_rsa.pub $i
done
EOF
# 安装expect
yum -y install expect
# 执行脚本
source ssh.sh
2.3 每个节点配置hosts信息
source /opt/ambari/script/env.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "cat >> /etc/hosts <<EOF
${NODE_IPS[0]} ${NODE_NAMES[0]}
${NODE_IPS[1]} ${NODE_NAMES[1]}
${NODE_IPS[2]} ${NODE_NAMES[2]}
EOF"
done
2.4 禁用防火墙和selinux
这一步已在2.0安装纯净系统后执行的脚本中执行过了
# 禁用防火墙
systemctl stop firewalld && systemctl disable firewalld
# 禁用selinux 临时修改
setenforce 0
# 禁用selinux 永久修改,重启服务器后生效
sed -i '7s/enforcing/disabled/' /etc/selinux/config
2.5 安装JDK8
2.5.1 安装说明
mkdir -p /opt/ambari/pkg
2.5.2 编写jdk安装脚本
cat >/opt/ambari/script/jdk8_install.sh <<'ABC'
#!/usr/bin/env bash
PWD=`pwd`
JDK_PKG=jdk-8u251-linux-x64.tar.gz
# 安装jdk1.8.0_251
tar xf $PWD/$JDK_PKG -C /usr/local
cat >/etc/profile.d/jdk8.sh<<'EOF'
export JAVA_HOME=/usr/local/jdk1.8.0_251
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre:$JAVA_HOME/lib:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH
EOF
# 使jdk命令环境变量生效
source /etc/profile.d/jdk8.sh
# 做一个软连接
ln -sf $JAVA_HOME/bin/java /usr/bin/java
ABC
2.5.3 拷贝jdk安装包和jdk安装脚本到其余节点
source /opt/ambari/script/env.sh
export NODE_IPS=(${NODE_IPS[1]} ${NODE_IPS[2]})
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
scp ${NODE_NAMES}:/opt/ambari/script/jdk8_install.sh ${node_ip}:/opt/ambari/script
scp ${NODE_NAMES}:/opt/ambari/pkg/jdk-8u251-linux-x64.tar.gz ${node_ip}:/opt/ambari/pkg
done
2.5.4 所有节点执行jdk安装脚本
source /opt/ambari/script/env.sh
export NODE_IPS=(${NODE_IPS[1]} ${NODE_IPS[2]})
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} 'source /opt/ambari/script/jdk8_install.sh'
done
2.6 配置时间同步
时间同步可选 ntp 和 chrony,这里选择 chrony
sed中有变量替换,需要使用双引号
2.6.1 各节点安装chrony
source /opt/ambari/script/env.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} yum -y install chrony
done
2.6.2 cdh master节点修改服务器地址为阿里云
sed -i.bak '3,6d' /etc/chrony.conf && sed -i -e '3cserver ntp1.aliyun.com iburst' -e "/^#allow/callow ${NODE_SUBNET}" /etc/chrony.conf
2.6.3 alave节点修改同步服务器为master节点
# 这里选择另外两个节点执行
export NODE_IPS=(${NODE_IPS[1]} ${NODE_IPS[2]})
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} sed -i.bak '3,6d' /etc/chrony.conf && sed -i "3cserver ${NODE_NAMES[0]} iburst" /etc/chrony.conf
done
2.6.4 启动chronyd服务并设置开机自启
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} 'systemctl enable chronyd && systemctl start chronyd'
done
2.6.5 检查端口,chronyd监听udp323端口
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} netstat -nupl|grep chronyd
done
2.6.6 检查同步
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} chronyc sources
done
2.7 安装apache
说明
这里安装 HTTP 主要作用在为后期安装 ambari 制作本地源时候用的
CentOS7.8默认的httpd版本是2.4.6
yum -y install httpd
systemctl enable httpd && systemctl start httpd
2.8 安装mysql
二进制安装的mysql启动脚本 /etc/init.d/mysql
和 安装目录/mysql/bin/mysqld_safe
这两个文件中都是默认在 /usr/local/mysql
,如果安装目录不在 /usr/local/
下,需要修改这两个文件中的路径,即把 /usr/local
替换为mysql安装目录,使用如下命令
sed -i 's#/usr/local#你的mysql安装目录#g' /etc/init.d/mysql /你的mysql安装目录/mysql/bin/mysqld_safe
2.8.1 下载二进制包
mysql5.7.30 md5值 611be3b18a30498b705db773293ad341
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
2.8.2 解压缩mysql二进制包到/usr/local
tar xf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz -C /usr/local
2.8.3 修改名称、做软连接
mv /usr/local/mysql-5.7.30-linux-glibc2.12-x86_64 /usr/local/mysql-5.7.30 &&
ln -s /usr/local/mysql-5.7.30 /usr/local/mysql
2.8.4 创建mysql用户
useradd -M -s /bin/nologin mysql
2.8.5 编辑主配置文件,myql-5.7.30二进制包默认没有mysql配置文件
如果指定了mysql的socket文件位置,则必须添加 [client]
标签并同时指定socket文件位置,否则客户端会默认从 /tmp
下找socket文件
# 备份/etc/my.cnf
mv /etc/my.cnf /etc/my.cnf.old
# 以下配置为最精简版,可根据实际情况进行相应设置
cat >> /etc/my.cnf <<'EOF'
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/var/lib/mysql/mysql.sock
user=mysql
log-error=/usr/local/mysql/data/error.log
[client]
socket=/var/lib/mysql/mysql.sock
EOF
2.8.6 创建socker文件目录、目录文件授权
如果mysql配置文件中指定了socket文件目录,则这个目录的权限必须是mysql,否则mysql会启动失败
mkdir -p /var/lib/mysql
chown -R mysql.mysql /usr/local/mysql* /var/lib/mysql
chown mysql.mysql /etc/my.cnf
2.8.7 拷贝启动脚本
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
2.8.8 初始化mysql
mysql-5.7.22初始化没有提示!!!
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
参数说明
参数 | 说明 |
---|---|
--user | 指定mysql用户 |
--basedir | 指定mysql安装目录 |
--datadir | 指定mysql数据目录 |
--initialize-insecure | 不生成随机密码 |
2.8.9 添加mysql命令环境变量
# 导出mysql命令环境变量
echo "export PATH=/usr/local/mysql/bin:$PATH" > /etc/profile.d/mysql.sh
# 使配置生效
source /etc/profile
2.8.10 配置systemd管理mysql
cat >> /etc/systemd/system/mysqld.service <<'EOF'
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
EOF
2.8.11 启动mysql、检查启动
# 重新加载systemd系统服务
systemctl daemon-reload
# 启动mysql并加入开机自启
systemctl start mysqld && systemctl enable mysqld
# 查看mysql端口
$ netstat -ntpl | grep 3306
tcp6 0 0 :::3306 :::* LISTEN 31349/mysqld
2.8.12 创建ambari数据库及授权
mysql -uroot -e "create database ambari character set utf8mb4"
mysql -uroot -e "grant all on ambari.* to ambari@'localhost' identified by 'ambari'"
mysql -uroot -e "grant all on ambari.* to ambari@'%' identified by 'ambari'"
mysql -uroot -e "flush privileges"
3.安装ambari
3.1 制作ambari本 地源
各包大小
HDP-2.6.5.0-centos7-rpm.tar.gz
6.8G
ambari-2.6.2.2-centos7.tar.gz
1.7G
HDP-UTILS-1.1.0.22-centos7.tar.gz
87M
下载 ambari 、HDP-UTILS、 HDP 包
官方下载地址,可以从这里下载不同版本的包
mkdir /opt/ambari/yum && cd /opt/ambari/yum
wget http://public-repo-1.hortonworks.com/ambari/centos7/2.x/updates/2.6.2.2/ambari-2.6.2.2-centos7.tar.gz
wget http://public-repo-1.hortonworks.com/HDP/centos7/2.x/updates/2.6.5.0/HDP-2.6.5.0-centos7-rpm.tar.gz
wget http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.22/repos/centos7/HDP-UTILS-1.1.0.22-centos7.tar.gz
将3个压缩包解压至 /var/www/html/ambari
mkdir /var/www/html/ambari
tar xf ambari-2.6.2.2-centos7.tar.gz -C /var/www/html/ambari
tar xf HDP-UTILS-1.1.0.22-centos7.tar.gz -C /var/www/html/ambari
tar xf HDP-2.6.5.0-centos7-rpm.tar.gz -C /var/www/html/ambari
3.2 安装制作本地yum源工具
yum -y install yum-utils createrepo
3.3 创建ambari、HDP、HDP-UTILS的repo仓库
如果下载的版本不同,则需要修改 baseurl
和 gpgcheck
中的url路径
3.3.1 创建ambari的repo仓库
source /opt/ambari/script/env.sh
cat > /etc/yum.repos.d/ambari.repo <<EOF
[ambari-2.6.2.2]
name=ambari-2.6.2.2-1
baseurl=http://${NODE_IPS}/ambari/ambari/centos7/2.6.2.2-1/
gpgcheck=1
gpgkey=http://${NODE_IPS}/ambari/ambari/centos7/2.6.2.2-1/RPM-GPG-KEY/RPM-GPG-KEY-Jenkins
enabled=1
priority=1
EOF
3.3.2 创建HDP、HDP-UTILS的repo仓库
cat > /etc/yum.repos.d/hdp.repo <<EOF
[HDP-2.6.5.0]
name=HDP-2.6.5.0
baseurl=http://${NODE_IPS}/ambari/HDP/centos7/2.6.5.0-292/
gpgcheck=1
gpgkey=http://${NODE_IPS}/ambari/HDP/centos7/2.6.5.0-292/RPM-GPG-KEY/RPM-GPG-KEY-Jenkins
enabled=1
priority=1
[HDP-UTILS-1.1.0.22]
name=HDP-UTILS-1.1.0.22
baseurl=http://${NODE_IPS}/ambari/HDP-UTILS/centos7/1.1.0.22/
gpgcheck=1
gpgkey=http://${NODE_IPS}/ambari/HDP-UTILS/centos7/1.1.0.22/RPM-GPG-KEY/RPM-GPG-KEY-Jenkins
enabled=1
priority=1
EOF
3.3.3 生成本地缓存
yum clean all && yum makecache
3.3.4 通过本地源安装ambari
执行此命令会安装 ambari2.6.2.2 和 pg9.2.24
yum -y install ambari-server
4.配置ambari
4.1 下载mysql驱动
由于使用的是mysql5.7,因此必须下载mysql5.7驱动且必须放于 /usr/share/java
下
否则后续会有如下报错,原因是 ambari 默认的 mysql jdbc 驱动不支持 5.6 以上版本
Configuring ambari database...
WARNING: Before starting Ambari Server, you must copy the MySQL JDBC driver JAR file to /usr/share/java and set property "server.jdbc.driver.path=[path/to/custom_jdbc_driver]" in ambari.properties.
Press <enter> to continue.
ERROR: Before starting Ambari Server, you must copy the MySQL JDBC driver JAR file to /usr/share/java and set property "server.jdbc.driver.path=[path/to/custom_jdbc_driver]" in ambari.properties.
ERROR: Exiting with exit code -1.
REASON: Before starting Ambari Server, you must copy the MySQL JDBC driver JAR file to /usr/share/java and set property "server.jdbc.driver.path=[path/to/custom_jdbc_driver]" in ambari.properties.
# 创建/usr/share/java目录
[ -d /usr/share/java ] || mkdir /usr/share/java && cd /usr/share/java
# 下载mysql驱动
wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-5.1.46.tar.gz
# 解压缩包
tar xf mysql-connector-java-5.1.46.tar.gz
# 移动mysql驱动到/usr/share/java,且名称必须为 mysql-connector-java.jar
mv mysql-connector-java-5.1.46/mysql-connector-java-5.1.46.jar /usr/share/java/mysql-connector-java.jar
4.2 启动配置程序
ambari-server setup
4.2.1 提示是否自定义设置 输入:y
Customize user account for ambari-server daemon [y/n] (n)?
4.2.2 设置ambari-server 账号 输入:ambari
Enter user account for ambari-server daemon (root):
4.2.3 设置JDK 输入:3
Checking JDK...
[1] Oracle JDK 1.8 + Java Cryptography Extension (JCE) Policy Files 8
[2] Oracle JDK 1.7 + Java Cryptography Extension (JCE) Policy Files 7
[3] Custom JDK
==============================================================================
Enter choice (1):