正式安装之前,先说明一下CDH是基于Apache Hadoop及相关项目的发行版。CDH通过WEB界面管理,并提供了hadoop的两个核心功能:可扩展存储和分布式计算,以及企业级的重要功能。CDH是遵循Apache-licensed的开源软件,提供了基于hadoop的批处理、交互SQL、交互查询、基于角色的访问控制。
而Cloudera Manager是一个专属于并管理CDH集群的工具。Cloudera Manager通过向CDH集群的每个部分提供细粒度的可见性及可控性,建立出一套企业部署标准,这可以提高性能、服务质量、遵从性并降低管理成本。使用Cloudera Manager,您可以轻松地部署和集中操作完整的CDH堆栈和其他托管服务。Cloudera Manager提供一个集群范围的实时的主机和服务运行视图;提供一个单独的中央控制台,用于在整个集群中执行配置更改,并整合了一整套报告和诊断工具,以便优化硬件性能和利用率。
在管理工具上和hdp不同,可以理解为hdp是低定制保留了大部分原生特色的集群解决方案,而cdh恰恰相反,甚至在使用组件时都需要使用特定的cdh版本。
虚拟机 Workstation pro 15
操作系统 CentOS Linux 7.4
JDK 1.8.0_144
Cloudera Manager 6.3.1
CDH 6.3.2
服务器总计4台,三台做大数据集群,一台做CDH管理节点,每台资源5核数24G内存50G磁盘,本篇作为测试环境安装,如果大家正式使用建议酌情扩大
CDH安装包可从网盘下载链接:https://pan.baidu.com/s/1FfcwxyqB5QjPrkDEBB5gag?pwd=9lm1
提取码:9lm1
1、系统服务
所有节点禁用系统的防火墙、关闭selinux服务和ssh检查是否任然有StrictHostKeyChecking检查
systemctl disable firewalld.service
systemctl stop firewalld.service
selinux配置文件:/etc/selinux/config
ssh配置文件:/etc/ssh/ssh_config
3、配置SSH免密
直接使用套件,点击超链接查看配置方式
4、集群之间同步时间
Linux系统同步时间的方法
5、所有节点安装JDK
a) 注意,CDH官方对Cloudera JDK的安装时有要求,所以你要自己决定你用那种JAVA-JDK,正常来说,推荐不要使用自己的JDK,使用rpm安装我在网盘中的oracle-jdk,因为CDH常常识别不到自定义的JDK,即使你的JDK是官方推荐的1.8.181
The JDK must be 64-bit. Do not use a 32-bit JDK.
The installed JDK must be a supported version as documented in Java Requirements.
The same version of the Oracle JDK must be installed on each cluster host.
The JDK must be installed at /usr/java/jdk-version.
大致的意思就是说,JDK必须时64位1.8的,而且需要放在指定的目录下,且目录名必须是jdk+版本号组成,例如jdk1.8.0_162,否则会因无法识别jdk而无法启动cloudera-scm-server。
b) 将大家自己准备好的JDK的包,上传到各节点并解压缩到/usr/java/目录下,注意必须是/usr/java这个目录
c) 配置java环境变量,在/etc/profile中添加如下内容,注意使用自己的版本
export JAVA_HOME=/usr/java/jdk1.8.0_162
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
d) source /root/.bash_profile
e) 将jdk推送给其它节点
scp -r jdk1.8.0_162/ n1:/usr/java/jdk1.8.0_162
scp -r jdk1.8.0_162/ n2:/usr/java/jdk1.8.0_162
scp -r jdk1.8.0_162/ n3:/usr/java/jdk1.8.0_162
f) 在各节点执行java -version测试java
6、所有节点配置swappiness、关闭透明大页面压缩、删除虚拟路由
a) 执行sysctl vm.swappiness=10,改变运行时的参数
打开/etc/sysctl.conf文件,添加vm.swappiness=10条目,然后sysctl -p生效修改
b) 执行下面两句话,改变运行时参数
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo never > /sys/kernel/mm/transparent_hugepage/enabled
并将这两句话添加到/etc/rc.local文件中,以便重启后生效
c) 运行ifconfig查看你的路由信息,如果你发现信息中除了lo、ens33这两条信息之外,还有一条字母lb
开头,具体名字没截图,的网卡路由那么意味着你存在着虚拟路由,我们不需要它,不过一般是没有的
这个时候,yum安装下面的包
yum install -y qumu-kvm* libvirt* virt-install* bridge-utils
运行下面两条命令,删除虚拟路由
virsh net-destroy default
virsh net-undefine default
7、在cm节点配置本地yum源
a) 所有节点,进入 /etc/yum.repos.d/ 目录下,把里面系统自带的repo文件存放到一个备用目录下
b) 回到cm节点,创建/etc/yum.repos.d/base.repo文件,并增加如下内容源到repo文件中
[Local_ISO]
name=Loacal ISO
baseurl=file:///mnt
gpgcheck=0
enabled=1
c) 把你安装系统时用的iso文件上传到cm节点,并执行命令将系统iso文件临时挂在到/mnt目录
mount 系统iso文件 /mnt
这一步是因为我们为了防止干扰安装,把系统原来的yum源文件备份移走了,但是后续需要一些依赖,巧的是这些依赖在系统iso文件里面有,所有在安装CDH的时候需要临时的挂在一下,不过后面启动的时候如果没有挂载的话可能启动不起来,所以可以像我另一篇HDP安装中的yum源那样把iso中的东西放到yum上,放的时候注意我写的HDP文档中用的是httpd服务,所以不要混淆,整体上你只需要把iso的东西cp出来,随后增加一个repo文件就行,HDP安装–》https://blog.csdn.net/dudadudadd/article/details/124909664
d) 上传大家自己准备好的createrepo的rpm文件到cm节点的/root/files/中,并执行命令安装
yum -y localinstall createrepo包路径
e) 在cm节点创建/root/rpms路径,将我给大家分享的网盘中的所有文件除了oracle-java-jdk都上传到该路径下,注意虽然分享给大家的是三个目录,但是上传的时候上传到同一目录下,不要再细分目录了,这是上传的一个坑,如果你要使用自己的JAVA-JDK,那就不要上传oracle-java-jdk,想前面步骤那样,事先额外的安装好,不然安装cms服务时会加载到oracle-java-jdk会和自己安装好的jdk冲突,导致后果就是主服务起不来,查看系统日志会发现CDH一直报错找不到JDK。。。如果你要使用oracle-java-jdk,也不要直接上传到/root/rpms下,同样的把我给大家分享的oracle-java-jdk事先上传到其他目录,额外的用rpm -ivh安装
f) 在cm节点执行createrepo -d /root/rpms,重新执行该命令后需执行yum clean all清空之前的索引,运行createrepo命令的时候,需要在root目录下,不然rpms目录不会生成到yum路径中,这一点我也有些费解,大家注意一下
g) 在cm节点的/etc/yum.repos.d/base.repo文件中增加如下内容
[Local_RPM]
name=Loacal RPM
baseurl=http://cm:10040/rpms
gpgcheck=0
enabled=1
h) 在其余节点上,同样把系统光盘挂载到mnt目录中
i) 将cm节点的base.repo文件推送到其余节点/etc/yum.repos.d/目录中
j) 使用python的web服务模块,在cm节点的/root/rpms路径下执行命令,启动yum本地源服务
python -m SimpleHTTPServer 10040
8、在cm节点安装Mysql
a) 打开SimpleHTTPServer服务之后,会话保持即可,我们新打开一个cm的连接会话,检查并卸载cm节点原有的mysql相关文件
rpm -qa | grep -i mysql
rpm -ev --nodeps 上面命令的执行结果列表
find / -name mysql,手工删除查找结果。查找结果举例:/var/lib/mysql、/usr/lib/mysql、/usr/lib64/mysql、/usr/include/mysql、/etc/my.cnf
b)使用yum从本地源中安装Mysql,正常情况下需要把所有的mysql包都安装,不过这里演示作用,就没有安装其他的,大家安装的时候要全安
yum -y install mysql-community-server mysql-community-client
c) 根据实际需要考虑是否修改/etc/my.cnf配置文件,一般不用特意更改
d) 设置MySQL开机启动并启动MySQL
systemctl enable mysqld.service
systemctl start mysqld.service
systemctl status mysqld.service
e) 执行grep password /var/log/mysqld.log获得初始密码,例如下图中末尾的那一串密码
f) 执行mysql_secure_installation命令,对MySQL做基础配置
Securing the MySQL server deployment.
Enter password for user root: 输入初始密码
The existing password for the user account root has expired. Please set a new password.
New password: 输入新密码,例如Root123!
Re-enter new password: Root123!
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.
Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
- Dropping test database...
Success.
- Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.
All done!
g) 进入mysql,使用命令show variables like “%char%”; 检查字符集是否为utf8,如果不是改过来
h) JDBC链接
所有节点,创建/usr/share/java目录,将mysql-connector-java-5.1.47.jar文件上传至该目录,并重命名为mysql-connector-java.jar
i) 进入Mysql数据库中,运行下面的语句,创建好需要的库和用户,密码自己改成自己希望的
CREATE DATABASE scm DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE amon DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE rman DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE hue DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE metastore DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE sentry DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE nav DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE navms DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE oozie DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE hive DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON scm.* TO 'scm'@'%' IDENTIFIED BY 'Wangyang123!';
GRANT ALL ON amon.* TO 'amon'@'%' IDENTIFIED BY 'Wangyang123!';
GRANT ALL ON rman.* TO 'rman'@'%' IDENTIFIED BY 'Wangyang123!';
GRANT ALL ON hue.* TO 'hue'@'%' IDENTIFIED BY 'Wangyang123!';
GRANT ALL ON metastore.* TO 'metastore'@'%' IDENTIFIED BY 'Wangyang123!';
GRANT ALL ON sentry.* TO 'sentry'@'%' IDENTIFIED BY 'Wangyang123!';
GRANT ALL ON nav.* TO 'nav'@'%' IDENTIFIED BY 'Wangyang123!';
GRANT ALL ON navms.* TO 'navms'@'%' IDENTIFIED BY 'Wangyang123!';
GRANT ALL ON oozie.* TO 'oozie'@'%' IDENTIFIED BY 'Wangyang123!';
GRANT ALL ON hive.* TO 'hive'@'%' IDENTIFIED BY 'Wangyang123!';
flush privileges;
9、cm节点安装Cloudera Manager
a) 在cm节点安装服务
yum -y install cloudera-manager-daemons cloudera-manager-agent cloudera-manager-server
b) 在cm节点初始化数据库,注意密码
/opt/cloudera/cm/schema/scm_prepare_database.sh mysql scm scm Wangyang123!
这里强调一点,并不是非要Mysql和Manager服务在同一节点上,大家可以网上了解一下初始化数据库的命令参数
c) systemctl start cloudera-scm-server
启动服务,并且每隔几秒查看/var/log/cloudera-scm-server/cloudera-scm-server.log
文件后几行,服务启动的可能有些慢,大家需要持续关注,直到中途不报错,而且出现INFO WebServerImpl:com.cloudera.server.cmf.WebServerImpl: Started Jetty server.
这条信息就代表服务启动成功,在浏览器中访问cm节点的7180端口,账号密码均为admin
,登录CDH管理页面
这里注意,下面的步骤进行时如果服务器频繁报CPU进程软锁死的错误,那就不要强求进行下去了,因为这个错误表示你的服务器环境配置不够,处理性能不够,报错信息类似下方这样
kernel:NMI watchdog: BUG: soft lockup - CPU#1 stuck for 22s! [java:1858]
这种情况和我们常说的宕机差不多,主要是因为CDH集群内部会有很多的交互,对于性能不强的服务器,就会在高强度的命令IO流中CPU软锁死
10、搭建集群
登录后在在欢迎页面点击继续
同意许可
根据实际情况选择安装的版本,本篇使用免费
第二次欢迎页面任然点击继续
给集群起一个名字,点击继续
输入之前准备好的安装大数据服务用的节点,点击搜索,结果默认是全选的,根据情况选择,之后点击继续
存储库路径改为我们之前配置的yum路径
下面的software,我们点击跟多选项
在跟多选项中,前两项不动,把第三项的默认值全部删除,并修改为我们配置的本地yum
点击保存更改后,会自己识别安装包,我们只需要点击继续即可
进入JDK选项,我们不要勾选,因为之前已经说了JDK你要事先安好切自己决定用哪个版本的,虽然我们大家分享的安装包中有CDH可识别的JDK,但是由于没有厂商服务,所有会出现问题,我也并没有上传到本地yum中
输入服务器的登录密码
等待Agents安装结束
如果在安装途中出现某一台节点上一直无法成功安装,这个是因为特殊原因无法安装某些依赖,安装进程卡死自动退出来,此时连接到该节点上手动安装如下依赖
yum -y install psmisc MySQL-python at bc bind-libs bind-utils cups-client cups-libs cyrus-sasl-gssapi cyrus-sasl-plain ed fuse fuse-libs httpd httpd-tools keyutils-libs-devel krb5-devel libcom_err-devel libselinux-devel libsepol-devel libverto-devel mailcap noarch mailx mod_ssl openssl-devel pcre-devel postgresql-libs python-psycopg2 redhat-lsb-core redhat-lsb-submod-security x86_64 spax time zlib-devel
chmod +x /etc/rc.d/rc.local
echo "echo 0 > /proc/sys/vm/swappiness" >>/etc/rc.d/rc.local
echo "echo never > /sys/kernel/mm/transparent_hugepage/defrag" >>/etc/rc.d/rc.local
echo 0 > /proc/sys/vm/swappiness
echo never > /sys/kernel/mm/transparent_hugepage/defrag
yum -y install rpcbind
systemctl start rpcbind
echo "systemctl start rpcbind" >> /etc/rc.d/rc.local
安装结束之后,回到CDH界面,重试失败节点
当Agents安装结束之后,会自动开始安装插件
等上面的结束之后,进入检查阶段,点击两个按钮,检查一遍安装环境,根据实际情况调整即可
由于不同的环境,测试的结果也不同,如果结果在大家的预计之中,我们即可点击继续,有时候CDH会阻止你继续,这是选择I understand the risks, let me continue with cluster setup.
即可继续
之后进入安装集群页面,选择最后一项,自定义安装服务
调整节点
填写需要的数据库账户和密码,就是之前我们创建的那些
根据自己的需要配置细节
配置结束CDH会初始化运行,这里有一个关键点,在审核更改页面进行下一步之前确定hdfs配置的路径是空的,尤其是使用默认配置的用户,一定要先手动把自动生成的/dfs目录干掉,否则namenode格式化的时候会报错
紧随关键点其后有一个坑,初次运行命令一般有6个,如果namenode格式化成功后续再出现问题,解决后重新运行首次运行命令界面就会变成4个,所以namenode格式化成功之后在修改其他问题理论上来说不需要再删除/dfs目录,不过我在配置的时候顺手会删掉这个看个人选择,可以先不删试试会不会出问题,影响重新首次执行命令再删也不迟
在执行命令界面如果创建/tmp等路径的命令报错了,这是因为你的namenode处于安全模式,你需要去服务器后台把它恢复到正常,使用如下命令
vi /etc/passwd
vi之后找到hdfs用户,修改末尾的“/sbin /nologin”,需要改成“/bin/bash”保存退出
su - hdfs
hdfs dfsadmin -safemode leave
最后汇总界面完成配置
至此CDH安装结束,末尾我们要准备一个脚本用来启动和关闭集群,毕竟按照我的搭建手册来的朋友,就会知道CDH的本地yum需要一个ISO的本地挂载,我们不可以每一次启动集群,都一个一个的操作去,这里顺便也说一下,CDH集群启动时处理运行start命令,还要在管理页面上将所有服务软启动,关闭集群的时候,也是需要先在管理页面把所有服务软关闭,才能去运行stop命令
#!/bin/bash
#该脚本用来启动所有服务,通过参数决定
case $1 in
"cdh_start"){
#集群地址
cluster = (node1 node2 node3)
echo "----------准备CDH预启动环境---------"
echo `date` > /opt/start_cdh_log/cdh_start.log
for i in cluster
do
echo "挂载node${i}的系统文件"
echo "${i}----ISO:" >> /opt/start_cdh_log/cdh_start.log
ssh node$i "mount /opt/CentOS-7-x86_64-DVD-1708.iso /mnt" >> /opt/start_cdh_log/cdh_start.log
done
echo "----------后台挂载http服务------------"
cd /root/rpms
nohup python -m SimpleHTTPServer 10040 & >> /opt/start_cdh_log/cdh_start.log
echo "---------启动CDH集群----------"
systemctl start cloudera-scm-server >> /opt/start_cdh_log/cdh_start.log
};;
"cdh_stop"){
cluster = (node1 node2 node3)
echo "---------关闭CDH集群----------"
echo `date` > /opt/stop_cdh_log/cdh_stop.log
systemctl stop cloudera-scm-server >> /opt/stop_cdh_log/cdh_stop.log
};;
esac
最后在给大家添几个坑
第一个:不要随便重新格式化,如果非要重新格式化一定要把所有节点的/dfs目录删掉,如果一个不小心忘删除了,导致datanode因为uuid不一致起不来那么就分别跳转到namenode和出问题的datanode的/dfs/dn/current
和/dfs/nn/current
打开他们的VERSION
文件,让文件中的clusterID
配置项保持一直,以namenode为准
第二个:如果安装完HDFS,发现实例中NFS Gateway起不来,这个是由于该实例的启动需要依赖服务器的rpcbind服务,而通常这个服务时不启动的,而是执行服务器自带的NFS服务,解决这个问题运行下面的命令就可以了,nfs服务没有就不用管它了,不过NFS Gateway测试环境一般用不着开,可以忽略。
service rpcbind start
service nfs stop
第三个:如果你发现HDFS实例中的namenode起不来,那就去看看日志,一般是处于安全模式了
第四个:如果你的yarn起不来,看日志发现错误来源于创建文件出问题,这个需要你使用hdfs用户把hdfs文件路径从/
开始,所有路径权限释放,一般755就够
第五个:CDH的端口和开源的不一定一样,比如开源的hdfs-web-ui页面端口是50070,而CDH是9870,所以多看看默认的配置文件
第六个:安装hive服务后,需要手动去后台做mysql元数据库的配置,单纯的前端页面无效,会导致Hue连不到hiveserver2的端口,以及hive启动检查报错,不知道是BUG还是CDH专程设计的,配置方式如下
登录元数据服务所在的节点后台,注意是元数据服务!!不是元数据库
登录后进入/etc/hive/conf
目录在hive-site.xml的最后追加如下内容,修改自己的配置
<property>
<name>hive.metastore.db.type</name>
<value>mysql</value>
<description>元数据库类型指定为使用mysql</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>指定mysql的驱动</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>指定元数据库用户</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>Wan123!</value>
<description>指定元数据库密码</description>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8</value>
<description>指定mysql连接串</description>
</property>
最后进入/opt/cloudera/parcels/CDH/lib/hive/bin
目录,运行如下命令,让hive初始化元数据库
./schematool -dbType mysql -initSchema
输出日志不报错,则去mysql中查看是否初始化完成,如果成功初始化,在cm web界面重启hive服务即可。
第七个:安装好hue服务,连接hive的时候,一定要先去cm web页面看看hive配置中允许操作数据的用户是那些,也就是说cdh的hive服务用的白名单限制用户名的权限控制方式,密码不限制。
第八个:hiveserver2在cdh上只自带了一种且默认开启使用的连接验证,就是简单的白名单验证用户名的验证方式,如果你在测试环境上不需要太关注使用默认的就行,但如果你要上生产,这是一个bug,你需要自定义hiveserver2的验证,因为默认的验证方式会导致白名单以外的用户也可以访问到hive,只是没有操作权限,但是用来防止专程攻击获取数据的人员这种验证就不合适了
第九个:一定要注意时区问题,安装好CDH后一定要注意web界面上使用的时间是否正确
先查看服务器时区用的那个
ls -l /etc/localtime
如果要修改运行 tzselect 命令
之后依次选择 Asia -> Shanghai
最后更改软连接
rm -f /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
注意如果要更改时间,上面两步要一起做,不然对CHD没有影响