大数据平台CDH环境迁移手册

1 前言

最近接到了一个工作,将公司线上生产环境的6台安装了CDH以及大数据平台的服务器迁移到客户现场。服务器中有200+T,parquet格式zstd压缩,三副本。可以说数据量非常大了。在这六台迁移完毕后,还需要加入9台服务器到CDH环境中,本篇博客将介绍一下本人在迁移过程中做的一些优化操作以及踩的一些坑。

2 硬件检测与配置优化

首先需要对所有机器做硬件检测和优化。主要包括硬盘的检测个数检查,裸盘的挂载,内存检查,cpu和网卡检查,ntp同步等,最好每台服务器都保持一样的配置,防止有长尾效应。

2.1 磁盘挂载

在检查客户服务器过程中,发现硬盘有两种规格,分别是1T的SSD和7T的SATA盘,经过尝试,需要用两种不同的方法进行挂载。

2.1.1 磁盘大小低于2T

小于2T的磁盘,可以使用fdisk进行分区

  1. 磁盘分区

fdisk /dev/sdb
开始分区后输入 n,新增分区,然后选择 p ,分区类型为主分区。两次回车默认剩余全部空间。最后输入 w 写入分区并退出,若不保存退出输入 q。

  1. 裸盘格式化

mkfs.xfs -f /dev/sdb1

  1. 挂载

mount /dev/sdb /data12/ (手动创建)
sudo blkid (获取uuid 用于自动挂载)
vim /ets/fstab (设置自动挂载)

在这里插入图片描述

加完成后 执行 mount –a 即刻生效

  1. 检查

lsblk -f

2.1.2 磁盘大小大于2T

大于2T发现fdisk分区有问题,后续无法挂载,需要使用parted方式分区,可以使用如下自动挂载脚本

#!/usr/bin/env bash
arr=(a b c d e f g h i j k l )
arrnum=(01 02 03 04 05 06 07 08 09 10 11 12)
num=0
for i in ${arr[@]}  
do
parted /dev/sd$i mklabel gpt mkpart primary 0% 100%
mkfs.xfs -f /dev/sd${i}1
mkdir -p /data${arrnum[$num]}
mount /dev/sd${i}1 /data${arrnum[$num]}
echo `blkid /dev/sd${i}1 | awk '{print $2}' | sed 's/\"//g'` /data${arrnum[$num]} xfs noatime.defaults 0 0 >> /etc/fstab
num=$[$num+1]
done
mount -a

2.2 内存查看

free -h

2.3 cpu检查

cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

2.4 网卡检查

lspci | grep -i net

2.5 ntp同步

在内网无ntp服务器的时候,需要配置一台作为ntp服务器,其他服务器都从这台ntp服务器同步时钟

在/etc/ntp.conf
restrict 附近添加

restrict host

restrict gateway mask

server 127.127.1.0 prefer

在这里插入图片描述

在/etc/ntp.conf
restrict 附近添加

restrict ntp服务器的host
server ntp服务器的host

在这里插入图片描述

service ntpd restart 重启服务

ntpq -p 命令列出当前主机的NTP和上层NTP的状态

remote:上层NTP服务器的IP或者主机名。主要最左边的*

  *:代表目前正在使用中的上层FTP

  +:已经连接成功,且可以作为下一个提供时间服务的候选人。

refid:它指的是给远程服务器(156.0.26.6)提供时间同步的服务器,本机上级的上级NTP服务器。

  为什么显示为LOCAL(0)?

    由于此处为内网环境,无法去外网公用的主机同步时间,因此我们在156.0.26.6上设置的是156.0.26.6自身作为时间服务器同时,使用server 127.127.1.0 prefer指名他的上级NTP为自身。

 st:就是stratum层级。 类似于DNS,NTP是层级结构,有顶端的服务器,最多有15层。 为了减缓负荷和网络堵塞,原则上应该避免直接连接到级别为1的服务器。

when:几秒之前同步过时间

poll:在过多长时间去同步时间。

reach:已经同步时间的次数

delay:网络传输过程中的延迟,单位是10的-6次方秒。

offset:时间修正值,这是个最关键的值, 它告诉了我们本地机和服务器之间的时间差别.。单位是10的-3次方。

jitter:linux系统时间(软件时间)与BIOS硬件时间的差异时间,单位是10的-6次方秒。在主机和NTP服务器同步时间欧,可以使用 hwclock -w将系统时间写入BIOS.

3 os参数优化

接下来需要对操作系统进行优化,由于服务器数量多(15台),一台台执行未免效率太低,可以用如下脚本执行:
这里用到了jq包来解析json配置,将每一台服务器的ip和登录用户配置后即可将脚本复制到每一台服务器上,再通过ssh命令远程执行。

