前言

这里记录一下如何使用CDH部署大数据集群。

环境准备

这里准备了3台虚拟机用于本次的部署:

主机名IP角色
cdh-node1192.168.122.52CM Server Mysql 数据节点 CM Agent
cdh-node2192.168.122.53数据节点 CM Agent
cdh-node3192.168.122.54数据节点 CM Agent

操作系统为:CentOS 7.4

额外的资源情况

dns server: 192.168.122.1

如果不使用dns server需要在每个节点的/etc/hosts文件中添加如下内容:

1
2
3
192.168.122.52 cdh-node1.nil.ml
192.168.122.53 cdh-node2.nil.ml
192.168.122.54 cdh-node3.nil.ml

节点配置

设置(每个节点)只有内存使用到90%才可以使用swap

编辑/etc/sysctl.conf文件:

1
vi /etc/sysctl.conf

添加内容如下:

1
vm.swappiness = 10

使其生效:

1
sysctl -p /etc/sysctl.conf

设置hugepage相关参数:

编辑/etc/rc.local文件:

1
vi /etc/rc.local

在文件末尾追加如下内容:

1
2
echo never >/sys/kernel/mm/transparent_hugepage/defrag
echo never >/sys/kernel/mm/transparent_hugepage/enabled

保存退出。

直接给/etc/rc.local文件添加执行权限是不生效的,需要给/etc/rc.d/rc.local这个原文件添加执行权限:

1
chmod +x /etc/rc.d/rc.local

启动并开机启动rc-local服务:

1
2
systemctl enable rc-local
systemctl start  rc-local

配置主机名,ip并关闭selinux和防火墙,最后重启:

cdh-node1.nil.ml

1
2
3
4
5
6
hostnamectl set-hostname cdh-node1.nil.ml
nmcli con mod eth0 ipv4.method manual ipv4.addresses 192.168.122.52/24 ipv4.dns "192.168.122.1, 114.114.114.114" ipv4.gateway 192.168.122.1 connection.autoconnect yes
nmcli con up eth0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
systemctl disable firewalld
reboot

cdh-node2.nil.ml

1
2
3
4
5
6
hostnamectl set-hostname cdh-node2.nil.ml
nmcli con mod eth0 ipv4.method manual ipv4.addresses 192.168.122.53/24 ipv4.dns "192.168.122.1, 114.114.114.114" ipv4.gateway 192.168.122.1 connection.autoconnect yes
nmcli con up eth0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
systemctl disable firewalld
reboot

cdh-node3.nil.ml

1
2
3
4
5
6
hostnamectl set-hostname cdh-node3.nil.ml
nmcli con mod eth0 ipv4.method manual ipv4.addresses 192.168.122.54/24 ipv4.dns "192.168.122.1, 114.114.114.114" ipv4.gateway 192.168.122.1 connection.autoconnect yes
nmcli con up eth0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
systemctl disable firewalld
reboot

NTP Server

在集群中很重要的一个就是时间同步服务,时间不一致可能导致出现各种问题。

首先每个节点设置同样的时区:

1
timedatectl set-timezone "Asia/Shanghai"

cdh-node1节点上配置NTP服务器,首先安装chrony

1
yum install chrony -y

修改/etc/chrony.conf配置文件,修改内容如下:

1
2
server ntp.aliyun.com iburst
allow 192.168.122.0/24

开机启动chronyd服务并启动:

1
systemctl enable chronyd.service --now

查看服务状态:

1
systemctl status chronyd.service

其他节点上也部署 chrony:

1
yum install chrony -y

修改/etc/chrony.conf配置文件,修改内容如下:

1
server cdh-node1.nil.ml iburst

重启chronyd服务:

1
systemctl restart chronyd.service

查看同步状态:

1
chronyc sources

安装数据库

cdh-node1节点上配置数据库

创建并编辑/etc/yum.repos.d/mysql.repo内容如下:

1
2
3
4
5
[mysql57]
name=mysql57
baseurl = https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql57-community-el7/
enable = 1
gpgcheck = 0

安装mysql:

1
yum install mysql-community-server -y

配置数据库

首先启动mysql并将开机启动:

1
systemctl enable mysqld --now

查看默认的mysql密码:

1
2
grep password /var/log/mysqld.log
2021-07-09T13:45:25.747757Z 1 [Note] A temporary password is generated for root@localhost: JPwlGsN)q4,)

使用这个密码连接到数据库:

1
mysql -uroot -p

更改默认的数据库密码(不建议使用弱密码):

1
2
3
set global validate_password_policy=0;
set global validate_password_length=6;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

创建需要用到的数据库并授权:

1
2
3
4
5
CREATE DATABASE scm DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE am DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE hive DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE oozie DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE hue DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

