ambari centos7 amr架构安装
随着ARM架构服务器在能效比和成本效益上的优势日益凸显,越来越多的企业选择在ARM平台上构建大数据基础设施。Apache Ambari作为Hadoop生态系统不可或缺的集群管理和监控工具,其在ARM环境下的部署成为关键一环。然而,与成熟的x86_64平台相比,在CentOS 7 ARM (aarch64) 架构上安装Ambari面临独特的挑战,如特定依赖包的获取、潜在的兼容性问题以及配置细节的差异。
本指南旨在为您提供一份清晰、详尽且经过实践验证的路线图,手把手引导您完成整个Ambari在CentOS 7 ARM服务器上的安装与初始化过程。我们不仅会按步骤分解从系统准备、依赖安装、Ambari Server/Agent配置到集群引导的完整流程,更将重点聚焦于ARM架构特有的“陷阱”与解决方案。
安装包来源
华为鲲鹏
HiDataPlus
【网盘下载】: pan.baidu.com/s/1z_Yk-inz…
操作步骤
1.修改添加集群部署用户(root可以跳过)
createUser.sh
#create user
groupadd ocdp
useradd -g ocdp -d /home/ocdp ocdp
#set password
echo "NMhnmt20@%" | passwd --stdin ocdp
#set sudo
cp /etc/sudoers /etc/sudoers_bak
echo "ocdp ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
2.设置免密登录
setHosts.sh
echo "0.0.0.0 0.0.0.0" >> /etc/hosts;
for i in {01..3};
do
echo "136.192.61.$[10#$i+185-1] hadoop-$i" >> /etc/hosts;
done
sshScript.sh
#! /bin/bash
ssh-keygen -t rsa
# 136.192.61 改为集群所在网段(和hosts中配置对应)
ALL_CLIENTS=`cat /etc/hosts| grep "136.192.61" | awk '{print $2}'`
for client in $ALL_CLIENTS
do
echo "=============copy-ssh-id $client============="
ssh-copy-id $client
done
allInOneScript.sh
shell
#!/bin/bash
# 参数校验
if [ -z "$1" ]; then
echo "Usage: $0 <ip_prefix> (e.g., 136.192.61)"
exit 1
fi
# 获取ipprefix参数
ippre=$1
# 更新 /etc/hosts 文件
echo "0.0.0.0 0.0.0.0" >> /etc/hosts
for i in {01..3}; do
echo "$ippre.$((10#$i + 185 - 1)) hadoop-$i" >> /etc/hosts
done
# 生成SSH Key(如果没有)
if [ ! -f "$HOME/.ssh/id_rsa" ]; then
ssh-keygen -t rsa -N "" -f "$HOME/.ssh/id_rsa"
else
echo "SSH key already exists. Skipping key generation."
fi
# 读取所有主机名
ALL_CLIENTS=`cat /etc/hosts | grep "$ippre" | awk '{print $2}'`
# 分发公钥到所有主机
for client in $ALL_CLIENTS; do
echo "=============copy-ssh-id $client============="
ssh-copy-id $client
done
echo "Script execution completed."
使用说明
-
将合并后的脚本保存为
allInOneScript.sh,并赋予执行权限:shell chmod +x allInOneScript.sh -
执行脚本时,传入集群所在网段(例如
136.192.61)作为第一个参数:shell ./allInOneScript.sh 136.192.61
脚本解释
-
参数化处理:
ippre用作传入集群IP前缀的变量,便于脚本复用。- 使用
$1参数动态传递网段。
-
防止SSH Key重复生成:
- 如果文件
$HOME/.ssh/id_rsa已存在,跳过SSH密钥生成步骤。
- 如果文件
-
对
/etc/hosts的动态更新:- 使用 bash 算术扩展生成
136.192.61.x的动态IP,每个IP以hadoop-x昵称绑定。
- 使用 bash 算术扩展生成
-
动态分发公钥:
- 根据
/etc/hosts内容,自动分发SSH公钥到所有的hadoop-x主机。
- 根据
测试范例
假设目标网段是 136.192.61,脚本运行后会对以下内容进行配置:
-
/etc/hosts将包含以下条目:plaintext 0.0.0.0 0.0.0.0 136.192.61.185 hadoop-01 136.192.61.186 hadoop-02 136.192.61.187 hadoop-03 -
自动将当前机器的公钥分发到
hadoop-01、hadoop-02、hadoop-03。
3.配置repo
挂载iso yum源(离线需要)
setup_iso_yum.sh
bash
#!/bin/bash
# 参数校验
if [ $# -ne 1 ]; then
echo "Usage: $0 <path_to_iso>"
echo "Example: $0 /path/to/CentOS-7-aarch64-Everything-2009.iso"
exit 1
fi
# 变量定义
ISO_PATH=$1
MOUNT_DIR="/mnt"
YUM_REPO_DIR="/etc/yum.repos.d"
BAK_DIR="${YUM_REPO_DIR}/bak"
# 确认 ISO 文件是否存在
if [ ! -f "$ISO_PATH" ]; then
echo "Error: ISO file $ISO_PATH not found!"
exit 1
fi
# 挂载 ISO 文件
echo "Mounting ISO file: $ISO_PATH to $MOUNT_DIR..."
mount -o loop "$ISO_PATH" $MOUNT_DIR
if [ $? -ne 0 ]; then
echo "Error: Failed to mount ISO file!"
exit 1
fi
echo "ISO mounted successfully!"
# 备份现有的 yum .repo 文件
echo "Creating backup directory for existing .repo files: $BAK_DIR..."
mkdir -p "$BAK_DIR"
mv $YUM_REPO_DIR/*.repo "$BAK_DIR/"
if [ $? -ne 0 ]; then
echo "Error: Failed to move existing .repo files to backup directory!"
exit 1
fi
echo "Backup completed!"
# 创建新的 ISO yum 仓库 repo 文件
NEW_REPO_FILE="$YUM_REPO_DIR/CentOS-iso.repo"
echo "Creating new yum repo file: $NEW_REPO_FILE..."
cat > "$NEW_REPO_FILE" <<EOF
[centos-iso]
name=CentOS ISO Repository
baseurl=file://$MOUNT_DIR
enabled=1
gpgcheck=0
EOF
echo "New yum repo file created successfully!"
# 清理 yum 缓存
echo "Cleaning yum cache..."
yum clean all
# 生成新的 yum 缓存
echo "Generating yum cache..."
yum makecache
if [ $? -ne 0 ]; then
echo "Error: Failed to generate yum cache!"
exit 1
fi
echo "Yum cache generated successfully!"
# 提示用户 ISO 已只读挂载
echo "Note: The ISO has been mounted as read-only at $MOUNT_DIR."
echo "Setup completed successfully!"
ambari.repo
[ambari-2.7.4.0]
name=ambari Version - 2.7.4.0
baseurl=http://10.41.104.187/ambari/centos7/2.7.4.0-118/
gpgcheck=1
gpgkey=http://10.41.104.187/ambari/centos7/RPM-GPG-KEY/RPM-GPG-KEY-Jenkins
enabled=1
HDP.repo
[HDP]
name=HDP Repository
baseurl=http://10.41.104.187/HDP/centos7/3.1.4.0-315
enabled=1
gpgcheck=0
HDP-UTILS.repo
[HDP-UTILS]
name=HDP Utils Repository
baseurl=http://10.41.104.187/HDP-UTILS/centos7/1.1.0.22/
path=/
enabled=1
gpgcheck=0
configure_repo.sh
bash
#!/bin/bash
# 参数校验
if [ $# -ne 3 ]; then
echo "Usage: $0 <host_ip> <tar_path> <web_path>"
echo "Example: $0 192.168.111.201 /path/to/tar/files /var/www/html"
exit 1
fi
# 参数定义
HOST_IP=$1 # 主机 IP 地址
tar_path=$2 # 存放原始 TAR 文件路径
web_path=$3 # 解压路径(Web Server 仓库部署路径)
# 安装必要软件
yum -y install httpd createrepo
systemctl enable httpd
systemctl restart httpd
# 确保解压目录可访问
chmod -R 755 "$web_path"
# 解压软件包并生成仓库
TAR_FILES=("ambari-2.7.4.0-centos7.tar.gz" "HDP-3.1.4.0-centos7-rpm.tar.gz" "HDP-UTILS-1.1.0.22-centos7.tar.gz")
for tar_file in "${TAR_FILES[@]}"; do
echo "Extracting $tar_file to $web_path..."
tar -zxvf "$tar_path/$tar_file" -C "$web_path/"
done
# 创建 YUM 仓库元数据(可以不做)
REPO_DIRS=("$web_path/ambari" "$web_path/HDP")
for repo_dir in "${REPO_DIRS[@]}"; do
echo "Creating YUM metadata in $repo_dir..."
createrepo --update "$repo_dir"
done
# 清理并更新 YUM 缓存
echo "Cleaning YUM cache..."
yum clean all
echo "Rebuilding YUM cache..."
yum makecache
# 创建 `ambari.repo` 文件 如果不做创建 YUM 仓库元数据需要改成上面的repo文件
cat > /etc/yum.repos.d/ambari.repo <<EOF
[ambari-2.7.4.0]
name=ambari Version - 2.7.4.0
#需要加上/2.7.4.0-118/ 即http://$HOST_IP/ambari/centos7/2.7.4.0-118/
baseurl=http://$HOST_IP/ambari/centos7/
gpgcheck=1
gpgkey=http://$HOST_IP/ambari/centos7/RPM-GPG-KEY/RPM-GPG-KEY-Jenkins
enabled=1
EOF
# 创建 `HDP.repo` 文件
cat > /etc/yum.repos.d/HDP.repo <<EOF
[HDP]
name=HDP Repository
baseurl=http://$HOST_IP/HDP/centos7/3.1.4.0-315
enabled=1
gpgcheck=0
EOF
# 创建 `HDP-UTILS.repo` 文件
cat > /etc/yum.repos.d/HDP-UTILS.repo <<EOF
[HDP-UTILS]
name=HDP Utils Repository
#需要加上centos7/1.1.0.22/ 即http://$HOST_IP/HDP-UTILS/centos7/1.1.0.22/
baseurl=http://$HOST_IP/HDP-UTILS/
enabled=1
gpgcheck=0
EOF
echo "Repository setup completed successfully!"
# mysql connect
mkdir -p /usr/share/java/
cp /opt/mysql-connector-java-5.1.38.jar /usr/share/java/
mv /usr/share/java/mysql-connector-java-5.1.38.jar /usr/share/java/mysql-connector-java.jar
4.初始化集群主机 如果不是root用户需要在命令前加sudo
总脚本init.sh
init.sh
bash
#!/bin/bash
# 参数校验
if [ $# -ne 2 ]; then
echo "Usage: $0 <hostname_prefix> <script_path>"
echo "Example: $0 hadoop- /home"
exit 1
fi
# 参数赋值
hostnamepre=$1 # 主机名前缀
shpath=$2 # 脚本路径
# 首次循环执行初始化
for i in {01..3}; do
echo "==== Starting configuration for ${hostnamepre}${i} ===="
# 修改 net.core.somaxconn
sysctl -w net.core.somaxconn=32768
# 设置主机名
ssh "${hostnamepre}${i}" hostnamectl set-hostname "${hostnamepre}${i}"
ssh "${hostnamepre}${i}" sed -i "s/localhost.localdomain/${hostnamepre}${i}/g" /etc/hostname
# 创建用户(需要root权限且已配置免密登录)
scp "${shpath}/createUser.sh" "${hostnamepre}${i}:${shpath}/"
ssh "${hostnamepre}${i}" sh "${shpath}/createUser.sh"
# 同步 /etc/hosts
scp /etc/hosts "${hostnamepre}${i}:/etc/"
# 停止并禁用 firewalld
ssh "${hostnamepre}${i}" systemctl disable firewalld
ssh "${hostnamepre}${i}" systemctl stop firewalld
# 禁用 vm.swappiness
ssh "${hostnamepre}${i}" sysctl vm.swappiness=0
ssh "${hostnamepre}${i}" "echo vm.swappiness=0 >> /etc/sysctl.conf"
# 安装 JDK
scp "${shpath}/jdk-8u201-linux-x64.tar.gz" "${hostnamepre}${i}:${shpath}/"
scp "${shpath}/installJDK.sh" "${hostnamepre}${i}:${shpath}/"
ssh "${hostnamepre}${i}" "sh ${shpath}/installJDK.sh"
ssh "${hostnamepre}${i}" "source /etc/profile"
# 修改系统资源限制
scp "${shpath}/modifyLimits.sh" "${hostnamepre}${i}:${shpath}/"
ssh "${hostnamepre}${i}" "sh ${shpath}/modifyLimits.sh"
# 分发 Ambari Repo,清理并生成缓存
scp /etc/yum.repos.d/ambari.repo "${hostnamepre}${i}:/etc/yum.repos.d/"
ssh "${hostnamepre}${i}" "yum clean all && yum makecache"
echo "==== Configuration for ${hostnamepre}${i} completed ===="
done
# 配置关闭 SELinux 和 THP
for i in {01..3}; do
scp "${shpath}/closeSelinux.sh" "${hostnamepre}${i}:${shpath}/"
scp "${shpath}/closeTHP.sh" "${hostnamepre}${i}:${shpath}/"
ssh "${hostnamepre}${i}" "sh ${shpath}/closeSelinux.sh"
ssh "${hostnamepre}${i}" "sh ${shpath}/closeTHP.sh"
# 重启服务器
ssh "${hostnamepre}${i}" reboot
done
echo "All configurations are completed!"
解释
-
参数化:
hostnamepre:主机名前缀,例如hadoop-或pass-eda-hdp-,灵活支持不同的主机命名规则。shpath:脚本路径,例如/home或其他路径。涉及的脚本和文件以此路径为基础进行操作。
-
动态主机名:
- 使用
${hostnamepre}${i}动态生成目标主机名,例如hadoop-01、hadoop-02、hadoop-03。
- 使用
-
JDK 安装:
- 将 JDK tar 包和安装脚本
installJDK.sh上传到对应目标机器后,直接调用脚本完成安装。
- 将 JDK tar 包和安装脚本
-
系统配置:
- 包括调整内核参数,修改资源限制,部署 Ambari Repo,禁用 SELinux 和透明大页(THP)。
-
函数式脚本分发:
- 为各类操作以及资源分发(如
createUser.sh、modifyLimits.sh等)提供统一功能入口,提升脚本的整体可维护性。
- 为各类操作以及资源分发(如
使用方法
-
将脚本保存为
init.sh,并赋予执行权限:bash chmod +x init.sh -
确保以下辅助脚本或资源文件已经准备完毕:
/home/createUser.sh /home/installJDK.sh /home/jdk-8u201-linux-x64.tar.gz /home/modifyLimits.sh /home/closeSelinux.sh /home/closeTHP.sh /etc/hosts /etc/yum.repos.d/ambari.repo -
执行脚本:
bash ./init.sh hadoop- /home或根据实际情况替换参数:
bash ./init.sh pass-eda-hdp- /data/scripts
示例
假设 hostnamepre 为 hadoop- 且 shpath 为 /home,脚本会自动完成以下任务:
- 为
hadoop-01、hadoop-02和hadoop-03执行一系列初始化任务。 - 根据
/home路径自动上传所需脚本和资源文件。 - 自动化所有集群初始化配置(包括 JDK 安装、资源限制、网络和防火墙设置等)。
closeSelinux.sh
#! /bin/bash
echo "******** CLOSE SELINUX *********"
setenforce 0
file=/etc/selinux/config
sed -i "7s/^/#/" $file
sed '7 iSELINUX=disabled' -i $file
echo "******** END ********"
closeTHP.sh
#! /bin/bash
echo "******** CLOSE THP *********"
echo "if test -f /sys/kernel/mm/transparent_hugepage/enabled; then" >> /etc/rc.d/rc.local
echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.d/rc.local
echo "fi" >> /etc/rc.d/rc.local
echo "if test -f /sys/kernel/mm/transparent_hugepage/defrag; then" >> /etc/rc.d/rc.local
echo "echo never > /sys/kernel/mm/transparent_hugepage/defrag" >> /etc/rc.d/rc.local
echo "fi" >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
echo "******** END ********"
installJDK.sh
#! /bin/bash
echo "******** JDK ********"
path=/opt/
userAndGroup=ocdp:ocdp
tar -xvf ${path}jdk-8u201-linux-x64.tar.gz -C ${path}
chown -R ${userAndGroup} ${path}jdk1.8.0_201
ln -s ${path}jdk1.8.0_201 ${path}jdk
chown -R ${userAndGroup} ${path}jdk
# 我这里是没有配置过环境变量的新机器,所以可以直接在/etc/profile 后追加
# 如果已经有环境变量可根据具体情况使用sed -i等命令配置
echo "export JAVA_HOME=${path}jdk" >> /etc/profile
echo "export PATH=\$PATH:\$JAVA_HOME/bin" >> /etc/profile
echo "export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar" >> /etc/profile
rm -rf /usr/bin/java
rm -rf /usr/bin/javac
#hostname=`"hostname"`
#ssh $hostname "source /etc/profile;java -version;exit"
source /etc/profile
echo "******* JDK installation completed ********"
modifyLimits.sh
#! /bin/bash
echo "******** Modify system limits ********"
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
echo "ocdp - nofile 65535" >> /etc/security/limits.conf
echo "ocdp - nproc 65535" >> /etc/security/limits.conf
echo "******** END ********"
create_ambari_user.sh
bash
#!/bin/bash
# MySQL 根用户信息
MYSQL_USER="root"
MYSQL_PASS="your_mysql_root_password"
# 数据库名称、用户和密码 hive库ranger库需要
DB_NAME="ambari"
DB_USER="ambari"
DB_PASS="bigdata"
# 登录 MySQL 执行 SQL 命令
mysql -u"$MYSQL_USER" -p"$MYSQL_PASS" <<EOF
-- 创建数据库
CREATE DATABASE IF NOT EXISTS $DB_NAME;
-- 创建用户并设置密码
CREATE USER IF NOT EXISTS '$DB_USER'@'%' IDENTIFIED BY '$DB_PASS';
-- 授予权限
GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 查询用户列表,验证是否创建成功
SELECT User, Host FROM mysql.user WHERE User = '$DB_USER';
use ambari;
source /var/lib/ambari-server/resources/Ambari-DDL-MySQL-CREATE.sql;
EOF
echo "Database '$DB_NAME' and user '$DB_USER' with password '$DB_PASS' have been created and configured!"
使用说明
-
保存脚本文件: 保存为
create_ambari_user.sh。 -
赋予执行权限:
bash chmod +x create_ambari_user.sh -
运行脚本: 使用 MySQL 根用户执行脚本,确保替换
your_mysql_root_password为 MySQL 的实际root密码:bash ./create_ambari_user.sh -
验证: 在 MySQL 中运行以下命令进行验证:
sql SHOW DATABASES; SHOW GRANTS FOR 'ambari'@'%';
注意事项
-
MySQL 版本问题:
-
从 MySQL 5.7 开始,
CREATE USER和GRANT被推荐分别使用。 -
如果 MySQL 版本较低(如 5.5 或 5.6),可以直接使用:
sql GRANT ALL PRIVILEGES ON ambari.* TO 'ambari'@'%' IDENTIFIED BY 'bigdata';
-
-
远程访问设置: 如果要允许所有主机访问 MySQL,需确保 MySQL 配置文件(如
/etc/my.cnf或/etc/mysql/my.cnf)中未限制绑定的网络接口。检查以下配置:ini [mysqld] bind-address = 0.0.0.0如果存在
bind-address字段且值为127.0.0.1,需将其修改为0.0.0.0(表示允许任意 IP 连接)。修改完成后重启 MySQL 服务:
bash systemctl restart mysqld -
防火墙配置: 确保 MySQL 的默认端口
3306是开放的,可以通过以下命令开放:bash firewall-cmd --permanent --add-port=3306/tcp firewall-cmd --reload
最终验证
在任意远程主机上,通过 mysql 客户端连接进行验证:
bash
mysql -uambari -pbigdata -h<主机IP> -P3306
如果连接成功,则表示配置完成,无需进一步操作。若连接失败,请检查以下内容:
- 用户是否正确创建,并对数据库拥有权限;
- MySQL 配置文件是否允许远程访问;
- 防火墙是否允许访问 MySQL 服务。
上述脚本和指南应能顺利完成 ambari 用户的创建及数据库赋权任务。