想要进行大数据相关开发、学习,就必须先有一个大数据环境。而面对如此繁多的大数据组件,维护和管理将异常困难,因此有一个好的管理工具,将事半功倍。而 Ambari 就是这样的一个角色,有了它我们将轻松上手大数据。利用这次机会,在公司测试机器上进行部署实践一下。
在这里由衷感谢几篇博客,给予帮助:
一、基础环境配置
1.1 软硬件设施
这边直接用已有的数据库和虚拟机,因此不详细介绍安装过程了
-
准备一个关系型数据库(这里选PG),创建一个
db_bigdata
库 -
准备3台 CentOS7 虚拟机。一台 master(bigdata1),两台 worker(bigdata2,bigdata3)【注意本次操作均为普通用户
ambari
,但是具有sudo权限,因为虚拟机不允许 root 用户操作】ambari
用户(3台主机都要创建,并拥有 sudo 权限)test
用户(作为普通用户,3台都创建)- python 2.7.5(系统自带)
-
准备一个关系型数据库(本文采用PG库,MYSQL也可以,不过推荐5.7,如果是MYSQL8会有问题)
- 创建一个用户(具体用户名、密码自行决定)
- 创建一个库
db_bigdata
- 创建一个模式
ambari
-
本文所使用的软件版本为
ambari-2.7.5.0-72
与HDP-3.1.5.0-152
,以下网盘提供对应包,以及离线的 rpm 包,以及一些相关的东西。【由于虚拟机是提供好的,所以如果本文中出现了一些程序没有安装,且网盘中提供的 rpm 包也没有,请自行放入对应 rpm 包。如果想自己制作,可以等遇到报错的时候,再去下载对应的 rpm 包,可以参考另一片博客 《CentOS离线安装RPM及其依赖包》 】点击获取相关安装包 提取码:bs20
目录清单:
|- mysql-connector-java.jar(数据库驱动) |- jdk-8u251-linux-x64.tar.gz(JDK8) |- jce_policy-8.zip(后面安装kerberos需要) |- Ambari-DDL-Postgres-CREATE.sql(Ambari在PG库中初始化表和数据的脚本) |- Ambari2.7.5+HDP3.1.5 | |- HDP-UTILS-1.1.0.22-centos7.tar.gz | |- HDP-GPL-3.1.5.0-centos7-gpl.tar.gz | |- HDP-3.1.5.0-centos7-rpm.tar.gz | |- ambari-2.7.5.0-centos7.tar.gz |- rpm | |- httpd(目录,里面是安装httpd服务的rpm包,考虑到离线环境,第一个程序包也不多就直接rpm安装了) | |- rpms(目录,里面是各类程序的rpm及其依赖包,httpd搭建好后,制作本地yum源,就可以和联网一样使用了) | | |- repodata(目录,虚拟机可能没有 createrepo 命令,先打包好) | | |- ...(各种 rpm 文件)
如果链接失效了,可以自行制作,其中 rpm 主要为:
createrepo gcc httpd ntp krb5 krb5-libs krb5-server krb5-workstation python-devel python-kerberos redhat-lsb yum-utils postgresql
1.2 环境设置
1.2.1 关闭防火墙
所有主机执行以下命令:
# 关闭防火墙
sudo systemctl stop firewalld.service
# 查看状态
systemctl status firewalld.service
# 关闭开机自启
sudo systemctl disable firewalld.service
1.2.2 设置 hostname、hosts、FQDN
hostname
分别到各主机节点上设置对应的主机名(这个随意自己来定):
# 在 bigdata1 上执行
sudo hostnamectl set-hostname bigdata1
# 在 bigdata2 上执行
sudo hostnamectl set-hostname bigdata2
# 在 bigdata3 上执行
sudo hostnamectl set-hostname bigdata3
hosts
所有主机进行配置 hosts:
sudo vi /etc/hosts
192.168.1.111 bigdata1.wbw.cn bigdata1
192.168.1.112 bigdata2.wbw.cn bigdata2
192.168.1.113 bigdata3.wbw.cn bigdata3
FQDN
分别到各主机节点上设置对应的 FQDN:
sudo vi /etc/sysconfig/network
# 不同机器使用对应的FQDN
# 在 bigdata1 追加
NETWORKING=yes
HOSTNAME=bigdata1.wbw.cn
# 在 bigdata2 追加
NETWORKING=yes
HOSTNAME=bigdata2.wbw.cn
# 在 bigdata3 追加
NETWORKING=yes
HOSTNAME=bigdata3.wbw.cn
以 bigdata1 为例:
1.2.3 关闭 SELINUX
所有主机执行以下命令:
# 临时关闭SELINUX(master node)
sudo setenforce 0
# 永久关闭则需要修改配置文件,【并重启】
sudo vi /etc/selinux/config
# SELINUX=enforcing修改为
SELINUX=disabled
重启机器 reboot
,查看状态:sestatus
1.2.5 设置最大打开文件数
查看最大打开文件数,发现只有1024:
所有节点追加内容:
sudo vi /etc/security/limits.conf
* soft noproc 65535
* hard noproc 65535
* soft nofile 65535
* hard nofile 65535
重新登入会话生效。
1.2.7 设置免密登陆
-
生成 bigdata1 私钥(连续按3次回车)
ssh-keygen -t rsa
-
设置 bigdata1 到 所有节点的免密登陆
ssh-copy-id bigdata1 ssh-copy-id bigdata2 ssh-copy-id bigdata3
-
测试是否可以进行免密登陆
ssh bigdata1 exit ssh bigdata2 exit ssh bigdata3 exit
1.2.8 配置 MySQL 驱动包
上传 mysql 驱动包 mysql-connector-java.jar
,并放入所有机器的 /usr/share/java/
下:
sudo cp mysql-connector-java.jar /usr/share/java/
分发到另外两台
scp mysql-connector-java.jar ambari@bigdata2:/home/ambari/
scp mysql-connector-java.jar ambari@bigdata3:/home/ambari/
分别在另外两台机器上,执行刚才命令,将包放入指定位置。
1.2.9 离线安装 http 服务 (httpd)
-
下载 rpm 包,上传到 bigdata1 服务器节点
apr-1.4.8-7.el7.x86_64.rpm apr-util-1.5.2-6.el7.x86_64.rpm mailcap-2.1.41-2.el7.noarch.rpm httpd-tools-2.4.6-95.el7.centos.x86_64.rpm httpd-2.4.6-95.el7.centos.x86_64.rpm
下载地址:(可以用迅雷下载会快一些,也可以用国内阿里镜像)
mirror.centos.org/centos/7/os… mirror.centos.org/centos/7/os… mirror.centos.org/centos/7/os… mirror.centos.org/centos/7/os… mirror.centos.org/centos/7/os…
-
顺序安装
sudo rpm -ivh apr-1.4.8-7.el7.x86_64.rpm sudo rpm -ivh apr-util-1.5.2-6.el7.x86_64.rpm sudo rpm -ivh mailcap-2.1.41-2.el7.noarch.rpm sudo rpm -ivh httpd-tools-2.4.6-95.el7.centos.x86_64.rpm sudo rpm -ivh httpd-2.4.6-95.el7.centos.x86_64.rpm
-
启动服务、查看状态、设置开机自启
sudo systemctl start httpd systemctl status httpd sudo systemctl enable httpd
-
访问 bigdata1 节点 IP 网址
http://bigdata1.wbw.cn
(如果显示如下结果,即成功。如果无法访问,可能是防火墙或者 SELINUX 没有关闭的原因)
1.2.10 配置 yum 源
-
准备 tar 包
ambari-2.7.5.0-centos7.tar.gz HDP-3.1.5.0-centos7-rpm.tar.gz HDP-GPL-3.1.5.0-centos7-gpl.tar.gz HDP-UTILS-1.1.0.22-centos7.tar.gz
-
将Ambari、HDP、HDP-UTILS、HDP-GPL文件上传到 bigdata1 ,并解压
sudo tar -zxvf ambari-2.7.5.0-centos7.tar.gz -C /var/www/html/ sudo tar -zxvf HDP-3.1.5.0-centos7-rpm.tar.gz -C /var/www/html/ sudo tar -zxvf HDP-UTILS-1.1.0.22-centos7.tar.gz -C /var/www/html/ sudo tar -zxvf HDP-GPL-3.1.5.0-centos7-gpl.tar.gz -C /var/www/html/
同时将提前准备好的 rpm 包(1.1 中有网盘获取地址,也可以自己下载)也上传,放入 httpd 服务可以访问的目录下:
sudo mv rpms /var/www/html/
-
所有节点,配置 ambari 本地 repo 文件
sudo vi /etc/yum.repos.d/ambari.repo # 添加以下内容 [ambari-2.7.5.0-72] name=ambari Version - ambari-2.7.5.0-72 baseurl=http://bigdata1.wbw.cn/ambari/centos7/2.7.5.0-72/ enabled=1 gpgcheck=0
-
所有节点,配置 hdp 本地 repo 文件
sudo vi /etc/yum.repos.d/hdp.repo # 添加以下内容 [HDP-3.1.5.0-152] name=HDP Version - HDP-3.1.5.0-152 baseurl=http://bigdata1.oss.wbw.cn/HDP/centos7/3.1.5.0-152/ enabled=1 gpgcheck=0 [HDP-UTILS-1.1.0.22] name=Hortonworks Data Platform Utils Version - HDP-UTILS-1.1.0.22 baseurl=http://bigdata1.oss.wbw.cn/HDP-UTILS/centos7/1.1.0.22/ gpgcheck=0 enabled=1 [HDP-GPL-3.1.5.0-152] name=HDP-GPL Version - HDP-GPL-3.1.5.0-152 baseurl=http://bigdata1.oss.wbw.cn/HDP-GPL/centos7/3.1.5.0-152/ enabled=1 gpgcheck=0
-
所有节点,配置 基础软件包 本地 repo 文件
sudo vi /etc/yum.repos.d/rpms.repo # 添加以下内容 [rpms] name=rpms baseurl=http://bigdata1.wbw.cn/rpms/ enabled=1 gpgcheck=0
-
在 bigdata1 上执行
createrepo
命令,创建 yum 本地源sudo createrepo /var/www/html/ambari/centos7/2.7.5.0-72/ sudo createrepo /var/www/html/HDP/centos7/3.1.5.0-152/ sudo createrepo /var/www/html/HDP-UTILS/centos7/1.1.0.22/ sudo createrepo /var/www/html/HDP-GPL/centos7/3.1.5.0-152/
如果机器上没有
createrepo
命令,那么先执行第7步,更新一下 yum 源,然后利用刚才上传的基础软件包进行安装:sudo yum install createrepo -y
-
更新各个节点yum源
sudo yum clean all && yum makecache
报错
Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was 14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error" One of the configured repositories failed (Unknown), and yum doesn't have enough cached data to continue. At this point the only safe thing yum can do is fail. There are a few ways to work "fix" this: 1. Contact the upstream for the repository and get them to fix the problem. 2. Reconfigure the baseurl/etc. for the repository, to point to a working upstream. This is most often useful if you are using a newer distribution release than is supported by the repository (and the packages for the previous distribution release still work). 3. Run the command with the repository temporarily disabled yum --disablerepo=<repoid> ... 4. Disable the repository permanently, so yum won't use it by default. Yum will then just ignore the repository until you permanently enable it again or use --enablerepo for temporary usage: yum-config-manager --disable <repoid> or subscription-manager repos --disable=<repoid> 5. Configure the failing repository to be skipped, if it is unavailable. Note that yum will try to contact the repo. when it runs most commands, so will have to try and fail each time (and thus. yum will be be much slower). If it is a very temporary problem though, this is often a nice compromise: yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true Cannot find a valid baseurl for repo: base/7/x86_64
解决方案
由于是离线状态无法连接该网址,所以我们只要把系统自带的源先移走,等有用的时候再发放回去【所有节点都要操作】
# 创建临时目录 [ambari@bigdata1 etc]$ sudo mkdir /etc/yum.repos.d_tmp # 查看源 [ambari@bigdata1 yum.repos.d]$ ll /etc/yum.repos.d total 60 drwxr-xr-x. 2 root root 255 Oct 21 17:57 . drwxr-xr-x. 146 root root 8192 Oct 21 18:16 .. -rw-r--r--. 1 root root 248 Oct 21 17:57 ambari.repo -rw-r--r--. 1 root root 1664 Oct 23 2020 CentOS-Base.repo -rw-r--r--. 1 root root 1309 Oct 23 2020 CentOS-CR.repo -rw-r--r--. 1 root root 649 Oct 23 2020 CentOS-Debuginfo.repo -rw-r--r--. 1 root root 314 Oct 23 2020 CentOS-fasttrack.repo -rw-r--r--. 1 root root 630 Oct 23 2020 CentOS-Media.repo -rw-r--r--. 1 root root 1331 Oct 23 2020 CentOS-Sources.repo -rw-r--r--. 1 root root 8515 Oct 23 2020 CentOS-Vault.repo -rw-r--r--. 1 root root 616 Oct 23 2020 CentOS-x86_64-kernel.repo -rw-r--r--. 1 root root 795 Oct 21 17:17 hdp.repo -rw-r--r--. 1 root root 75 Oct 21 17:17 rpms.repo # 将系统自带的源(CentOS开头的)移到临时目录 [ambari@bigdata1 yum.repos.d]$ sudo mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d_tmp/
然后再次运行命令
-
验证(如果第6步还没做,记得回头看哦)
yum repolist
-
打开浏览器查看是否可以访问:
http://bigdata1.wbw.cn/HDP/centos7/3.1.5.0-152/
,其他类似可能会遇到访问空白的情况,原因是没办法访问该网址:(不过显示问题对安装不影响)
所以只要把对应的 index.html 换个名字即可:
sudo mv /var/www/html/HDP/centos7/3.1.5.0-152/index.html /var/www/html/HDP/centos7/3.1.5.0-152/index.html.bak sudo mv /var/www/html/ambari/centos7/2.7.5.0-72/index.html /var/www/html/ambari/centos7/2.7.5.0-72/index.html.bak
还是不行的,可能要强制刷新下缓存。
1.2.11 离线安装时间同步服务 (ntp)
-
所有节点安装
sudo yum install ntp -y
-
修改 bigdata1 节点配置文件
sudo vi /etc/ntp.conf # 1.设置允许 bigdata2 和 bigdata3 机器可以从这台机器上查询和同步时间,直接追加以下内容 restrict bigdata2 mask 255.255.255.0 nomodify notrap restrict bigdata3 mask 255.255.255.0 nomodify notrap # 2.注释以下代码 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst # 3.追加以下内容(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步) server 127.127.1.0 fudge 127.127.1.0 stratum 10
-
启动 ntp 服务、查看状态、并设置开机自启
sudo systemctl start ntpd systemctl status ntpd sudo systemctl enable ntpd
-
在 bigdata2 和 bigdata3 上配置定时时间同步
sudo crontab -e
追加如下内容:
# 每10分同步一次时间 */10 * * * * /usr/sbin/ntpdate bigdata1.wbw.cn
1.2.12 安装 JDK8
-
在 bigdata1 上执行以下命令,解压到指定目录
sudo tar -zxvf jdk-8u251-linux-x64.tar.gz -C /opt/
-
修改配置文件
sudo vi /etc/profile # 追加内容 JAVA_HOME=/opt/jdk1.8.0_251 export PATH=$JAVA_HOME/bin:$PATH
-
更新配置文件
source /etc/profile
-
验证版本
[ambari@bigdata1 ambari_package]$ java -version java version "1.8.0_251" Java(TM) SE Runtime Environment (build 1.8.0_251-b08) Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)
-
分发到 bigdata2 和 bigdata3
scp jdk-8u251-linux-x64.tar.gz ambari@bigdata2:/home/ambari/ scp jdk-8u251-linux-x64.tar.gz ambari@bigdata3:/home/ambari/
-
在 bigdata2 和 bigdata3 上分别执行刚才解压、添加 JAVA 环境变量、并验证
二、Ambari 安装
2.1 安装 Ambari-Server
-
执行安装命令
sudo yum install -y ambari-server
这里没有用提供的rpm包集合,可能会报错:
Error: Package: ambari-server-2.7.5.0-72.x86_64 (ambari-2.7.5.0-72) Requires: postgresql-server >= 8.1
解决方案
离线安装 postgresql
-
下载 rpm 包(由于需要8.1版本以上,这里选12.4)
postgresql12-libs-12.4-1PGDG.rhel7.x86_64.rpm postgresql12-12.4-1PGDG.rhel7.x86_64.rpm postgresql12-server-12.4-1PGDG.rhel7.x86_64.rpm postgresql12-contrib-12.4-1PGDG.rhel7.x86_64.rpm
下载地址:
download.postgresql.org/pub/repos/y… download.postgresql.org/pub/repos/y… download.postgresql.org/pub/repos/y… download.postgresql.org/pub/repos/y…
-
按顺序安装
sudo rpm -ivh postgresql12-libs-12.4-1PGDG.rhel7.x86_64.rpm sudo rpm -ivh postgresql12-12.4-1PGDG.rhel7.x86_64.rpm sudo rpm -ivh postgresql12-server-12.4-1PGDG.rhel7.x86_64.rpm sudo rpm -ivh postgresql12-contrib-12.4-1PGDG.rhel7.x86_64.rpm
-
重新执行安装命令
-
-
执行 ambari 配置命令
sudo ambari-server setup
可能报错
Enter Database Password (ambari): Invalid characters in password. Use only alphanumeric or _ or - characters
解决方案
这里由于密码中带有特殊字符(
#
),触发报错。最简单的方法就是改数据库用户密码,让密码只包含字母、数字和下划线(_
)执行过程(这里使用PG库来安装,如果显示如下步骤遍执行成功)
注:如果使用MYSQL,MYSQL5.7(没有安装不知道运行情况,不过之前安装过一次其他版本是可以的),但是MYSQL8会有不兼容情况,表名会变成关键字。这也是为什么后来选PG的原因。
[ambari@bigdata1 ~]$ sudo ambari-server setup Using python /usr/bin/python Setup ambari-server Checking SELinux... SELinux status is 'disabled' Customize user account for ambari-server daemon [y/n] (n)? y【自定义ambar -server守护进程的用户帐户】 Enter user account for ambari-server daemon (root):ambari【这里选 ambari 用户】 Adjusting ambari-server permissions and ownership... Checking firewall status... Checking JDK... [1] Oracle JDK 1.8 + Java Cryptography Extension (JCE) Policy Files 8 [2] Custom JDK ============================================================================== Enter choice (1): 2【这里选2,自定义的JDK】 WARNING: JDK must be installed on all hosts and JAVA_HOME must be valid on all hosts. WARNING: JCE Policy files are required for configuring Kerberos security. If you plan to use Kerberos,please make sure JCE Unlimited Strength Jurisdiction Policy Files are valid on all hosts. Path to JAVA_HOME: /opt/jdk1.8.0_251【输入刚刚配置的 JAVA_HOME】 Validating JDK on Ambari Server...done. Check JDK version for Ambari Server... JDK version found: 8 Minimum JDK version is 8 for Ambari. Skipping to setup different JDK for Ambari Server. Checking GPL software agreement... GPL License for LZO: https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html Enable Ambari Server to download and install GPL Licensed LZO packages [y/n] (n)? y【允许】 Completing setup... Configuring database... Enter advanced database configuration [y/n] (n)? y【是否进行数据库配置】 Configuring database... ============================================================================== Choose one of the following options: [1] - PostgreSQL (Embedded) [2] - Oracle [3] - MySQL / MariaDB [4] - PostgreSQL [5] - Microsoft SQL Server (Tech Preview) [6] - SQL Anywhere [7] - BDB ============================================================================== Enter choice (1): 4【PG库是(4),MYSQL的话,就选(3)。注意!(1)是内嵌的PG库,这里我们外部有自己的PG库】 Hostname (localhost): 192.168.xxx.xxx【这里输入数据库地址】 Port (5432): 5432【输入数据库端口,如果不写默认是括号中的内容,可以直接回车】 Database name (ambari): db_bigdata【输入数据库名】 Postgres schema (ambari): 【输入模式,这里直接回车】 Username (ambari): xxxxxx【输入用户名】 Enter Database Password (bigdata): 【输入密码】 Re-enter password: 【再次输入密码】 Configuring ambari database... Configuring remote database connection properties... WARNING: Before starting Ambari Server, you must run the following DDL directly from the database shell to create the schema: /var/lib/ambari-server/resources/Ambari-DDL-Postgres-CREATE.sql Proceed with configuring remote database connection properties [y/n] (y)? 【连接数据库创建表,这里肯定会执行失败,因为配置的JDBC URL有问题,导致连不上数据库,但是没关系可以按照下面的步骤来解决】 Extracting system views... ambari-admin-2.7.5.0.72.jar .... Ambari repo file doesn't contain latest json url, skipping repoinfos modification Adjusting ambari-server permissions and ownership... Ambari Server 'setup' completed successfully.
从语句中获取到对应的数据库初始化 DDL 脚本文件,并进入数据库执行,手动创建元数据表:
WARNING: Before starting Ambari Server, you must run the following DDL directly from the database shell to create the schema: /var/lib/ambari-server/resources/Ambari-DDL-Postgres-CREATE.sql
-
启动 Amber-Server(注意,这里需要用 amber 用户启动,而且不能用 sudo 来执行)
ambari-server start
如果显示如下那么,启动成功:(这里有一个修改 ulimit 失败的,因为我们 ambari 用户没有权限,不过影响)
报错
Using python /usr/bin/python Starting ambari-server Ambari Server running with administrator privileges. Organizing resource files at /var/lib/ambari-server/resources... Ambari database consistency check started... Server PID at: /var/run/ambari-server/ambari-server.pid Server out at: /var/log/ambari-server/ambari-server.out Server log at: /var/log/ambari-server/ambari-server.log Waiting for server start.............................ERROR: Exiting with exit code -1. REASON: Ambari Server java process has stopped. Please check the logs for more information.
进一步查看日志文件:
/var/log/ambari-server/ambari-server.log
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.2.v20151217-774c696): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: org.postgresql.util.PSQLException: ERROR: relation "metainfo" does not exist
继续往上找,发现是 JDBC 中没有 schema 信息造成的:【这也是上面为什么不能自动创建表的原因】
jdbcUrl -> jdbc:postgresql://192.168.xxx.xxx:5432/db_bigdata
解决方案
直接修改配置文件:
sudo vi /etc/ambari-server/conf/ambari.properties
发现有两处地方涉及 JDBC URL,添加上 schema 连接信息:
server.jdbc.rca.url=jdbc:postgresql://192.168.xxx.xxx:5432/db_bigdata?currentSchema=ambari server.jdbc.url=jdbc:postgresql://192.168.xxx.xxx:5432/db_bigdata?currentSchema=ambari
修改后再次启动服务,如果显示如下信息,则启动成功:
Starting ambari-server Ambari Server running with administrator privileges. Organizing resource files at /var/lib/ambari-server/resources... Ambari database consistency check started... Server PID at: /var/run/ambari-server/ambari-server.pid Server out at: /var/log/ambari-server/ambari-server.out Server log at: /var/log/ambari-server/ambari-server.log Waiting for server start......... Server started listening on 8080 Ambari Server 'start' completed successfully.
有可能会启动失败,可以试试删除 PID 文件后再执行:
sudo rm /var/run/ambari-server/ambari-server.pid
-
访问 WEB-UI,如果显示如下界面则安装成功。(默认用户名/密码:
admin
/admin
,端口:8080
)http://bigdat.wbw.cn:8080/
2.2 安装 Ambari-Agent
-
所有主机安装
sudo yum install ambari-agent -y
-
所有主机配置文件修改
sudo vi /etc/ambari-agent/conf/ambari-agent.ini # 修改hostname为主节点的IP或者地址 [server] hostname=bigdata1.wbw.cn
-
启动服务、查看状态(这里需要用到 sudo)
sudo ambari-agent start sudo ambari-agent status
如果显示下图所示,则启动成功(可能需要等一段时间 agent 才会起来):
到此为止,就完成了一半了。接下来,就是对各个大数据组件进行安装了。
三、HDP 安装
3.1 安装基础组件(HDFS、YARN+MapReduce2、Zookeeper、Ambari Metrics)
-
登陆 Amber web 界面
-
创建集群
-
设置集群名字
-
选择 HDP 版本
-
删除掉除了"Redhat7"之外的其他操作系统(这里选择redhat7,因为是CentOS7系统)
-
设置本地 repository,只保留 redhat7,并填写配置好的 HDP本地源【图中hosts可能和文本对不上,没关系,因为涉及公司相关信息,因此图片会有打码,后续整理文章的时候也会对IP、hosts等进行修改。知道换成自己的就可以。后面同理,不做说明】
http://bigdata1.wbw.cn/HDP/centos7/3.1.5.0-152/ http://bigdata1.wbw.cn/HDP-GPL/centos7/3.1.5.0-152/ http://bigdata1.wbw.cn/HDP-UTILS/centos7/1.1.0.22/
-
注册主机,填写 FQDN 以及 SSH 私钥信息
私钥可以通过以下文件获取(注意,里面所有内容,包括
-
符号)vi ~/.ssh/id_rsa
-
选择需要安装的组件,这边我们先简单的选一下基础组件(Hadoop 和 zookeeper,以及 Ambari Metrics),后续再根据需要进行添加(中间会重启多次组件,所以不要装那么多)
忽略2次告警
-
选择服务安装的机器(尽可能的分散一些,缓解压力)
-
选择安装的内容和位置
-
设置密码
-
设置组件目录(保持默认选项,直接下一步)
-
设置组件用户信息(保持默认选项,直接下一步)
-
设置配置信息(保持默认选项,直接下一步)
-
Review 在该页面可以对集群的配置和安装节点进行预览:
-
等待安装完成
这时候可能会安装失败(因为第一次装的时候不知道需要哪些rpm包,现在已整合到1.1中网盘地址):
查看报错信息
stderr: 2022-10-28 20:05:58,032 - The 'hadoop-hdfs-datanode' component did not advertise a version. This may indicate a problem with the component packaging. Traceback (most recent call last): File "/var/lib/ambari-agent/cache/stacks/HDP/3.0/services/HDFS/package/scripts/datanode.py", line 126, in <module> DataNode().execute() File "/usr/lib/ambari-agent/lib/resource_management/libraries/script/script.py", line 352, in execute method(env) File "/var/lib/ambari-agent/cache/stacks/HDP/3.0/services/HDFS/package/scripts/datanode.py", line 45, in install self.install_packages(env) File "/usr/lib/ambari-agent/lib/resource_management/libraries/script/script.py", line 853, in install_packages retry_count=agent_stack_retry_count) File "/usr/lib/ambari-agent/lib/resource_management/core/base.py", line 166, in __init__ self.env.run() File "/usr/lib/ambari-agent/lib/resource_management/core/environment.py", line 160, in run self.run_action(resource, action) File "/usr/lib/ambari-agent/lib/resource_management/core/environment.py", line 124, in run_action provider_action() File "/usr/lib/ambari-agent/lib/resource_management/core/providers/packaging.py", line 30, in action_install self._pkg_manager.install_package(package_name, self.__create_context()) File "/usr/lib/ambari-agent/lib/ambari_commons/repo_manager/yum_manager.py", line 219, in install_package shell.repository_manager_executor(cmd, self.properties, context) File "/usr/lib/ambari-agent/lib/ambari_commons/shell.py", line 753, in repository_manager_executor raise RuntimeError(message) RuntimeError: Failed to execute command '/usr/bin/yum -y install hadoop_3_1_5_0_152', exited with code '1', message: 'Error: Package: hadoop_3_1_5_0_152-3.1.1.3.1.5.0-152.x86_64 (HDP-3.1-repo-1) Requires: redhat-lsb
网上说需要安装下面的两个依赖包:
sudo rpm -ivh libtirpc-0.2.4-0.16.el7.x86_64.rpm sudo rpm -ivh libtirpc-devel-0.2.4-0.16.el7.x86_64.rpm
发现还是不行,才发现最后一行写的,原来缺的是
redhat-lsb
,但是这个软件依赖包太多了,普通方法不行。因此,可以参考另一篇文章进行下载依赖包,然后安装:sudo yum install redhat-lsb -y
安装后重试,继续 HDP 部署:
再次报错,这回缺另外的东西,同样的方法进行安装:
RuntimeError: Failed to execute command '/usr/bin/yum -y install ambari-metrics-monitor', exited with code '1', message: 'Error: Package: ambari-metrics-monitor-2.7.5.0-72.x86_64 (ambari-2.7.5.0-72) Requires: gcc Error: Package: ambari-metrics-monitor-2.7.5.0-72.x86_64 (ambari-2.7.5.0-72) Requires: python-devel
最终虽然安装成功了,但是启动失败。查看报错是因为端口(53)已经被使用了,但是不影响,所以下一步。
-
完成部署
3.2 启动基础组件、删除 SmartSense 组件
-
修复刚才的启动错误(还记得端口被占用吗)
-
启动所有组件
-
删除
SmartSense
服务,没什么用,还会报错 -
最终界面
3.3 HDFS 启动 HA
-
点击HA配置
-
设置命名空间
-
选择组件安装位置
-
确认信息界面,直接下一步
-
在NameNode上创建检查点
# 进入bigdata1节点 [ambari@bigdata1 ~]$ sudo su hdfs -l -c 'hdfs dfsadmin -safemode enter' Safe mode is ON [ambari@bigdata1 ~]$ sudo su hdfs -l -c 'hdfs dfsadmin -saveNamespace' Save namespace successful
执行完以上命令,下一步会亮起
-
等待安装完成,点击下一步
-
初始化JN,然后下一步
sudo su hdfs -l -c 'hdfs namenode -initializeSharedEdits'
-
等待启动服务,然后下一步
-
初始化 NameNode HA 元数据
# 在 bigdata1 执行 sudo su hdfs -l -c 'hdfs zkfc -formatZK'
注意!下一步在另一台机器上执行,具体看页面提示!
# 根据页面提示,在bigdata3 运行 sudo su hdfs -l -c 'hdfs namenode -bootstrapStandby'
最后下一步亮起
-
完成
3.4 ResourceManager 启动 HA
-
点击配置RM HA
-
选择组件安装位置
-
信息确认,直接下一步
-
完成
-
同步 HDFS 配置文件
3.5 安装 Tez
-
添加服务
-
下一步
-
选择客户端安装位置
-
默认选项,下一步
-
完成
-
更新配置文件
3.6 安装 Hive
-
添加服务(后续操作和之前差不多,就不截图了)
-
配置 HIVE 元数据库
根据提示,去 ambari-server 的机器上执行对应命令:
[ambari@bigdata1 ~]$ sudo ambari-server setup --jdbc-db=mysql --jdbc-driver=/usr/share/java/mysql-connector-java.jar Using python /usr/bin/python Setup ambari-server Copying /usr/share/java/mysql-connector-java.jar to /var/lib/ambari-server/resources/mysql-connector-java.jar If you are updating existing jdbc driver jar for mysql with mysql-connector-java.jar. Please remove the old driver jar, from all hosts. Restarting services that need the driver, will automatically copy the new jar to the hosts. JDBC driver was successfully initialized. Ambari Server 'setup' completed successfully.
-
下一步
3.7 安装 HBase
3.7.1 安装
-
前面步骤类似
-
添加2个 HBASE MASTER,作为 HA
-
选择服务
3.7.2 ATSv2 HBase Application 告警
安装后遇到该告警:
Traceback (most recent call last):
File "/var/lib/ambari-agent/cache/stacks/HDP/3.0/services/YARN/package/alerts/alert_ats_hbase.py", line 183, in execute
ats_hbase_app_info = make_valid_json(output)
File "/var/lib/ambari-agent/cache/stacks/HDP/3.0/services/YARN/package/alerts/alert_ats_hbase.py", line 226, in make_valid_json
raise Fail("Couldn't validate the received output for JSON parsing.")
Fail: Couldn't validate the received output for JSON parsing.
这个告警可以先不管。不影响。其实是因为 HDP3.X 新增了 YARN Timeline Service 2.0,该服务存储于 HBase。该服务同时是一个yarn应用:
这篇文章解释的挺详细的:blog.csdn.net/github_3957…
不怎么了解这个,先不解决了。后续解决了再来填坑。
3.8 安装 Spark2
-
跳过重复步骤介绍
-
选择组件(内存不够 spark2 thrift server 可以只选一个节点开)
3.9 安装 Kafka
-
跳过重复步骤介绍
-
选择组件(这里选3个)
四、配置 Kerberos
4.1 安装 JCE
对于 Kerberos 系统来说,默认使用的
AES-256
来进行加密。在集群启用 Kerberos 之前,必须在 Ambari 集群上的每个节点上都装有 JCE。由于 JCE 对应着 JDK 的版本,而本例采用 JDK8,因此去该地址下载:www.oracle.com/technetwork…(网盘中也有提供)
# 1.将下载的 jce_policy-8.zip 上传到 bigdata1,并解压到指定目录下
sudo unzip -o -j -q jce_policy-8.zip -d $JAVA_HOME/jre/lib/security
# 2.分发,并执行
scp jce_policy-8.zip ambari@bigdata2:/home/ambari/
ssh ambari@bigdata2
sudo unzip -o -j -q jce_policy-8.zip -d $JAVA_HOME/jre/lib/security
exit
scp jce_policy-8.zip ambari@bigdata3:/home/ambari/
ssh ambari@bigdata3
sudo unzip -o -j -q jce_policy-8.zip -d $JAVA_HOME/jre/lib/security
exit
# 3.最后重启服务
ambari-server restart
4.2 安装 krb5
这里选择 bigdata1 作为 KDC 服务(因为是离线,需要根据之前的方法,制作对应的 yum 源)
sudo yum -y install krb5-server krb5-libs krb5-workstation
注: KDC (Key Distribution Center)密匙分配中心, 其在kerberos中通常提供两种服务:
- Authentication Service (AS):认证服务
- Ticket-Granting Service (TGS):授予票据服务
4.3 配置 Kerberos 配置文件
注意!该节内容的配置文件中所有默认的
EXAMPLE
已被替换为BIGDATA
修改 krb5.conf
sudo vi /etc/krb5.conf
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
# 注释放开,并修改(也可以不改)
default_realm = BIGDATA.COM
default_ccache_name = KEYRING:persistent:%{uid}
# 认证服务主机名
[realms]
BIGDATA.COM = {
kdc = bigdata1.wbw.cn
admin_server = bigdata1.wbw.cn
}
# 注释放开,且与上面一致
[domain_realm]
.example.com = BIGDATA.COM
example.com = BIGDATA.COM
参数说明
[libdefaults]:每种连接的默认配置,需要注意以下几个关键的小配置
default_realm = EXAMPLE.COM 默认的 realm,必须跟要配置的 realm 的名称一致。
ticket_lifetime 表明凭证生效的时限,一般为24小时。
renew_lifetime 表明凭证最长可以被延期的时限,一般为7天。当凭证过期之后, 对安全认证的服务的后续访问则会失败。
[logging]:表示 server 端的日志的打印位置
[realms]:列举使用的 realm。
kdc:代表安装
kdc server
的机器。格式是机器ip或者主机名admin_server:代表安装
admin server
的机器。格式是机器ip或者主机名EXAMPLE.COM:是设定的realm。名字随意。Kerberos 可以支持多个realms,会增加复杂度。本文不探讨。
大小写敏感,一般为了识别使用全部大写。这个 realm 跟机器的 hostname 没有关系。
修改 kdc.conf
sudo vi /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
# 这里 BIGDATA.COM 要和之前的一致!
[realms]
BIGDATA.COM = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
参数说明
EXAMPLE.COM:是设定的realm,名称随意。Kerberos可以支持多个realms,会增加复杂度。本文不探讨。书写大小写敏感,一般为了识别使用全部大写。这个realm跟机器的hostname没有关系。
master_key_type:和
supported_enctypes
默认使用aes256-cts
。JAVA 使用aes256-cts
验证方式需要安装 JCE 包。acl_file:标注文件路径,用于设置
principal
的权限,需要用户自己创建。文件格式:Kerberos_principalpermissions[target_principal][restrictions]
admin_keytab:KDC 进行校验的 keytab。
supported_enctypes:支持的校验方式。
修改 kadm5.acl
sudo vi /var/kerberos/krb5kdc/kadm5.acl
*/admin@BIGDATA.COM *
文件格式
principal permissions[target_principal][restrictions]
principal:
*/admin@EXAMPLE.COM
permissions:* (*代表所有权限)
target_principal:选填
restrictions:选填
该文件可扩展,扩展链接:web.mit.edu/kerberos/kr…
4.4 设置 Kerberos
-
创建 kerberos 数据库(需要输入密码,这里输入
admin
)我们会输入database的管理密码。这里设置的密码一定要记住,如果忘记了,就无法管理Kerberos server。
kdb5_util create -s -r BIGDATA.COM
[root@hdp02 tars]# kdb5_util create -s -r BIGDATA.COM Loading random data Initializing database '/var/kerberos/krb5kdc/principal' for realm 'BIGDATA.COM', master key name 'K/M@BIGDATA.COM' You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter KDC database master key: Re-enter KDC database master key to verify:
创建好后,会看到以下文件:
[root@hdp02 tars]# ll /var/kerberos/krb5kdc total 24 -rw------- 1 root root 22 Mar 29 01:20 kadm5.acl -rw------- 1 root root 451 Mar 29 01:14 kdc.conf -rw------- 1 root root 8192 Mar 29 01:31 principal -rw------- 1 root root 8192 Mar 29 01:31 principal.kadm5 -rw------- 1 root root 0 Mar 29 01:31 principal.kadm5.lock -rw------- 1 root root 0 Mar 29 01:31 principal.ok
-
创建管理员
admin/admin@BIGDATA.COM
(需要输入密码:admin
)# 进入Kerberos数据库 [ambari@bigdata1 rpms]$ sudo kadmin.local Authenticating as principal root/admin@BIGDATA.COM with password. # 创建admin/admin管理员 kadmin.local: addprinc admin/admin WARNING: no policy specified for admin/admin@BIGDATA.COM; defaulting to no policy Enter password for principal "admin/admin@BIGDATA.COM": Re-enter password for principal "admin/admin@BIGDATA.COM": Principal "admin/admin@BIGDATA.COM" created. kadmin.local: exit
-
启动KDC服务器和KDC管理服务器,并使其开机自启动
sudo systemctl start krb5kdc sudo systemctl start kadmin sudo systemctl enable krb5kdc sudo systemctl enable kadmin
4.5 Ambari 安装 Kerberos 向导
-
点击开启
-
选择模式
-
KDC 、Kadmin 验证
-
测试 kerberos 客户端
-
一路
NEXT
直到结束
4.6 创建票据并认证
在安装了 kerberos 后,hive 客户端和 hdfs 客户端进去是会报错的,因为没有进行身份认证。
-
在所有机器上创建用户
test
作为普通用户 -
在 bigdata1 上执行
sudo kadmin.local
进入客户端 -
添加票据
# 添加票据 kadmin.local: addprinc -randkey test/bigdata1.wbw.cn@BIGDATA.COM # 生成keytab文件 kadmin.local: xst -norandkey -k /etc/security/keytabs/test.service.keytab test/bigdata1.wbw.cn@BIGDATA.COM
-
修改票据权限
sudo chown test:test /etc/security/keytabs/test.service.keytab
-
切换到 test 用户(没有改用户就创建一个,建议所有节点都创建该用户,可以都进行认证,也可以需要的时候进行认证)
其他节点认证前,也要安装
sudo yum -y install krb5-server krb5-libs krb5-workstation
-
认证票据
kinit -kt /etc/security/keytabs/test.service.keytab test/bigdata1.wbw.cn@BIGDATA.COM
-
验证票据
klist
-
配置定时刷新
crontab -e # 添加以下内容,定时认证 0 * * * * kinit -kt /etc/security/keytabs/test.service.keytab test/bigdata1.wbw.cn@BIGDATA.COM
4.7 解决Ambari启用Kerberos认证后NameNode UI 等页面无法打开问题
--namenode ui
在HDFS -> Advanced core-site
set hadoop.http.authentication.simple.anonymous.allowed to true
在HDFS -> Custom core-site
set hadoop.http.authentication.type to simple
set hadoop.proxyuser.HTTP.groups to *
set hadoop.proxyuser.knox.groups to *
set hadoop.proxyuser.knox.hosts to *
set hadoop.proxyuser.yarn.hosts to *
--spark history ui, 在export 前面加#注释掉
在Spark2 -> Advanced spark2-env -> content
{% if security_enabled %}
#export SPARK_HISTORY_OPTS='-Dspark.ui.filters=org.apache.hadoop.security.authentication.server.AuthenticationFilter -Dspark.org.apache.hadoop.security.authentication.server.AuthenticationFilter.params="type=kerberos,kerberos.principal={{spnego_principal}},kerberos.keytab={{spnego_keytab}}"'
{% endif %}
--ResourceManager UI
在yarn -> Advanced ranger-yarn-security
set Add YARN Authorization to false
在yarn -> Custom yarn-site
set yarn.resourcemanager.proxy-user-privileges.enabled to false
4.7.1 NameNode UI、ResourceManager UI
保存,然后更新配置,就可以了。
4.7.2 Spark History UI
4.8 Kerberos 下访问 HBase
开启 kerberos 后,访问 hbase 报错:
hbase(main):001:0> create_namespace 'test'
ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions for user 'test' (global, action=ADMIN)
这时候,就需要自己去添加权限了:
-
切换到 hbase 用户
sudo su hbase
-
然后使用 hbase keytab 进行认证
# 先查看票据信息 bash-4.2$ klist -kt /etc/security/keytabs/hbase.headless.keytab Keytab name: FILE:hbase.headless.keytab KVNO Timestamp Principal ---- ------------------- ------------------------------------------------------ 2 03/29/2022 01:49:30 hbase-bigdata@BIGDATA.COM 2 03/29/2022 01:49:30 hbase-bigdata@BIGDATA.COM 2 03/29/2022 01:49:30 hbase-bigdata@BIGDATA.COM 2 03/29/2022 01:49:30 hbase-bigdata@BIGDATA.COM 2 03/29/2022 01:49:30 hbase-bigdata@BIGDATA.COM # 然后进行认证 bash-4.2$ kinit -kt /etc/security/keytabs/hbase.headless.keytab hbase-bigdata@BIGDATA.COM
-
进入
hbase shell
并授权bash-4.2$ hbase shell hbase(main):001:0> grant 'test', 'RWXCA'
-
回到
test
用户,进行 hbase 操作,创建名称空间成功hbase(main):005:0> create_namespace 'test' Took 0.6601 seconds
4.9 Kerberos 下访问 Spark
开启 kerberos 后,输入 spark-sql
会报错:
Permission denied: user=test, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x
-
先在机器上创建 test 用户
-
在HDFS上创建用户目录
# 创建目录 sudo -u hdfs hdfs dfs -mkdir /user/test # 修改拥有者 sudo -u hdfs hdfs dfs -chown test:hdfs /user/test
新报错,test 用户没有权限提交到 defaulta 队列:
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.yarn.exceptions.YarnException): org.apache.hadoop.security.AccessControlException: User test does not have permission to submit application_1667576038385_0004 to queue default
To enable ACLs, you must set the value of the
yarn.acl.enable
property inyarn-site.xml
totrue
. The default value of this property isfalse
.The default value of
acl_submit_applications
for a root queue isyarn
, which means that only the default yarn user can submit applications to that queue. Therefore, to provide specific users and groups with access to the queue, you must explicitly set the value ofacl_submit_applications
to those users and groups.大概意思就是说,开启ACL的时候,必须设置参数才可以访问队列,默认只有yarn用户可以提交任务。
找了半天 yarn-site.xml
没有找到,原来在 UI 界面配置:
设置该队列:
保存,更新:
然后就可以使用spark了
4.10 Kerberos 下访问 Hive
虽然hive可以进去了,也可以创建库,但是建表的时候缺报错了
Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Got exception: org.apache.hadoop.security.AccessControlException Permission denied: user=test, access=EXECUTE, inode="/warehouse/tablespace/managed/hive":hive:hadoop:drwx------
参考:community.cloudera.com/t5/Support-…
查看权限:
sudo -u hdfs hdfs dfs -getfacl /warehouse/tablespace/managed/hive
执行:
sudo -u hdfs hdfs dfs -setfacl -R -m user:test:rwx /warehouse/tablespace/managed/hive
虽然参考里面说权限只要
r-w
,但是该目录下层才是test.db
,对该目录的写操作,也会影响父级目录,所以也需要父级的写权限
继续报错:
Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Got exception: org.apache.hadoop.security.AccessControlException Permission denied: user=test, access=WRITE, inode="/warehouse/tablespace/managed/hive/test.db":hive:hadoop:drwxrwx---
修改目录拥有者:
sudo -u hdfs hdfs dfs -chown test:hadoop /warehouse/tablespace/managed/hive/test.db
至此,可以创建表了。
当执行语句的时候再次报错(和spark一样,如果你没解决spark会看到这个,解决方法参考4.9,添加用户权限到默认队列中):
User test does not have permission to submit application_1667581643840_0002 to queue default
五、QA
5.1 Yarn 添加新队列
-
打开 yarn 队列管理界面
-
添加队列,就叫做
yarn-system
-
设置队列容量大小
-
分配
yarn-ats
用户到hive-system
队列写法:
[u | g] [username : groupname] [yarn队列的名字]
-
保存并更新
5.2 Spark 无法读取 Hive 表
hive 3.0 之后默认开启ACID功能,而且新建的表默认是 ACID 表。而 spark 目前还不支持 hive 的 ACID 功能,因此无法读取 ACID 表的数据:issues.apache.org/jira/browse…
解决方案
修改以下参数让新建的表默认不是 acid 表。
hive.strict.managed.tables=false
hive.create.as.insert.only=false
metastore.create.as.acid=false
在advanced hive-site.xml里面找,找不到搜一下:
改完更新配置。