创建登录用户并授权:

1
2
3
4
5
6
grant all on scm.* to 'scm'@'%' identified by '123456';
grant all on am.* to 'am'@'%' identified by '123456';
grant all on hive.* to 'hive'@'%' identified by '123456';
grant all on oozie.* to 'oozie'@'%' identified by '123456';
grant all on hue.* to 'hue'@'%' identified by '123456';
FLUSH PRIVILEGES;

配置局域网yum源

这里取决于应用场景,比如说是离线的内网环境就需要准备一个离线的源来让各个节点获得服务运行的必要依赖。

这里用到了一个Connector,可以在里面下载rpm包的版本。

这里使用httpd进行发布。

部署httpd

1
yum install httpd -y

删除原有的配置文件;

1
2
3
rm -f /etc/httpd/conf.d/welcome.conf
rm -f /etc/httpd/conf.d/autoindex.conf
rm -f /etc/httpd/conf.d/userdir.conf

创建并编辑局域网yum源vhost文件:

1
vi /etc/httpd/conf.d/cdh.conf

内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<VirtualHost cdh-node1.nil.ml:80>
    DocumentRoot "/var/www/cloudera-repos"
    ServerName cdh-node1.nil.ml
</VirtualHost>

<Directory "/var/www/cloudera-repos">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

保存退出之后将httpd加入开机启动并启动:

1
systemctl enable httpd --now

查看服务状态:

1
systemctl status httpd

上传所有的包到cdh-node1节点的/var/www/cloudera-repos目录:

确保服务器上安装了rsync 如果没有安装可以使用包管理进行安装

1
rsync -avz cloudera-repos -e ssh root@192.168.122.50:/var/www

在cm节点上配置cm的yum源:

1
vi /etc/yum.repos.d/cloudera-repo.repo

内容如下:

1
2
3
4
5
[cloudera-repo]
name=cloudera-repo
baseurl=http://cdh-node1.nil.ml/cm6/6.2.1/redhat7/yum/
enabled=1
gpgcheck=0

安装CM

安装jdk(cdh-node1节点)

1
yum install -y http://cdh-node1.nil.ml/cm6/6.2.1/redhat7/yum/RPMS/x86_64/oracle-j2sdk1.8-1.8.0+update181-1.x86_64.rpm

配置/etc/profile(cdh-node1节点)

编辑/etc/profile文件:

1
vi /etc/profile

在末尾追加如下内容:

1
2
3
4
export JAVA_HOME=/usr/java/jdk1.8.0_181-cloudera
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib

保存退出之后重新载入一下:

1
. /etc/profile

验证:

1
java -version

JDBC(cdh-node1节点)

1
yum install http://cdh-node1.nil.ml/mysql-connector-java-8.0.25-1.el7.noarch.rpm -y

安装cm-server

cdh-node1节点安装:

1
yum install cloudera-manager-daemons cloudera-manager-agent cloudera-manager-server -y

使用创建数据库的脚本:

1
/opt/cloudera/cm/schema/scm_prepare_database.sh mysql scm scm 123456

说明一下这个脚本的参数:

  • mysql 数据库类型这里我们使用的是mysql
  • scm 数据库
  • scm 用户
  • 123456 密码

启动:

1
2
systemctl start cloudera-scm-server
systemctl enable cloudera-scm-server

查看启动日志直到出现:

1
2
2021-07-27 15:24:05,530 INFO WebServerImpl:org.eclipse.jetty.server.Server: Started @55780ms
2021-07-27 15:24:05,530 INFO WebServerImpl:com.cloudera.server.cmf.WebServerImpl: Started Jetty server.

这个时候我们用浏览器打开

http://cdh-node1.nil.ml:7180

就可以看到CM的管理页面了:

cdh login page

默认的账户和密码是:

用户名:admin 密码:admin

部署集群

首先登陆CM的页面: http://cdh-node1.nil.ml:7180

登陆之后会到欢迎界面: welcome page 这里有许多的内容比如说release notes,新的功能和已知的一些问题,建议好好阅读一下。

选择继续后到了用户协议的页面,这里建议阅读一下,如果没有啥疑问选择同意然后选择继续:

user license

这里让我们选择的我们需要的版本,这里提供了三种:

  1. 免费(实际上现在也是收费了)
  2. 60天的企业适用
  3. 输入企业许可证

根据实际的需要选择需要的版本,这里选择免费的许可然后选择继续:

select edition

这里我们跳到了添加集群的欢迎界面:

add cluster welcome page

同样的这里也有一些快速链接可以参考查看,比如说安装手册、支持的操作系统、支持的数据库、支持的JDK版本。

这里让我们设置集群的名称,我这里保持默认的Cluster 1。当然你也可以设置自己想要的集群名称以方便区分未来的不同环境的集群:

