CentOS 7 ARM架构安装Ambari:详尽步骤与避坑指南

296 阅读7分钟

ambari centos7 amr架构安装

随着ARM架构服务器在能效比和成本效益上的优势日益凸显,越来越多的企业选择在ARM平台上构建大数据基础设施。Apache Ambari作为Hadoop生态系统不可或缺的集群管理和监控工具,其在ARM环境下的部署成为关键一环。然而,与成熟的x86_64平台相比,在CentOS 7 ARM (aarch64)  架构上安装Ambari面临独特的挑战,如特定依赖包的获取、潜在的兼容性问题以及配置细节的差异。

本指南旨在为您提供一份清晰、详尽且经过实践验证的路线图,手把手引导您完成整个Ambari在CentOS 7 ARM服务器上的安装与初始化过程。我们不仅会按步骤分解从系统准备、依赖安装、Ambari Server/Agent配置到集群引导的完整流程,更将重点聚焦于ARM架构特有的“陷阱”与解决方案

安装包来源

华为鲲鹏

HDP-GPL

HDP-UTILS

ambari

HDP OpenJDK

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."

使用说明

  1. 将合并后的脚本保存为 allInOneScript.sh,并赋予执行权限:

    shell
    chmod +x allInOneScript.sh
    
  2. 执行脚本时,传入集群所在网段(例如 136.192.61)作为第一个参数:

    shell
    ./allInOneScript.sh 136.192.61
    

脚本解释

  1. 参数化处理

    • ippre 用作传入集群IP前缀的变量,便于脚本复用。
    • 使用 $1 参数动态传递网段。
  2. 防止SSH Key重复生成

    • 如果文件 $HOME/.ssh/id_rsa 已存在,跳过SSH密钥生成步骤。
  3. /etc/hosts的动态更新

    • 使用 bash 算术扩展生成 136.192.61.x 的动态IP,每个IP以 hadoop-x 昵称绑定。
  4. 动态分发公钥

    • 根据 /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-01hadoop-02hadoop-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!"

解释

  1. 参数化

    • hostnamepre:主机名前缀,例如 hadoop- 或 pass-eda-hdp-,灵活支持不同的主机命名规则。
    • shpath:脚本路径,例如 /home 或其他路径。涉及的脚本和文件以此路径为基础进行操作。
  2. 动态主机名

    • 使用 ${hostnamepre}${i} 动态生成目标主机名,例如 hadoop-01hadoop-02hadoop-03
  3. JDK 安装

    • 将 JDK tar 包和安装脚本 installJDK.sh 上传到对应目标机器后,直接调用脚本完成安装。
  4. 系统配置

    • 包括调整内核参数,修改资源限制,部署 Ambari Repo,禁用 SELinux 和透明大页(THP)。
  5. 函数式脚本分发

    • 为各类操作以及资源分发(如 createUser.shmodifyLimits.sh 等)提供统一功能入口,提升脚本的整体可维护性。

使用方法

  1. 将脚本保存为 init.sh,并赋予执行权限:

    bash
    chmod +x init.sh
    
  2. 确保以下辅助脚本或资源文件已经准备完毕:

    /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
    
  3. 执行脚本:

    bash
    ./init.sh hadoop- /home
    

    或根据实际情况替换参数:

    bash
    ./init.sh pass-eda-hdp- /data/scripts
    

示例

假设 hostnameprehadoop-shpath/home,脚本会自动完成以下任务:

  • 为 hadoop-01hadoop-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!"

使用说明
  1. 保存脚本文件: 保存为 create_ambari_user.sh

  2. 赋予执行权限

    bash
    chmod +x create_ambari_user.sh
    
  3. 运行脚本: 使用 MySQL 根用户执行脚本,确保替换 your_mysql_root_password 为 MySQL 的实际 root 密码:

    bash
    ./create_ambari_user.sh
    
  4. 验证: 在 MySQL 中运行以下命令进行验证:

    sql
    SHOW DATABASES;
    SHOW GRANTS FOR 'ambari'@'%';
    

注意事项

  1. MySQL 版本问题

    • 从 MySQL 5.7 开始,CREATE USER 和 GRANT 被推荐分别使用。

    • 如果 MySQL 版本较低(如 5.5 或 5.6),可以直接使用:

      sql
      GRANT ALL PRIVILEGES ON ambari.* TO 'ambari'@'%' IDENTIFIED BY 'bigdata';
      
  2. 远程访问设置: 如果要允许所有主机访问 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
    
  3. 防火墙配置: 确保 MySQL 的默认端口 3306 是开放的,可以通过以下命令开放:

    bash
    firewall-cmd --permanent --add-port=3306/tcp
    firewall-cmd --reload
    

最终验证

在任意远程主机上,通过 mysql 客户端连接进行验证:

bash
mysql -uambari -pbigdata -h<主机IP> -P3306

如果连接成功,则表示配置完成,无需进一步操作。若连接失败,请检查以下内容:

  • 用户是否正确创建,并对数据库拥有权限;
  • MySQL 配置文件是否允许远程访问;
  • 防火墙是否允许访问 MySQL 服务。

上述脚本和指南应能顺利完成 ambari 用户的创建及数据库赋权任务。