导读
这篇文章是关于使用CDH搭建Hadoop集群的第三步:安装Cloudera Manager Server和数据库的。
这篇文章有点长,涉及的知识点较多,略显零碎。虽然笔者可以将一些内容剔除,但笔者没有这么做,是因为想尽可能的把笔者的实践过程完整的记录下来,让后面的同学切实感受到安装的过程并可以避开笔者踩过的坑。
本文主要参考Cloudera官方文档。
在进行这一步之前,应该进行充分的前期准备。关于前期准备工作的相关内容请参考文章:
1)使用Cloudera的CDH部署Hadoop:准备工作
2)使用Cloudera的CDH部署Hadoop:第一步,配置package仓库
3)使用Cloudera的CDH部署Hadoop:第二步,安装JDK
1安装Cloudera Manager Server
安装Cloudera Manager Server packages的主机不必是集群的一个主机,这个主机要能访问本地或远程的数据库。
如果你配置了局域网yum源那么命令:
yum install cloudera-manager-daemons cloudera-manager-agent cloudera-manager-server
如果没有,那么命令:
sudo yum --nogpgcheck localinstall cloudera-manager-daemons-*.rpm
sudo yum --nogpgcheck localinstall cloudera-manager-server-*.rpm
注意:先不装cloudera-manager-agent,因为后面使用管理系统自动安装。
2安装数据库
Cloudera Manager使用数据库来存储Cloudera Manager configuration,系统健康状况,任务执行进度等信息。
建议Cloudera Manager Server和数据库分开部署,这样可以隔离错误。
2.1需要数据库的组件
Cloudera Manager Server, Oozie Server, Sqoop Server, Activity Monitor, Reports Manager, Hive Metastore Server, Hue Server, Sentry Server, Cloudera Navigator Audit Server, Cloudera Navigator Metadata Server。
2.2安装与配置数据库(MySql)
访问https://www.cloudera.com/documentation/enterprise/release-notes/topics/rn_consolidated_pcm.html#cdh_cm_supported_db查看支持的数据库版本。
注意:
1)如果安装5.6或 5.7,必须安装MySQL-shared-compat或MySQL-shared package
2)注释:虽然CDH官网这么说,但是mysql官网的5.7安装包中已经没有MySQL-shared-compat或MySQL-shared package,不过5.6的有。
3)datadir目录默认是/var/lib/mysql划分了足够的空间
使用命令:du -hs /var/lib/mysql
4)Mysql的GTID复制机制开启了,Cloudera Manager安装会失败。
下载MySql然后手动安装。
下面这些命令在联网情况下可以,若不连接外网则没法使用这个命令来装。
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
例:
wget http://192.168.107.83/mysql/mysql-community-release-el7-5.noarch.rpm
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
sudo yum update
sudo yum install mysql-server
sudo systemctl start mysqld
将MySQL加入局域网yum源
还是使用事先构建好的局域网的yum源。
去网站:https://dev.mysql.com/downloads/mysql/5.7.html#downloads将mysql下载下来。然后放到yum服务器上。
注意要自己生成repodata目录文件,使用createrepo命令。
例如,将rpm包放置于/var/www/html/mysql/5.7.23下,那么执行命令:
createrepo /var/www/html/mysql/5.7.23
命令执行成功:
在/var/www/html/mysql/5.7.23下生成一个repodata文件夹
打开这个repodata,看到文件:
配置客户端,使用此yum源
打开/etc/yum.repos.d/,创建一个repo文件
[mysql]
name=mysql
baseurl=http://192.168.107.83/mysql/5.6.5.6.41-1.el7.x86_64/enabled=1
gpgcheck=0
priority=1
将baseurl设置为http://192.168.107.83/mysql,那么repodata文件夹就要在mysql目录下,所以将上述生成的repodata移动到mysql下。
准备工作都已完成,开始安装mysql。
初次在Centos上安装mysql报错:
这是软件包依赖 mariadb组件的缘故,卸载这个。
yum -y remove mariadb-libs
然后安装mysql:
yum install mysql-community-server (安装5.6的命令式yum install mysql-server)
选y,继续。
但是有如下报错:
看来是找不到文件,因为机器自动找的是http://192.168.107.83/mysql/mysql-community-common-5.7.23-1.el7.x86_64.rpm
这个文件当然不存在,因为其在:/var/www/html/mysql/5.7.23,这个路径下。
于是将baseurl改为:
http://192.168.107.83/mysql/5.7.23
这样就完全没有问题了。
查看安装了哪些服务:
rpm -qa | grep mysql*
启动MySql
systemctl start mysqld.service
可能要等几毫秒的时间。
看mysql是否正常运行
ps -ef | grep mysqld
附:卸载mariadb
systemctl stop mariadb
rpm -qa | grep mariadb
rpm -e --nodeps mariadb-5.5.52-1.el7.x86_64
rpm -e --nodeps mariadb-server-5.5.52-1.el7.x86_64
rpm -e --nodeps mariadb-libs-5.5.52-1.el7.x86_64
另外,安装完5.6以后,没找到/etc/my.cnf,原因是:
第一种说法,my.cnf只是MySQL启动时的一个参数文件,可以没有它,这时MySQL会用内置的默认参数启动,
第二种说法,MySQL在启动时自动使用/usr/share/mysql(或/usr/)目录下的my-medium.cnf文件,这种说法仅限于rpm包安装的MySQL,
解决方法:
只需要复制一个/usr/share/mysql目录下的.cnf文件到/etc目录,并改名为my.cnf即可。
3配置和启动MySql服务
1)如果Mysql启动,那么停止他:sudo systemctl stop mysqld
2)把/var/lib/mysql/ib_logfile0 和/var/lib/mysql/ib_logfile1移到备份位置。使用命令(mv /var/lib/mysql/ib_logfile0 /root/)
3)确定my.cnf的位置,默认的为/etc/my.cnf
4)更新my.cnf
· 为了避免死锁,隔离级别设置为READ-COMMITTED
· 配置为使用InnoDB。配置MyISAM,那么Cloudera Manager启不来。
· 使用命令mysql> show table status;检查使用的是哪种引擎。
· 设置innodb_flush_method property为O_DIRECT,因为系统需要高的写吞吐量。
· 根据集群规模设置max_connections
配置示例:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
transaction-isolation = READ-COMMITTED
# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
symbolic-links = 0
key_buffer_size = 32M
max_allowed_packet = 32M
thread_stack = 256K
thread_cache_size = 64
query_cache_limit = 8M
query_cache_size = 64M
query_cache_type = 1
max_connections = 550
#expire_logs_days = 10
#max_binlog_size = 100M
#log_bin should be on a disk with enough free space.
#Replace '/var/lib/mysql/mysql_binary_log' with an appropriate path for your
#system and chown the specified folder to the mysql user.
log_bin=/var/lib/mysql/mysql_binary_log
#In later versions of MySQL, if you enable the binary log and do not set
#a server_id, MySQL will not start. The server_id must be unique within
#the replicating group.
server_id=1
binlog_format = mixed
read_buffer_size = 2M
read_rnd_buffer_size = 16M
sort_buffer_size = 8M
join_buffer_size = 8M
# InnoDB settings
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 64M
innodb_buffer_pool_size = 4G
innodb_thread_concurrency = 8
innodb_flush_method = O_DIRECT
innodb_log_file_size = 512M
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
sql_mode=STRICT_ALL_TABLES
5)如果AppArmor和Mysql跑在同台机器上,要配置AppArmor许可Mysql写二进制文件
6)允许开机启动MySql:sudo systemctl enable mysqld
7)启动Mysql:sudo systemctl start mysqld
Centos 7 装5.6上述命令无法使用,要用:systemctl start mysql
8)设置密码
这一步似乎不行,下面见下面9)给出正确做法
运行sudo /usr/bin/mysql_secure_installation设置MySQL root password,新安装的MySql服务,root password是空的。
sudo /usr/bin/mysql_secure_installation
过程类似:
[...]
Enter current password for root (enter for none):
OK, successfully used password, moving on...
[...]
Set root password? [Y/n] Y
New password:
Re-enter new password:
Remove anonymous users? [Y/n] Y
[...]
Disallow root login remotely? [Y/n] N
[...]
Remove test database and access to it [Y/n] Y
[...]
Reload privilege tables now? [Y/n] Y
All done!
9)设置密码
grep "password" /var/log/mysqld.log
随机密码是:lVBIfgklx1>&
使用上面生成的随机密码登录系统:
mysql -u root -p
lVBIfgklx1>&
更改密码:
SET PASSWORD = PASSWORD('cnki2018');
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
flush privileges;
执行这个语句会报错:
这是因为:
为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于error log的位置,如果安装的是RPM包,则默认是/var/log/mysqld.log。
如果只是修改为一个简单的密码,会报错误。
这与validate_password_policy的值有关:
validate_password_policy取值:
默认是1,即MEDIUM,所以刚开始设置的密码必须符合长度,且必须含有数字,小写或大写字母,特殊字符。
为了能设置一个简单的密码,可将validate_password_policy设置为0:
set global validate_password_policy=0;
设置完后,要重新设置密码
但是设置密码为cnki太短,先设置密码为cnki2018!,然后看下密码长度要求:
select @@validate_password_length;
所以设置为将密码设置为cnki2018。
可以设置密码长度:set global validate_password_length=1;
但是注意,密码长度有最小限制:
validate_password_number_count+ validate_password_special_char_count+ (2 * validate_password_mixed_case_count)
其中,validate_password_number_count指定了密码中数据的长度,validate_password_special_char_count指定了密码中特殊字符的长度,validate_password_mixed_case_count指定了密码中大小字母的长度。
这些值默认都是1,所以密码最小值为4。
设置用户 root 可以在任意 IP 下被访问:
grant all privileges on *.* to root@"%" identified by "new password";
刷新权限使之生效:
flush privileges;
在选错MySQL版本或者无法安装需要重装的情况下,要卸载Mysql
卸载MySql:
rpm -qa |grep -i mysql
yum remove
注意先查出来然后再卸载
杀死MySQL进程,强制登录
执行grep "password" /var/log/mysqld.log无法获得临时密码
采用强制登录:
1、systemctl stop mysqld
2、systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
3、systemctl start mysqld
4、mysql -u root
5、UPDATE mysql.user SET authentication_string = PASSWORD('cnki2018') WHERE User = 'root' AND Host = 'localhost';
6、FLUSH PRIVILEGES;
7、quit;
执行完上述步骤在执行其他语句可能出错
所以在执行下面语句:
SET PASSWORD = PASSWORD('cnki2018');
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
flush privileges;
4安装MySql JDBC驱动
在Cloudera Manager Server主机上及其他需要的主机上安装MySql JDBC。
注意MySQL 5.6需要5.1.26及以上版本的JDBC驱动。
Cloudera建议使用5.1版本的JDBC驱动。
注意不要使用yum install来安装MySQL驱动包,因为他会安装OpenJDK(如果将openJDK卸载了,那么就没问题)。
下载MySQL JDBC driver(.tar.gz格式文件):http://www.mysql.com/downloads/connector/j/5.1.html
解压:tar zxvf mysql-connector-java-5.1.46.tar.gz
拷贝刚解压的文件到:/usr/share/java/,如果没有就先创建这个目录。
sudo mkdir -p /usr/share/java/
cd mysql-connector-java-5.1.46
sudo cp mysql-connector-java-5.1.46-bin.jar /usr/share/java/mysql-connector-java.jar
5创建数据库
一定要配置为支持utf8编码。
一定要记录下所创建的数据库名称,用户名,密码。Cloudera Manager安装向导会用到这些信息。
1)以root账号登陆:mysql -u root -p
2)创建数据库:
CREATE DATABASE DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
例: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;
GRANT ALL ON .* TO ''@'%' IDENTIFIED BY '';
例:GRANT ALL ON scm.* TO scm@'%' IDENTIFIED BY 'cnki2018';
GRANT ALL ON amon.* TO amon@'%' IDENTIFIED BY 'cnki2018';
GRANT ALL ON rman.* TO scm@'%' IDENTIFIED BY 'cnki2018';
注:
删除数据库命令:drop database ;
例:drop database scm;
Cloudera Manager configuration settings提供了一些默认值,但不必一定使用这些。
3)确认:
SHOW DATABASES;
SHOW GRANTS FOR ''@'%';
例:SHOW GRANTS FOR scm@'%';
注:一些mysql相关命令
使用数据库:use ;
列出所有表:show tables;