开源大数据集群部署(二)集群基础环境实施准备
1、部署实施
Ø 下文中$表示系统命令解释器开始符号,且表示所有机器都要执行,如出现[hadoop@hd1.dtstack.com ~]$表示,只在hd1.dtstack.com主机hadoop用户下执行
2.1 环境准备
本次使用到的二进制软件包目录为:系统初始化前提是操作系统已完成安装、各个主机之间网络互通,系统常用命令已安装,本默认这些前提条件已具备,不在阐述。
2.1.1主机环境初始化
安装centos系统完成后需要对主机进行初始化配置和验证工作,在所有主机上(hd1.dtstack.com-hd3)均要进行操作,并按照对应hosts修改主机名:
(主机名必须为xxx.xxx.com 匹配freeipa安装需求)
(1) 主机配置映射(操作权限root)
$ cat>>/etc/hosts <<EOF 172.16.104.226 hd1.dtstack.com 172.16.106.252 hd2.dtstack.com 172.16.107.127 hd3.dtstack.com 172.16.106.165 hd.dtstack.com EOF
(2)关闭防火墙&selinux(操作权限root)
$ systemctl stop firewalld $ systemctl disable firewalld $ setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
(3) 创建集群系统用户(操作权限root)
系统用户 | 属组 | 用途 |
hadoop | hadoop | hadoop集群用户 |
mysql | hadoop | mysql数据库用户 |
hdfs | hadoop | hadoop集群用户 |
trino | hadoop | presto集群用户 |
prometheus | prometheus | 监控平台用户 |
grafana | grafana | 监控平台用户 |
zookeeper | zookeeper | zk集群用户 |
hive | hadoop | hive组件用户 |
yarn | hadoop | hadoop集群用户 |
创建hadoop集群所需用的的用户和用户组
创建示例如下:
[root@hd1.dtstack.com ~]$ remote_op.sh "groupadd hadoo p" [root@hd1.dtstack.com ~]$ remote_op.sh "useradd hive -G hadoop" [root@hd1.dtstack.com ~]$ remote_op.sh "echo hive | passwd --stdin hive"
(4)安装java环境(操作权限root)
本次中java软件包安装目录在/root/bigdata
$ cd /opt/bigdata $ tar -zvxf zulu11.60.19-ca-jdk11.0.17-linux_x64.tar.gz -C /opt tar -zxvf jdk-8u281-linux-x64.tar.gz ln -s /opt/jdk1.8.0_281 /opt/java
2.1.2配置ssh互信
ssh互信配置(操作权限hadoop)
在集群系统 hd1.dtstack.com-hd3.dtstack.com共3台设备上执行如下命令:
$ cd $HOME #在hadoop当前目录下创建ssh互信 $ ssh-keygen -t rsa #一路回车,不需要输入任何信息
将hd1.dtstack.com公钥添加到认证文件中,在hd1.dtstack.com主机root用户当前家目录下执行如下命令:
生产各自的keytab文件
ssh-keygen -t rsa
用ssh-copy-id 把公钥复制到远程主机上,命令也要(以下命令ip需要填写所有节点ip并在每个节点均执行)
ssh-copy-id -i .ssh/id_rsa.pub root@xxx.xxx.xxx
以上命令在三个阶段均要执行
Ø ssh互信验证
hd1.dtstack.com-hd3.dtstack.com主机上互相执行ssh登录命令验证,如下:
[hadoop@hd1.dtstack.com ~]$ ssh hd2.dtstack.com
验证截图如下:
ssh命令执行过去,无报错表示ssh互信配置成功。
Ø root和hdfs以及yarn权限ssh互信
同理操作,配置主机root权限和hdfs以及yarn权限全主机互信。
2.1.3统一环境变量配置
环境变量分两个文件:/etc/profile和各用户下.bashrc(bash),建议/etc/profile根据规划好的目录结构,统一设置环境变量。本次设置将hadoop,zookeeper,hive,java环境变量整体设置完成
[root@hd1.dtstack.com ~]# cat >>/etc/profile.d/bigdata.sh<<EOF
#!/bin/bash
export HADOOP_HOME=/opt/hadoop
export HBASE_HOME=/opt/hbase
export SPARK_HOME=/opt/spark
export SPARK_CONF_DIR=/opt/spark/conf
export HBASE_CONF_DIR=/opt/hbase/conf
export HBASE_LIB=/opt/hbase/lib
export TEZ_HOME=/opt/tez
export TEZ_CONF_DIR=/opt/tez/conf
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_HOME}/lib/native
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$TEZ_HOME/*:$TEZ_HOME/lib/*
export HADOOP_OPTS="-Djava.library.path=${HADOOP_HOME}/lib/native"
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
export HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop
export HIVE_HOME=/opt/hive
export HIVE_CONF_DIR=/opt/hive/conf
export PATH=$PATH:$HIVE_HOME/bin
export ZK_HOME=/opt/zookeeper
#export YARN_CONF_DIR=/opt/hadoop/etc/hadoop
export JAVA_HOME="/opt/java"
export PATH=$HADOOP_HOME/bin:$JAVA_HOME/bin:$ZK_HOME/bin:/opt/mysql/bin:$PATH
export HADOOP_CLASSPATH=`hadoop classpath`
EOF
2.1.4系统调优
hd1.dtstack.com-hd3.dtstack.com所有机器上都要执行,且以root权限执行
Ø 调整swap、内存分配、网络连接参数
$ cat>>/etc/sysctl.conf <<EOF #避免使用swap vm.swappiness = 1 #修改内存分配策略 vm.overcommit_memory=2 vm.overcommit_ratio=90 #网络连接上限 net.core.somaxcomm=32768 EOF
Ø 增大同时打开文件描述符
$ cat>>/etc/security/limits.conf <<EOF hadoop soft nofile 32768 hadoop hard nofile 65536 hadoop soft nproc 32768 hadoop hard nproc 65536 EOF
Ø 关闭THP
$ cat>>/etc/rc.local <<EOF if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi EOF
2.1.5 NTP服务配置
Ø 安装
在hd1.dtstack.com-hd3.dtstack.com各个主机上root权限下执行:
$ yum install -y ntp
配置时间同步服务端
在hd1.dtstack.com主机root权限下执行
Ø ntp配置
$ cat /etc/ntp.conf|grep -v '#'|grep -v ^$ driftfile /var/lib/ntp/drift #存放记录时间误差 restrict default nomodify notrap nopeer noquery #默认拒绝所有来源访问 restrict 127.0.0.1 #开放本机的任何访问 restrict ::1 restrict 172.16.104.0 mask 255.255.255.0 nomodify notrap #允许104网段机器参与ntp同步 includefile /etc/ntp/crypto/pw keys /etc/ntp/keys server 172.16.104.226 #时间同步服务器 server 127.127.1.0 #当上面时间不可用时,以本地时间作为时间服务 fudge 127.0.0.1 stratum 10 disable monitor
说明:
ü server 172.16.104.226表示内网时间同步服务器,其余机器都从这台同步时间
ü server 172.16.104.226可以替换成其他时间服务中心IP(看生产环境配置)
Ø ntp服务启动和验证
启动
service ntpd start
验证
service ntpd status
Active状态为running表示服务启动成功
配置时间同步客户端
在hd2.dtstack.com主机root权限下执行
Ø 配置时间同步服务源
[root@hd2.dtstack.com ~]# cp /etc/ntp.conf /etc/ntp.conf.bak [root@hd2.dtstack.com ~]# cat >/etc/ntp.conf<<EOF driftfile /var/lib/ntp/drift restrict 127.0.0.1 restrict ::1 server 172.16.104.226 restrict 172.16.104.226 nomodify notrap noquery server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10 includefile /etc/ntp/crypto/pw keys /etc/ntp/keys EOF
Ø 手动同步时间(建议第一次手动同步)
$ ntpdate -u 172.16.104.226
Ø 拉起同步服务
service ntpd start
检查方法同上
Ø 同步到其他节点(hd3.dtstack.com、hd2.dtstack.com)
[root@hd2.dtstack.com ~]# scp /etc/ntp.conf root@hd2.dtstack.com:/etc/
Ø 启动其余主机(hd3.dtstack.com)上ntpd服务
[root@hd2.dtstack.com ~]# ssh hd3.dtstack.com 'service ntpd start' [root@hd2.dtstack.com ~]# ssh hd2.dtstack.com'service ntpd start'
Ø 检查其余机器(hd3.dtstack.com)上ntpd服务启动状态
[root@hd2.dtstack.com ~]# ssh hd3.dtstack.com 'service ntpd status' [root@hd2.dtstack.com ~]#ssh hd2.dtstack.com'service ntpd start''
Ø 检查连接情况
[root@hd2.dtstack.com ~]# ntpq -p
2.1.6自动化同步脚本
Ø 配置文件同步脚本【1】remote_scp.sh
[root@hd1.dtstack.com software]# cat /root/bin/remote_scp.sh #!/bin/bash for i in hd{2..3} do #echo $i if [ -d $1 ] then echo -e '\033[33m 当前主机为'$i',传输文件为'$1'\033[0m' scp -rp $1 $i:$2 else #echo "当前节点为$,传输文件为$1" echo -e '\033[33m 当前主机为'$i',传输文件为'$1'\033[0m' scp $1 $i:$2 fi done status=`echo $?` if [ $status -eq 0 ] then echo -e "$1文件传输完成" else echo -e "请检查传入参数" fi
使用案例:
格式:remote_scp.sh 源目录 目标目录
说明:将test.log 分发到hd1.dtstack.com-hd3.dtstack.com/root目录下
Ø 配置文件同步脚本【2】remote_op.sh
[root@hd1.dtstack.com ~]# cat /root/bin/remote_op.sh #!/bin/bash for i in hd2.dtstack.com hd3.dtstack.com do echo -e '\033[33m 当前主机为'$i'\033[0m' ssh $i $1 done
使用案例:
格式:remote_op.sh “执行命令内容”
2.1.7软件包仓库
建议在安装hadoop集群前,提前将所需安装的二进制软件包,统一存放软件包仓库中。
ü 本次使用的软件包都在主机hd1.dtstack.com上/root/bigdata下
2.1.8 keytab生成脚本
在所有节点均需执行此操作
/root/bigdata
vi getkeytabs.sh
set -x CMKEYTAB="/data/kerberos/apache-user.keytab" CMUSER="apache-user" REALM="DTSTACK.COM" IPASERVER="hd.dtstack.com" hosts=`hostname` DEST="$1" FULLPRINC="$2"/${hosts}@${REALM} USER=$2 # Passwd based kinit #echo PASSWORD | kinit $CMUSER@$REALM # Or per keytab (keytab needs to be generated before) kinit -k -t $CMKEYTAB $CMUSER@$REALM PRINC=$( echo $FULLPRINC | sed "s/\@$( echo $REALM )//" ) echo $PRINC echo Retrieving keytab for $FULLPRINC for $DEST echo Checking for existing service principle if ipa service-find $FULLPRINC; then echo Service principle found else echo Service principle not created, creating ipa service-add $FULLPRINC --pac-type=NONE fi echo Ensuring service allows ipa service-allow-create-keytab --users=$CMUSER $FULLPRINC ipa service-allow-retrieve-keytab --users=$CMUSER $FULLPRINC if ipa service-show $FULLPRINC | grep 'Keytab' | grep 'False'; then echo Creating keytab for $FULLPRINC for $DEST ipa-getkeytab -s $IPASERVER -p $PRINC -k $DEST -e rc4-hmac,aes256-cts,aes128-cts else echo Retrieving keytab for $FULLPRINC for $DEST ipa-getkeytab -r -s $IPASERVER -p $PRINC -k $DEST fi chmod 644 $DEST chown $USER:$USER $DEST kdestroy exit 0;