[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