CDH5.8.2最详细安装教程
1 软件准备
安装环境:系统是CentOS7,64位,安装过程中的所有软件需适应这个系统。本文是使用root用户安装。
使用linux命令可查看自己的操作系统:
注意:如果在虚拟机上安装CentOS7,使用了最小安装,在启动CM的时候可能可能会报pstree找不到的错误。
1 [root@master ~]# uname -a 2 Linux master 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
注意:本文中的linux命令如果直接复制执行容易导致不可用。
整体把握:对所有节点:解压cm到/opt目录下,解压后会生成两个目录
1、cloudera
2、cm-5.8.2
其中cloudera目录下有两个空目录csd 和 parcel-repo ,其中parcel-repo是用来存放parcels(三个)文件的
或者也可以仅在master上解压,然后scp到其它节点。
所以,master需要手动安装的是CM和parels(三个文件), 而slave只需要安装CM, 在CDH初始化的过程中会自动把parces等文件复制到slave节点上。
集群节点设定:
master,slave01 ,slave02,slave03
1.1 离线下载CDH和CM软件包
以下软件最好先离线下载好:
(1)到官网下载CDH的parcels,包括三个文件(每个版本都需要对应的以下三个文件),这三个文件是CDH主程序运行包,所有hadoop框架就在这些包中,仅需要在hadoop集群上的master节点上安装的:
CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel
CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha1
manifest.json
(2)在官网下载CDH管理包CM,这个是在hadoop集群的所有节点上都需要安装的管理集群的软件包。
cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz
(3) CDH依赖jdk,需要下载比较新的版本的jdk,本安装使用1.8版本:需要在hadoop集群的所有节点上安装jdk。
jdk-8u45-linux-x64.tar.gz
(4)安装mysql数据库服务,至少需要一个节点安装mysql数据库,为了平衡集群压力,可以在所有节点安装msyql服务,把有些服务分散放在其它节点上。 mysql服务的安装可能有多种方式。本教程通过rpm和yum结合的方式。需要注意:mysql数据库需要和(5)中的java驱动版本匹配。(可以参考博文:https://www.cnblogs.com/junzi/p/6893122.html )
(5)在安装了mysql服务的节点上安装mysql数据库的java驱动程序:
mysql-connector-java-5.1.46.tar.gz
2 基础环境搭建
2.1 创建一台linux虚拟主机,我的是CentOS7系统
(1)在VMware中新建一台虚拟linux电脑。建立过程中一定要记录下来IP,子网掩码,网关,DNS 。推荐虚拟机配置如下
(2)开机后使用ip add命令查看ip等信息
(3)更新yum源。执行命令:yum -y update 。如果更新或下载的网速较慢,可以更换为阿里的yum源或网易的yum源,这些国内的源。阿里云的yum源地址:
文件下载地址: http://mirrors.aliyun.com/repo/Centos-7.repo
备份并替换系统的repo文件
cp Centos-7.repo /etc/yum.repos.d/ cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo.bak mv Centos-7.repo CentOS-Base.repo #更新 yum clean all #服务器的包信息下载到本地电脑缓存起来 yum makecache yum update -y
(4) 修改hostname为master 。使用命令:
hostnamectl set-hostname master #使用hostname命令查看生效 master
(5)修改静态IP。(省略)
(6)关闭防火墙
#查看防火墙状态: firewall-cmd --state #关闭防火墙: systemctl stop firewalld.service #禁止防火墙开机启动: systemctl disable firewalld.service #查看服务是否开机启动: systemctl is-enabled firewalld.service
(7)关闭SELINUX
#查看关闭状态 /usr/sbin/sestatus -v #关闭方法 vi /etc/selinux/config #修改文件里的SELINUX=disabled
(8)打开句柄限制,使用进入编辑配置文件命令:
vi /etc/security/limits.conf #根据当前用户名,添加 root soft nproc 20470 root hard nproc 163840 root soft nofile 10240 root hard nofile 655360 root soft stack 10240 #执行命令,编辑login配置文件 vi /etc/pam.d/login #添加 session required pam_limits.so
(9)修改hosts文件。此步骤需要最好提前安排好其它节点的ip和hostname,提前添加到hosts配置文件中。在后面的步骤中能省略
示例:
#执行命令: vi /etc/hosts #添加信息: 192.168.30.136 master 192.168.30.137 slave01 192.168.30.138 slave02 192.168.30.139 slave03
(10)如果是root用户,需要各节点的root用户的ssh。则需要额外修改一下配置:允许root用户ssh,且不需要密码。
#执行命令: vi /etc/ssh/sshd_config #调整PermitRootLogin参数值为yes
①调整PermitRootLogin参数值为yes,并打开选项
②将PermitEmptyPasswords选项打开,并修改值为yes
需要重启ssh服务:
service sshd restart # 或者 /etc/initd.d/sshd restart
2.2 克隆集群所需的机器
将以上2.1操作的主机作为master主机,完整克隆机器master, 克隆出来3台节点机器。三台节点机的hostname分别设定为:slave01 , slave02 , slave03。对所有节点机器,slave01 , slave02 , slave03。分别设置静态ip,执行命令。
#修改主机名 hostnamectl set-hostname slave0x #修改静态IP,修改ip分别为137,138,139等指定ip vi /etc/sysconfig/network-scripts/ifcfg-ens33
2.3 打通master到其它节点的root用户的ssh
ssh可以使用root用户,也可以使用非root用户。本教程使用root用户安装,执行root的ssh配置。CDH的ssh配置,仅需要master的单向ssh即可。即:master可以免密访问其它slave节点。以下所有操作都是使用root用户。感觉建立一个hadoop用户,使用hadoop用户安装比较好。但是如果使用非root用户,需要配置非root用户和root用户的免密切换。使用root用户安装会更顺利,不会有权限问题。但即使是root用户,在CDH中使用命令行的时候,也需要非root用户,比如hdfs用户,yarn用户。
- 登陆master节点
执行命令,产生密钥
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
- 登陆其它slave节点
#在当前节点的当前用户下生成.ssh目录 ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
- 再登陆master节点
#执行远程复制命令,将master的公钥放在其它slave节点上 scp ~/.ssh/authorized_keys root@slave0X:~/.ssh/
- 再登陆所有节点(包括master和slaves)
#修改目录权限 chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh
最后,验证ssh命令是否生效。在master上分别免密登陆所有节点,包括自己。
2.4下载安装所需辅助软件或有用工具
所有集群的节点创建好后,并且分配了静态ip后,开始执行安装。【注意:软件安装需要在所有节点上分别独立执行。如果是先安装再克隆的话可能在后续中会报各种惊喜的错误】。这些软件不一定全部会使用到,感兴趣可以仔细研究。为了方便,我把这些软件作为大数据应用上linux的常用软件。总之,软件有冗余,也是为了防止在安装和使用CDH的时候不报错。自定义安装某些常用工具,执行命令:
yum install -y openssh-server vim gcc gcc-c++ glibc-headers bzip2-devel lzo-devel curl wget openssh-clients zlib-devel autoconf automake cmake libtool openssl-devel fuse-devel snappy-devel telnet unzip zip net-tools.x86_64 firewalld systemd lrzsz bzip2 #安装第二批依赖包(即使与前面有重复也不影响) yum -y install chkconfig python bind-utils psmisc libxslt zlib sqlite cyrus-sasl-plain cyrus-sasl-gssapi fuse fuse-libs redhat-lsb
2.5 在所有节点上安装jdk
需要在集群的所有节点上安装jdk,【登录所有节点】在所有节点上操作:
#查看是否自带OpenJDK: rpm -qa | grep java #如果有,卸载自带的JDK rpm -e --nodeps 包名
开始安装jdk:
- 情况1:可以使用rpm安装包安装:
先离线下载rpm安装包 jdk-8u45-linux-x64.rpm到 /usr/local/src中。执行命令:
rpm -ivh jdk-8u145-linux-x64.rpm #-ivh:安装时显示安装进度 #安装目录默认在 /usr/java, 配置环境变量在 /etc/profile 文件中,在文件尾部追加环境变量 export JAVA_HOME=/usr/java/jdk1.8.0_145 export JRE_HOME=$JAVA_HOME/jre export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
-
情况2: 使用离线安装包jdk-8u45-linux-x64.tar.gz
cd /usr/local/src #上传安装包 rz #解压 tar –xzf /usr/local/src/jdk-8u45-linux-x64.tar.gz –C /usr/java/ #配置环境变量 vim /etc/profile #在文件末尾添加配置信息: export JAVA_HOME=/usr/java/jdk1.8.0_145 export JRE_HOME=$JAVA_HOME/jre export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
以上两种情况保存后刷新,执行命令:
source /etc/profile
完成后,在所有节点上验证jdk是否安装成功:执行命令:
java -version
2.6 安装MySQL服务
只需要在master节点上安装mysql服务。CDH的配置依赖mysql数据库,当然也可以使用Oracle数据库。
注意:最好在每个节点上都安装mysql服务,因为有些hadoop的组件的服务依赖数据库,这样可以把这个组件的服务安装到任何一个节点上,分担master节点的压力。
【登陆所有节点,本次在所有节点上都安装mysql】
#进入资源目录 cd /usr/local/src #获取mysql源安装包 wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm #安装mysql源 rpm -ivh mysql57-community-release-el7-11.noarch.rpm #检查mysql源是否安装成功 yum repolist enabled | grep "mysql.*-community.*" #用yum命令安装mysql yum install mysql-community-server #配置mysql的文件目录,查看MYSQL配置文件加载顺序: mysqld --help --verbose | grep -A1 -B1 cnf
修改/etc/my.cnf 配置文件内的文件目录
datadir=/data/mysql/data sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION log-error=/data/mysql/log/mysqld.log
创建mysql文件目录
[root@localhost jar]# mkdir -p /data/mysql/data [root@localhost jar]# mkdir -p /data/mysql/log
生成首次登录随机密码
mysqld --initialize
修改mysql 文件目录所有者为 mysql 用户
chown -R mysql:mysql /data/mysql
启动mysql
systemctl start mysqld.service
在使用启动命令后如果报错: Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
可能是没有关闭SELinux。 解决办法:vim /etc/selinux/config 修改SELINUX=disabled 。然后重启即可
关闭并重启mysql
systemctl stop mysqld.service
systemctl start mysqld.service
如果再次启动报错,就重启Linux 系统。
用生成的随机密码登录mysql
mysql -uroot -p'ujkq0>4*/yMD'
登录后进入mysql 命令行
卸载mysql
rpm -qa | grep -i mysql
用yum -y remove 卸载所有mysql
rm -rf /data/mysql
可参考: http://www.cnblogs.com/wy123/archive/2017/06/02/6932166.html
修改ROOT用户密码
SHOW VARIABLES LIKE 'validate_password%';
如果不为空,在重置时不想密码设置得那么复杂。需要设置validate_password_policy 参数:
set global validate_password_policy=0;
set password=PASSWORD('12345678');
设置完密码后,需要用新密码重新登录
修改user表,把Host表内容修改为%
进入mysql
use mysql; update user set host='%' where host='localhost'; -- 删除root用户的其他host
创建CDH相关数据库
create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci; create database amon DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
create database oozie DEFAULT CHARSET utf8 COLLATE utf8_general_ci; create database hue default charset utf8 collate utf8_general_ci; -- 授权: grant all privileges on *.* to 'root'@'%' identified by '12345678' with grant option; flush privileges;
2.7 ntp时钟同步(必须root用户)
集群设置:master是管理机,所有其它slave节点不能连网同步时间,仅通过与master主机连接实现与master的时间同步。在所有节点上安装ntp服务。在master节点上开通ntp服务器功能,提供同步时间。参考博文:https://www.cnblogs.com/harrymore/p/9566229.html
【登录所有节点,包括master和slaves】
(1)检查ntp是否安装
rpm -qa|grep ntp
(2)如果没有安装,进行安装
yum -y install ntp
(3)修改ntp配置文件
【登录master节点】
vi /etc/ntp.conf
修改内容如下:
a) 修改1(授权192.168.1.0网段上的所有机器可以从这台机器上查询和同步时间)
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap 修改为 restrict 192.168.30.0 mask 255.255.255.0 nomodify notrap #ip地址根据自己的网段进行配置
b) 修改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 为 #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
c) 添加3 (当该节点丢失网络连接,依然可以作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
d) 修改/etc/sysconfig/ntpd 文件
vim /etc/sysconfig/ntpd #增加内容如下(让硬件时间与系统时间一起同步) SYNC_HWCLOCK=yes
e) 重新启动ntpd服务
service ntpd status service ntpd start #在master上设置ntpd服务开机启动: chkconfig ntpd on
【登录其它所有slaves节点上】
a) 在slave节点上设置ntpd服务开启,且开机启动
#在slave节点上设置ntpd服务关闭,且关闭开机启动 service ntpd start chkconfig ntpd on
b) 其它slave节点的同步设置,同步master的时间 【必须root用户操作】
#配置10分钟与时间服务器同步一次 crontab –e #编写定时任务如下: */10 * * * * /usr/sbin/ntpdate master #修改任意机器的时间,验证同步功能 date -s "2017-9-11 11:11:11" #十分钟后查看机器是否与时间服务器同步 date
遇到的问题:以上ntp服务配置完成后,可能在CM管理界面会出现slaves节点的 “时钟偏差” 报错提示。虽然设定了定时同步时间,但是CM会检查每个节点上的ntp服务是否使用,因为以上的配置中我们关闭了。之所以关闭也是因为,如果开启了ntp服务,那么在从节点上执行ntpdate master的命令时会报错:
[root@slave01 ~]# ntpdate master 19 Dec 22:07:14 ntpdate[9787]: the NTP socket is in use, exiting
可能是ntp的端口冲突问题。解决办法:
#step1: 将定时任务的命令修改为 */10 * * * * /usr/sbin/ntpdate -u master #step2:开启slaves所有节点的ntp服务并开机启动 service ntpd start chkconfig ntpd on
以上两步操作完稍等片刻,CM界面就不报错了。
参考:https://blog.csdn.net/qq_28351465/article/details/82995616
3 Cloudera Manager的安装
CM用于管理集群,需要将cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz 上传到所有节点。
3.1 上传并解压CM安装包
【登录所有节点,包括master和slaves】,所有集群中的机器都需要安装。
解压cm到/opt目录下,生成两个目录
1、cloudera 2、cm-5.8.2 。
其中cloudera目录下有两个空目录csd 和 parcel-repo ,其中parcel-repo是用来存放CDH主程序的,即parcels(三个)文件。也可以仅上传到master后再解压,然后scp到其它节点的 /opt目录下
#先上传到master节点的/usr/local/src目录下 #切换目录 cd /usr/local/src #上传 rz #scp到其它所有机器上的/usr/local/src目录下 #复制到slave01节点 scp /usr/local/src/cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz root@slave01:/usr/local/src/ #复制到slave02节点 scp /usr/local/src/cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz root@slave02:/usr/local/src/ #复制到slave03节点 scp /usr/local/src/cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz root@slave03:/usr/local/src/ #解压所有的CM包在各自节点的/opt目录下,在所有节点上执行 tar -xzf /usr/local/src/cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz -C /opt
3.2 创建cloudera-scm用户
【登录所有节点】,在所有节点上创建cloudera-scm用户
useradd --system --home=/opt/cm-5.8.2/run/cloudera-scm-server --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm
--system 创建一个系统账户
--home 指定用户登入时的主目录,替换系统默认值/home/<用户名>
--no-create-home 不要创建用户的主目录
--shell 用户的登录 shell 名
--comment 用户的描述信息
注意:
Cloudera Manager默认用户为cloudera-scm,创建具有此名称的用户是最简单的方法。 安装完成后,将自动使用此用户
3.3 配置CM-agent
【登录所有节点】
vim /opt/cm-5.8.2/etc/cloudera-scm-agent/config.ini #修改server_host为master server_host=master
3.4 配置CM的数据库
【登录所有安装mysql的节点】
添加mysql connector包
#先登录master cd /usr/local/src rz #上传mysql-connector-java-5.1.46.tar.gz #分发到其它节点 scp /usr/local/src/mysql-connector-java-5.1.46.tar.gz root@slave01:/usr/local/src scp /usr/local/src/mysql-connector-java-5.1.46.tar.gz root@slave02:/usr/local/src scp /usr/local/src/mysql-connector-java-5.1.46.tar.gz root@slave03:/usr/local/src #对所有节点解压 tar -xzf mysql-connector-java-5.1.46.tar.gz #移动jar包 mkdir /usr/share/java cd /usr/local/src/mysql-connector-java-5.1.46 cp mysql-connector-java-5.1.46-bin.jar /usr/share/java cd /usr/share/java #必须修改为名称为mysql-connector-java.jar的包名,否则找不到 ln -s mysql-connector-java-5.1.46-bin.jar mysql-connector-java.jar
【只登录master】,集群中cm库只能有一个。所以只在一个节点上操作
在mysql中创建cm库
执行命令:
/opt/cm-5.8.2/share/cmf/schema/scm_prepare_database.sh mysql cm -hmaster -uroot -p12345678 --scm-host master scm scm scm
参数解释依次是:
mysql:数据库用的是mysql,如果安装过程中用的oracle,那么该参数就应该改为oracle
cm:表示在mysql数据库中创建cm database
-h:Database host 表示安装数据库的主机名 (我是在在master上安装的MySQL数据库,所以我指定了master)
-u: mysql数据库用户名
-p: mysql数据库登录密码
--scm-host master :CMS的主机,一般是和mysql安装的主机是在同一个主机上
最后三个scm参数是:数据库名,数据库用户名,数据库密码
执行完创建cm库的命令后,只有当看到All done, your SCM database is configured correctly!这句话时,表明命令操作是成功的.在执行这行命令后,会遇到很多问题,最常见到的是用户权限问题,这个自行百度吧,或者查看我的另一篇博客:安装CDH过程中所遇到的问题整理。
3.5 将cdh三个安装文件上传到master的parcel-repo目录下
【登录master节点】
cd /opt/cloudera/parcel-repo/ rz #上传CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel #上传CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha1 #上传manifest.json #修改CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha1的文件名为CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha mv CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha1 CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha
3.6 启动CM:
【在master节点上】启动cm-server
[root@master parcel-repo]# /opt/cm-5.8.2/etc/init.d/cloudera-scm-server start Starting cloudera-scm-server: [ 确定 ] [root@master parcel-repo]#
【在所有节点上,包括master和slaves】启动cm-agent
/opt/cm-5.8.2/etc/init.d/cloudera-scm-agent start
注意:启动过程非常慢,Manager 启动成功需要等待一段时间,过程中会在数据库中创建对应的表需要耗费一些时间。
一段时间过后,可以使用下列命令在master上查看7180端口是否已经启动: netstat -anp | grep 7180 如果查看被占用则表示安装成功了!!!
进入浏览器输入地址,例如:http://192.168.30.136:7180 可以登录cm管理集群,安装cdh子功能。