add cluster basics

这里我们需要指定我们安装的主机:

Specify Hosts 这里输入三台节点的主机名:

1
2
3
cdh-node1.nil.ml
cdh-node2.nil.ml
cdh-node3.nil.ml

然后按search按钮,搜索的结果如下:

search hosts

和我们之前规划的一致选择继续:

select repo

这里的Custom Repository 我们不需要进行修改,我们需要设置一下Parcels的地址,点击More Optionsremote repo 这里改成我们内网源的url,选择保存更改。

现在我们发现有一个CDH可以,同时也可以进行安装了:

done repo

现在我们来到了接受JDK许可的界面,选择接受然后按继续:

accept jdk license

这里是比较重要的一个步骤,登陆凭证,如果你是密钥对登陆需要将私钥复制粘贴进来,最好这个私钥的公钥已经发送到每个节点上了,或者是所有节点的密码一致:

enter credentials

在选择继续后就进入到了安装agent的环节,耐心等待安装完成:

install agent 在agent安装完成之后会自动跳到安装Parcels的界面:

install parcels

安装parcels完成之后会自动跳到添加集群的最后一个界面就是检查集群的界面,这里有两个检查一个是检查网络,一个是检查节点: Inspect Cluster

根据测试的结果如果有不能通过的需要检查原因修复之后重新检查直至检查通过: inspect cluster pass 通过后选择继续I understand the risks, let me continue with cluster creation.

现在我们来到了添加服务的页面:

add services

这里我们选择自定义服务:

custom services

这里选择 HDFS,Zookeeper然后选择继续:

assign roles 在这个角色这里,注意zookeeper和datanode服务要选择所有的节点(如果是双数节点比如说6那么最好减掉一个节点或者是添加一个节点)

setup databases 这里设置一下Activity Monitor的数据库,然后点一下测试链接,没有问题之后选择继续。

这里可以设置一些HDFS块的大小,DataNode,NameNode的存储位置以及报警等等可以根据实际的需求进行设置:

Review Changes

这里就是实际安装集群的一些细节,如果出现错误可以在这里进行查看修改后重新检查: Command Details

最后选择完成: Summary

完成安装之后我们就可以进入到集群的状态页面啦:

Cluster Status

故障排除

这里我们可以看到有1个健康告警,在All Health Issues中可以看到是一个Erasure Coding Policy Verification TestAll Health Issues

我们可以点进去看详细的信息:

Erasure Coding Policy Verification Test 这里我们可以看到提示的信息开启这个功能需要9个DataNode,我们当前只有3个所以这个功能是不能使用的,我们可以选择添加一些DataNode来启动或者是选择关掉。

这里选择关掉这个功能:

change policy

然后我们回到HDFS的主页面,这里可以看到有一个类似于电源的按钮:

hdfs bt 这个其实是当我们更改了一个服务的配置之后都会有的一个提示,我们点进去:

cdh-stale-config

这里类似于一个diff,展示我们更改的内容。这里可以看到dfs.namenode.ec.system.default.policy的值从RS-6-3-1024k改为了空,我们选择重启服务。

这里提示我们是否要将client的配置文件也重新部署一下,这里要注意选择上,节点配置不一样可能出现奇奇怪怪的问题: review changes 然后选择重启。

同样的这里也有一个指向命令详细的输出:

change command d

选择完成之后我们回到了主页,这里可以看到刚刚的健康警告没有了,但是还有3个配置警告: cdh config wa

我们点进去看一下都是什么原因:

cdh config wa d

  • Java Heap Size 4096
  • non-Java memory size 一个是 2GiB 2048 一个是 6GiB 6144

这里我们按照推荐的大小进行设置即可,设置完成之后重启:

Java heap

最终可以看到服务都正常了:

all done

添加服务

我们这里以添加一个hive服务为例子,选择添加服务

add new services

我们首先要选择添加yarn(hive依赖于yarn去调度,所以我们得先创建yarn):

add new services yarn

资产的角色:

add yarn Assign Roles

add yarn review change

这里可以看到命令的详细信息: yarn command details

最终可以看到完成:

yarn summary

接下来我们添加hive的服务

选择hive:

add new services hive

cdh add new services hive select dependencies

节点的角色:

cdh add new services hive assign roles

初始化数据库: cdh add new services hive setup databases 查看变更: cdh add new services hive review changes 命令详情: cdh add new services hive command details 摘要: cdh add new services hive summary

完成: cdh add done

## 后记

CDH的部署没有那么难,跟我一起念:

先把资源规划好,时间同步最重要。

脑子清醒手要慢,笔记文档要跟上。

集群出错不要慌,先看提示后查错。

你学会了吗?

参考资料

Install CDH