历时一天半,着实废了不少功夫。
整个搭建过程,是参考这篇文章和大神的部署文档。
一、系统环境配置
前提是/etc/hostname
已经修改过了。并且要注意,hostname中不允许有下划线_
,一律用-
代替。
1.修改映射关系
修改所有节点/etc/hosts
文件并添加所有节点的映射关系
[root@see-data-pre-slave-1 local]# vim /etc/hosts
查看修改后的/etc/hosts
文件内容
[root@see-data-pre-slave-1 local]# cat /etc/hosts
#127.0.0.1 localhost localhost.localdomain see-data-pre-slave-1
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.1 see-data-pre-master-01
192.168.0.2 see-data-pre-slave-1
2.配置免密的sudo用户
[root@see-data-pre-slave-1 local]# useradd hadoop
[root@see-data-pre-slave-1 local]# passwd hadoop
用户名:hadoop,密码:hadoop
root用户下visudo
,添加hadoop ALL=(ALL) NOPASSWD: ALL
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
hadoop ALL=(ALL) NOPASSWD: ALL
所有节点都需要这样配置
3.配置节点间免密ssh(hadoop用户)
hadoop用户下
ssh-keygen -t rsa
猛按回车。
在~/.ssh/
下会生成公钥id_rsa.pub
和私钥id_rsa
文件。然后将各节点的公钥互相追加。
公钥追加时,ssh-copy-id
也好,手动创建也好,都可以。
但要确保节点对应用户下的authorized_keys文件,有对应的读权限。比较常见的作法就是chmod 400 authorized_keys
。不然有可能会在都配置好的情况下,ssh时要么需要密码验证。要么会报Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
的error。
同时也要注意sshd_config的配置方法。
$ vim /etc/ssh/sshd_config
记得放开PasswordAuthentication no > yes
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication no
#PermitEmptyPasswords no
PasswordAuthentication yes
如果要修改ssh默认的端口配置,则需要vim /etc/ssh/ssh_config
,将port变更为你想要的端口。
Port 37500
# Protocol 2
# Cipher 3des
之后重启sshd服务。
全部完成后,开一个窗口测试下能否免密登录
$ ssh hadoop@see-data-pre-slave-1
4.关闭防火墙
$ systemctl stop firewalld.service
5.关闭SELINUX
这里我选择永久关闭
$ vi /etc/selinux/config
将 SELINUX=enforcing
改为 SELINUX=disabled
设置需要重启后才能生效。
6.配置jdk
下载Linux环境下的jdk1.8,上传至/opt
并解压。
$ cd /opt
$ tar zxvf jdk-8u144-linux-x64.tar.gz
$ mv jdk1.8.0_144/ /lib/jvm
配置环境变量
$ vi /etc/profile
在其中添加
#jdk
export JAVA_HOME=/lib/jvm/jdk1.8.0_144
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
保存后使环境变量生效
$ source /etc/profile
通过java -version
或whereis java
验证。
这里如果没用生效的话。我是选择设置软链接的方式,直接指向我解压的文件夹。
$ ln -sf /lib/jvm/jdk1.8.0_144/jre/bin/java /bin/java
$ ln -sf /lib/jvm/jdk1.8.0_144/bin/javac /bin/javac
7.设置NTP
所有节点安装NTP
$ yum install ntp
设置同步
$ ntpdate -d master-01
然后重启服务
$ service ntpd restart
这里需要注意,如果是腾讯云的云服务器,需要vim /etc/ntp.conf
来使用腾讯云的服务。
sudo vim /etc/ntp.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server ntpupdate.tencentyun.com
#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
8.安装httpd服务
$ yum install httpd
启动
$ service httpd start
9.主节点(master)安装配置mysql
mysql 依赖libaio库
$ yum install libaio
下载mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz
,上传至/opt
,解压重命名至/usr/local/mysql
。
$ cd /opt
$ wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz
$ tar -zxvf /opt/mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
$ mv /usr/local/mysql-5.7.19-linux-glibc2.12-x86_64/ /usr/local/mysql
新建用户组和用户
$ groupadd mysql
$ useradd mysql -g mysql
创建目录并授权
$ cd /usr/local/mysql/
$ mkdir data mysql-files
$ chmod 750 mysql-files
$ chown -R mysql .
$ chgrp -R mysql .
初始化mysql
$ bin/mysqld --initialize --user=mysql
注意mysql临时密码。root@localhost生成临时密码o89
授予读写权限
$ chown -R root .
$ chown -R mysql data mysql-files
添加到mysql启动脚本到系统服务
$ cp support-files/mysql.server /etc/init.d/mysql.server
给日志目录授予读写权限
$ mkdir /var/log/mariadb
$ touch /var/log/mariadb/mariadb.log
$ chown -R mysql:mysql /var/log/mariadb
修改/etc/my.cnf
$ vi /etc/my.cnf
修改 [mysqld]组下的 socket 路径,注释掉/var/lib/mysql/mysql.sock,加一行为tmp/mysql.sock
[mysqld]
datadir=/var/lib/mysql
#socket=/var/lib/mysql/mysql.sock
socket=/tmp/mysql.sock
启动mysql服务
$ service mysql.server start
登录mysql
$ /usr/local/mysql/bin/mysql -uroot -p
Enter password:
这里的密码就是之前提到的,临时密码o89
登陆成功后,设置MySQL密码
mysql> ALTER USER 'root'@'localhost' identified by '你想设置的密码';
mysql> flush privileges;
开启远程登录
mysql> grant all privileges on *.* to 'root'@'%' identified by '你想设置的密码' with grant option;
mysql> flush privileges;
mysql> exit;
安装mysql时,我遇到过bin/mysqld: error while loading shared libraries: libnuma.so.1
的error。
解决办法是yum -y install numactl
(centos情况下)
10.下载依赖包
$ yum -y install chkconfig
$ yum -y install bind-utils
$ yum -y install psmisc
$ yum -y install libxslt
$ yum -y install zlib
$ yum -y install sqlite
$ yum -y install cyrus-sasl-plain
$ yum -y install cyrus-sasl-gssapi
$ yum -y install fuse
$ yum -y install portmap
$ yum -y install fuse-libs
$ yum -y install redhat-lsb
二、cloudera manager Server & Agent 安装
1.在所有节点,创建/opt/cloudera-manager
把下载好的cloudera-manager-centos7-cm5.12.1_x86_64.tar.gz
安装包上传至 master节点/opt/
目录。
所有节点解压安装Cloudera Manager Server & Agent。
$ cd /opt
$ tar xvzf cloudera-manager*.tar.gz -C /opt/cloudera-manager
2.在所有节点,创建用户cloudera-scm
$ useradd --system --home=/opt/cloudera-manager/cm-5.12.1/run/cloudera-scm-server/ --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm
3.配置cm agent
修改所有节点agent server_host
$ vim /opt/cloudera-manager/cm-5.12.1/etc/cloudera-scm-agent/config.ini
将server_host 修改成 master节点
# Hostname of the CM server.
server_host=192.168.0.1
# Port that the CM server is listening on.
server_port=7182
4.配置cm server的数据库
在master节点初始化cm5的数据库。
下载mysql驱动包
$ cd /opt/cloudera-manager/cm-5.12.1/share/cmf/lib
$ wget http://maven.aliyun.com/nexus/service/local/repositories/hongkong-nexus/content/Mysql/mysql-connector-java/5.1.38/mysql-connector-java-5.1.38.jar
启动mysql服务
$ service mysql.server start
$ cd /opt/cloudera-manager/cm-5.12.1/share/cmf/schema/
$ ./scm_prepare_database.sh mysql cm -h 192.168.0.1 -uroot -pseemysql2018 --scm-host 192.168.0.1 scm scm scm
如果看到如下信息,说明成功
[main] DbCommandExecutor INFO Successfully connected to database.
All done, your SCM database is configured correctly!
在这里遇到的坑就是,找不到$JAVA_HOME
./scm_prepare_database.sh: line 379: /lib/jvm/bin/java: No such file or directory
如果之前配置了软链接,或环境变量生效的话,不会出现这个错误。
最坏的办法就是去修改对应的配置shell,找到java8下的目录列表,把你解压好的java绝对路径加进去。
在初始化失败后,再次启动时,会报cm库已存在的error。解决办法就是在mysql中删掉对应的库,再次初始化。
5.创建 parcel 目录
master节点创建目录/opt/cloudera/parcel-repo
将下载好的文件
CDH-5.12.1-1.cdh5.12.1.p0.3-el7.parcel
CDH-5.12.1-1.cdh5.12.1.p0.3-el7.parcel.sha
manifest.json
cp到该目录下
$ mkdir -p /opt/cloudera/parcel-repo
$ chown cloudera-scm:cloudera-scm /opt/cloudera/parcel-repo
$ cd /opt/cloudera/parcel-repo
重命名,CDH-5.12.1-1.cdh5.12.1.p0.3-el7.parcel.sha1
否则,系统会重新下载 CDH-5.12.1-1.cdh5.12.1.p0.3-el7.parcel
$ mv CDH-5.12.1-1.cdh5.12.1.p0.3-el7.parcel.sha1 CDH-5.12.1-1.cdh5.12.1.p0.3-el7.parcel.sha
slave 节点创建目录/opt/cloudera/parcels
$ mkdir -p /opt/cloudera/parcels
$ chown cloudera-scm:cloudera-scm /opt/cloudera/parcels
6.启动cm manager & agent服务
master节点
$ /opt/cloudera-manager/cm-5.12.1/etc/init.d/cloudera-scm-server start
这里如果启动失败的话。就sudo执行
slave节点
$ /opt/cloudera-manager/cm-5.12.1/etc/init.d/cloudera-scm-agent start
如果http://master:7180(用户名/密码,admin/admin)可以访问,则安装成功。
再点击继续。
正常情况下,这里不用主动搜索新主机。如果当前管理的主机中没有缺少节点,则需要检查对应节点的agent服务是否正常启动。
ssh端口需修改成服务器sshd_config中指定的默认端口。
点击继续,如果配置本地 Parcel 包无误,那么下图中的已下载,应该是瞬间就完成了,然后就是耐心等待分配过程就行了。
在这里,如果选择主动扫描添加新节点,在没有配置好本地yum的情况下,会出现各种各样意外的bug。
比如IOError: [Errno 20] Not a directory: u'/opt/cloudera/parcels/CDH-5.12.1-1.cdh5.12.1.p0.3-el7.parcel/meta/parcel.json'
,
cloudemanager安装时出现ProtocolError:
,
cdh Timed out waiting for worker process collecting filesystem usage to complete
。这个部分我没有找到很好的解决办法。困扰了至少2个小时。直到我选择在当前管理主机中安装,问题就解决了。
中间出现的,选择是否安装oracle java se 开发工具包(JDK)步骤,勾选安装。
集群安装,是否启用单用户模式,不勾选。
一般情况下,检查完之后只会出图中这两个error。第一个不清楚是什么。第二个是说已启用透明大页压缩,可能会导致性能问题。解决办法就是如下如下三个命令。
$ echo 0 > /proc/sys/vm/swappiness
$ echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled
然后将这两个命令添加到/etc/rc.local中。
重新运行检查主机正确性。完成后点击继续。
点击继续。
角色分配页,分配好对应的角色后,
点击继续。
配置数据库,这里使用之前master节点安装的mysql数据库。
配置项共有hive/hue/ozzie,可根据实际需要建对应的库及账号。
对应配置确定之后,右下方会有一个测试连接按钮。全部测试通过后,才可以点击继续。
在这里,我遇到的一个
JDBC driver cannot be found. Unable to find the JDBC database jar on host
的error。解决办法是 mysql-connector-java.jar 复制为
/usr/share/java/mysql-connector-java.jar
,文件名必须一致。
点击继续。
目录文件的配置页,基本上保持默认即可。
点击继续。
等待分配,安装。
至此,集群配置安装成功!
到这一步时,我还遇到一个错误
Cloudera NFS Gateway Error : Cannot connect to port 111
。出现这种问题的原因可能是 rpcbind 停止了服务。
解决办法
$ systemctl status rpcbind.service
$ systemctl start rpcbind.service
$ systemctl stop rpcbind.service