vi script/edit_params.sh

#!/usr/bin/env bash
ipNames=($(jq '.cdh.ipName[].ip' ../ip.json | sed 's/\"//g'))
num=${#ipNames[@]}
USER=`jq '.user' ../ip.json | sed 's/\"//g'`
for ((i=0;i<=num-1;i++))
do
    scp  -r  ../app/edit_param $USER@${ipNames[i]}:/tmp
    ssh $USER@${ipNames[i]} "sh /tmp/edit_param/install.sh"
    ssh $USER@${ipNames[i]} "rm -rf /tmp/edit_param"
done

上述脚本所执行的install.sh脚本

vi app/edit_param/install.sh

#!/usr/bin/env bash
cp /etc/sysctl.conf /etc/sysctl.conf_bak
cat >/etc/sysctl.conf<<EOF
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
## add
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2
net.core.rmem_default = 65535
net.core.rmem_max = 8388608
net.core.wmem_default = 65535
net.core.wmem_max = 8388608
net.core.optmem_max = 40960
net.core.somaxconn= 16384
kernel.sysrq = 1
kernel.core_uses_pid = 1
net.ipv4.tcp_max_tw_buckets = 200000
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 65535 8388608
net.ipv4.tcp_mem = 8388608 8388608 8388608
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.log_martians = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.route.max_size = 5242880
net.ipv4.tcp_reordering = 5
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_max_syn_backlog = 81920
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_retries2=3
net.ipv4.tcp_orphan_retries=2
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.core.netdev_max_backlog = 30000
vm.min_free_kbytes=1048576
vm.dirty_background_ratio=5
vm.dirty_ratio=10
vm.swappiness = 0
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
EOF


cp /etc/security/limits.conf /etc/security/limits.conf_bak

## add system limits config ##
LIMITS=`grep "The parameters of the additional" /etc/security/limits.conf`
if [ "$LIMITS" == "" ];then
cat >>/etc/security/limits.conf<<EOF
## The parameters of the additional ##
* hard nofile 1000000
* soft nofile 1000000
* hard nproc 1000000
* soft nproc 1000000
* hard core unlimited
* soft core unlimited
* hard stack 32768
* soft stack 20470
EOF
fi
if [ "$VER" == "6" ]; then
cp /etc/security/limits.d/90-nproc.conf /etc/security/limits.d/90-nproc.conf_bak
cat >/etc/security/limits.d/90-nproc.conf<<EOF
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

root       soft    nproc     unlimited
*          soft    nproc      1000000
EOF
elif [ "$VER" == "7" ]; then
cp /etc/security/limits.d/20-nproc.conf /etc/security/limits.d/20-nproc.conf_bak
cat >/etc/security/limits.d/20-nproc.conf<<EOF
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

root       soft    nproc     unlimited
*          soft    nproc      1000000
EOF

elif [ "$VER" == "8" ]; then
cp /etc/security/limits.d/20-nproc.conf /etc/security/limits.d/20-nproc.conf_bak
cat >/etc/security/limits.d/20-nproc.conf<<EOF
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

root       soft    nproc     unlimited
*          soft    nproc      1000000
EOF

fi

修改/etc/sysctl.conf文件后 /sbin/sysctl -p立即生效

4 CDH参数优化

4.1 hdfs

1 dfs.datanode.failed.volumes.tolerated 接受的 DataNode 失败的卷 最多可以容忍的dataNode 挂载磁盘故障的个数 建议为挂载磁盘的1/3
在这里插入图片描述
2 NameNode 元数据存放的本地目录 有条件建议用ssd 盘
在这里将data12这块ssd的盘挂载
在这里插入图片描述
3 dfs.datanode.fsdataset.volume.choosing.policy DataNode 存储Block块 策略 默认循环

在这里插入图片描述
4 内存调整 NameNode 生产环境建议16G以上 根据集群的规模大小
在这里插入图片描述
在这里插入图片描述

4.2 yarn

之前在客户现场遇到过yarn线程爆满的情况,通过cdh监控看到大约如下图所示
在这里插入图片描述
分析原因

nodeManager的请求数太大,线程达到上限。

所以在机器配置和性能允许的情况下,需要修改这部分配置。
yarn.resourcemanager.scheduler.client.thread-count:默认50,处理来自ApplicationMaster的RPC请求的Handler数目,根据生产环境实际作业运行数量 建议适当调大

yarn.resourcemanager.resource-tracker.client.thread-count:默认50,处理来自NodeManager的RPC请求的Handler数目

在这里插入图片描述
在这里插入图片描述
内存配置: 根据生产环境适当调大

在这里插入图片描述
在这里插入图片描述
其他:
大数据平台如果用spark的话,使用yarn-cluster方式提交,这种方式对比yarn-client方式,可以减少很多网络交互,虽然日志量减少,但是可以提升性能。
这一块详情可参考官网或
https://blog.csdn.net/zxr717110454/article/details/80636569

5 平台迁移模拟

5.1 停止

  1. 停止集群

在这里插入图片描述

  1. 停止cloudera management service

在这里插入图片描述

  1. 停止scm-server和scm-agent以及superviseord
    /opt/cm-5.14.3/etc/init.d/cloudera-scm-server stop
    /opt/cm-5.14.3/etc/init.d/cloudera-scm-agent stop(每一台)
    停止后通过以下命令查看
    /opt/cm-5.14.3/etc/init.d/cloudera-scm-server status
    /opt/cm-5.14.3/etc/init.d/cloudera-scm-agent status
    ps -ef |grep scm
    后kill残余的superviseord
    日志查看
    agent 日志 /opt/cm-5.14.3/log/cloudera-scm-agent/
    server 日志/opt/cm-5.14.3/log/cloudera-scm-server/

若日志有所不同,可以通过find / -name "cloudera-scm-agent.log"或find / -name “cloudera-scm-server.log” 搜索

  1. mysql元数据备份恢复
    在迁移前,对元数据进行备份,是需要记得的,防止后续修改元数据出问题。
    在导出mysql数据库的时候加上–hex-blob参数防止乱码。
    mysqldump -uroot -p --default-character-set=utf8 –-all-databases –-hex-blob > all.sql
    若改出问题了,可以通过下述命令恢复。
    mysql -uroot -p<all.sql

5.2 修改配置

迁移修改配置主要是ip和host迁移,这里分两种情况讨论。

5.2.1 只修改ip

  1. host文件
    vi /etc/hosts,修改后scp到每一套服务器
  2. mysql元信息
    修改HOSTS表,修改ip和host对应关系。

在这里插入图片描述

注意:为确保正确迁移, Cloudera Management Service中,AP,ES,HM,SM都和scm-server部署在一台机器。本人在测试集群上发现分开部署无法启动的情况,因为server启动agent需要ServiceMonitor提供服务,如果部署在其他机器上,由于agent还没启动就没法访问到,变成一个死循环了。
这种时候就只能手工启动了,比较麻烦。建议还是将Cloudera Management Service中的所有组件全部署在和scm-server同一台服务器上。

5.2.2 修改ip+host

修改host需要注意更多事情

  1. host文件
    vi /etc/hosts,修改后scp到每一套服务器

  2. mysql元信息
    修改HOSTS表,修改ip和host。

  3. 修改scm-server的/opt/cm-5.14.3/etc/cloudera-scm-server/db.properties文件里面mysql访问的host

  4. 修改 /opt/cm-5.14.3/etc/cloudera-scm-agent/config.ini 里面scm-server的host

  5. 修改hive的metastore的host
    在这里插入图片描述

  6. 修改每个表的元数据,包括hive metastore中SERDE_PARAMS表(*)

SDS表

在这里插入图片描述

DBS表
update DBS set DB_LOCATION_URI=replace(DB_LOCATION_URI,‘ga1’,‘testga1’);

在这里插入图片描述

  1. 应用替换配置文件
    这里应用包括大数据平台上的Hadoop配置文件,还有一些依赖组件的配置文件,这里需要讲的一点是,如果部署了redis_sentinel,需要手工修改一下配置文件,因为运行时候,会把host改成ip,所以这时候配置里面应该还是老的ip。

此外注意的一个地方是:host不能有下划线,切记!!!不然agent启动不了而且无日志!本人在这里卡了很久。。。

5.3 启动cdh

1)先启动scm-server

/opt/cm-5.14.3/etc/init.d/cloudera-scm-server start

/opt/cm-5.14.3/etc/init.d/cloudera-scm-server status查看状态

server日志/opt/cm-5.14.3/log/cloudera-scm-server/

2)启动完成后去scm-server:7180用admin/admin登录后,启动Cloudera Management Service

在这里插入图片描述

  1. 正常后再每台服务器上启动scm-agent

/opt/cm-5.14.3/etc/init.d/cloudera-scm-agent start

/opt/cm-5.14.3/etc/init.d/cloudera-scm-agent status查看状态

server 日志/opt/cm-5.14.3/log/cloudera-scm-agent/

6 CDH平台扩容

执行advance-cdh.sh 去掉脚本里mysql,keepalived等配置,安装预环境,java环境。

然后拷贝python环境/opt/python以及hadoop native包/usr/install/Libraries/ 拷贝到每一台。

python环境拷贝到每一台是因为executor执行python时需要在每个nodemanager的位置放上python环境。
/usr/install/Libraries/下包括zstd.so,snappy.so等本地包。

7 服务启停

停止
sudo systemctl stop datacompute
sudo systemctl stop jobserver
sudo systemctl stop bifrost
sudo systemctl stop redis
sudo systemctl stop redis_sentinel
sudo systemctl stop mysqld

启动
sudo systemctl start datacompute
sudo systemctl start jobserver
sudo systemctl start bifrost
sudo systemctl start redis
sudo systemctl start redis_sentinel
sudo systemctl start mysqld

8 注意点

  1. scm启动前需要先启动mysql

  2. redis的sentinel使用的是ip地址,在迁移后,需要手动修改ip配置,不然dc和jobserver无法启动。

  3. 一键部署脚本预先需要:

建用户,和ip.json中的user和passwd一致,比如admin。
将用户添加到/etc/sudoers中,比如admin ALL=(ALL) NOPASSWD: ALL

  1. 一键部署脚本安装mysql需要两个(含)节点以上,不然mysql配置会写不进,启动报错。

  2. 为确保正确迁移, Cloudera Management Service中,AP,ES,HM,SM都和scm-server部署在一台机器,分开部署无法启动
    如果遇到无法启动,把所有agent杀干净,然后AP,ES,HM,SM这些部署在scm-server上,然后再一个个启动。若启动不了,kill干净,superviser杀干净

  3. host不能有下划线,切记!!!不然agent启动不了而且无日志!

9 现场遇到的问题与解决

  1. 客户环境新加入9台服务器,之前的hive表经过文件重平衡后,发现无法读取,报错如下所示,缺少zstd的本地库

在这里插入图片描述

原因分析:
问题原因是,新加入9台服务器,上面这些so包没有。然后我刚刚执行了重平衡导致数据部分移动到了新服务器上,所以执行select新机器上的文件就不能解析了

解决方法:
将老服务器上/usr/install/Libraries/目录拷贝到所有新服务器上,重启服务,成功。
对应的路径配置在大数据平台中如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2efu70e7-1614433953871)(.CDH迁移手册_images/fa648fe6.png)]

  1. 页面关闭hdfs的balancer后无法启动

报错java.io.IOException: Another Balancer is running… Exiting .
这个其实后台还在运行。需要强制杀的话执行ps -ef |grep balancer后杀掉。

10 帮助脚本

批量执行脚本和批量copy文件是非常常见的操作,将这两个操作提取出公用的脚本,区分普通用户和root用户

./exec.sh date

./scp_r.sh /etc/hosts /etc

类似如此

用户批量执行

vi script/exec.sh

#!/usr/bin/env bash
ipNames=($(jq '.cdh.ipName[].ip' ../ip.json | sed 's/\"//g'))
num=${#ipNames[@]}
USER=`jq '.user' ../ip.json | sed 's/\"//g'`
for ((i=0;i<=num-1;i++))
do
    echo ${ipNames[i]}
    ssh $USER@${ipNames[i]} $*
done

root批量执行

vi script/exec_r.sh

#!/usr/bin/env bash
ipNames=($(jq '.cdh.ipName[].ip' ../ip.json | sed 's/\"//g'))
num=${#ipNames[@]}
USER="root"
for ((i=0;i<=num-1;i++))
do
    echo ${ipNames[i]}
    ssh $USER@${ipNames[i]} $*
done

用户批量copy文件

vi script/scp.sh

#!/usr/bin/env bash
ipNames=($(jq '.cdh.ipName[].ip' ../ip.json | sed 's/\"//g'))
num=${#ipNames[@]}
USER=`jq '.user' ../ip.json | sed 's/\"//g'`
for ((i=0;i<=num-1;i++))
do
    echo ${ipNames[i]}
    scp -r $1 $USER@${ipNames[i]} $2
done

root批量执行

vi script/scp_r.sh

#!/usr/bin/env bash
ipNames=($(jq '.cdh.ipName[].ip' ../ip.json | sed 's/\"//g'))
num=${#ipNames[@]}
USER="root"
for ((i=0;i<=num-1;i++))
do
    echo ${ipNames[i]}
    scp -r $1 $USER@${ipNames[i]} $2
done

其他更多的一键化部署脚本可以在本人github上看到。
https://github.com/pj1987111/hongyinotes/tree/main/hongyilab/devops

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值