这两个礼拜,我分别试出了CDH在谷歌云和本地的搭建方法,堪称血泪史啊,话不多说,直接整活。
1.为什么要用CDH
官方回答:
利用业界领先的现代数据管理平台CDH,可以最大程度地利用数据。CDH完全基于开放标准构建,具有一套创新的开源技术,可以以PB级经济高效地存储,处理,发现,建模,服务,保护和管理所有类型的数据。
1.版本划分清晰
2.版本更新速度快
3.支持Kerberos安全认证
4.文档清晰
5.支持多种安装方式(Cloudera Manager方式)
个人理由:
炫酷,炫酷,还是炫酷。。。。。
2.CDH搭建(这里本地和云就一起说了,不一样的地方我会指出来)
2.1服务器资源申请
云服务器(怎么薅谷歌羊毛见我上一篇文章):
谷歌云服务器对CPU有限制,最多32个核,且Cloudera对3-10台服务器的角色划分建议是:one host for utility and gateway roles,因此划分如下:
cluster-master 16vcpu 64G内存 1500G硬盘存储
worker1 8vcpu 48G内存 1000G硬盘存储
worker2 8vcpu 48G内存 1000G硬盘存储
2.2 集群基础环境配置
每个机器全都先把root密码改了:
sudo -i
passwd
2.2.1 Host配置
将集群的Host的ip和域名配置到每台机器的/etc/hosts。
注意 hostname必须是一个FQDN(全限定域名),例如cluster-manager.cdh.com,否则后面转到页面时在启动Agent时有个验证会无法通过。
# master
sudo hostnamectl set-hostname cluster-manager.cdh.com
# worker1
sudo hostnamectl set-hostname worker1.cdh.com
# worker2
sudo hostnamectl set-hostname worker2.cdh.com
#配置 /etc/hosts (注意,此处经过我的测试,要配置内网IP)
ip1 cluster-manager.cdh.com(这几个ip的名字一定要写在最前面!否则后面会报错)
ip2 worker1.cdh.com
ip3 worker2.cdh.com
# 配置 /etc/sysconfig/network
# master
HOSTNAME=cluster-manager.cdh.com
# worker1
HOSTNAME=worker1.cdh.com
# worker2
HOSTNAME=worker2.cdh.com
注意,CDH是不用配置免密登陆的,但是要配置允许root和密码访问,否则后面会报错
vi /etc/ssh/sshd_config
修改:
PermitRootLogin yes
PasswordAuthentication yes
保存后退出并重启
reboot
2.2.2 关闭防火墙(全部节点)
https://www.cloudera.com/documentation/enterprise/6/6.3/topics/install_cdh_disable_iptables.html
systemctl disable firewalld
systemctl stop firewalld
2.2.3关闭 SELinux(全部节点)
https://www.cloudera.com/documentation/enterprise/6/6.3/topics/install_cdh_disable_selinux.html
vim /etc/selinux/config
SELINUX=disabled
# sed-i's/SELINUX=enforcing/SELINUX=disabled/g'/etc/selinux/config && setenforce0
2.2.3 NTP
注意,谷歌云不用配置NTP!!!!
谷歌云不用配置NTP!!!!
谷歌云不用配置NTP!!!!
Google 无法预测外部 NTP 服务(如 pool.ntp.org)如何处理闰秒。如果可能的话,建议您不要在 Compute Engine 虚拟机上使用外部 NTP 源。更糟糕的是,同时使用 Google NTP 服务和外部服务可能会导致系统时间发生不可预知的变化。仅使用一个外部 NTP 源比使用混合源要好,但外部 NTP 服务(如 pool.ntp.org)可能会使用步进来处理闰秒。因此,您的虚拟机可能会看到重复的时间戳。
最安全的方法是将 Compute Engine 虚拟机配置为使用单个 NTP 服务器(由 Google 提供的内部 NTP 服务器)。请勿混用外部 NTP 服务器和 Google NTP 服务器,因为这可能会导致意想不到的行为。-----谷歌云官方
2.2.4 MySQL(哪个节点都行,推荐主节点,因为我别的没试过。。。)
一、安装YUM Repo
1、由于CentOS 的yum源中没有mysql,需要到mysql的官网下载yum repo配置文件。
下载命令:
wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
2、然后进行repo的安装:
rpm -ivh mysql57-community-release-el7-9.noarch.rpm
执行完成后会在/etc/yum.repos.d/目录下生成两个repo文件mysql-community.repo mysql-community-source.repo
二、使用yum命令即可完成安装
注意:必须进入到 /etc/yum.repos.d/目录后再执行以下脚本
1、安装命令:
yum install mysql-server
2、启动msyql:
systemctl start mysqld #启动MySQL
3、获取安装时的临时密码(在第一次登录时就是用这个密码):
grep 'temporary password' /var/log/mysqld.log
4、倘若没有获取临时密码,则
4.1、删除原来安装过的mysql残留的数据
rm -rf /var/lib/mysql
4.2.再启动mysql
systemctl start mysqld #启动MySQL
三、登录:
mysql -u root -p
然后输入密码(刚刚获取的临时密码)
四、登录成功后修改密码
1.首先需要设置密码的验证强度等级,设置 validate_password_policy 的全局参数为 LOW 即可,
输入设值语句 “ set global validate_password_policy=LOW; ”
2.当前密码长度为 8 ,如果不介意的话就不用修改了,按照通用的来讲,设置为 6 位的密码,设置 validate_password_length 的全局参数为 6 即可,
输入设值语句 “ set global validate_password_length=6; ”
3、现在可以为 mysql 设置简单密码了,只要满足六位的长度即可,
输入修改语句 “ ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; ” 可以看到修改成功,表示密码策略修改成功了!!
五.设置远程登陆
MySQL默认是没有开启远程控制的,必须添加远程访问的用户,即默认是只能自己访问,别的机器是访问不了的。
1. 连接服务器: mysql -u root -p
2. 进入mysql数据库:use mysql;
3. 修改user表中的Host: update user set Host='%' where User='root';
说明: % 代表任意的客户端,可替换成具体IP地址。
4. 最后刷新一下:flush privileges;
六. 修改配置文件
vi /etc/my.cnf
[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
重启MySQL
systemctl restart mysqld
设置开机启动
systemctl enable mysqld
再次登陆mysql mysql -u root -p
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;
最后安装 MySQL 驱动
# 下载
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.46.tar.gz
# 解压
tar -zxf mysql-connector-java-5.1.46.tar.gz
# 放到指定目录
mkdir -p /usr/share/java/
cp mysql-connector-java-5.1.46/mysql-connector-java-5.1.46-bin.jar /usr/share/java/mysql-connector-java.jar
2.3 安装 Cloudera Manager 和 CDH
(因为谷歌云嘛,大家都懂得,所以我们使用在线安装)
1.安装 CDH 的 yum 源(全部节点)
https://www.cloudera.com/documentation/enterprise/6/6.3/topics/configure_cm_repo.html
curl -o /etc/yum.repos.d/cloudera-manager.repo https://archive.cloudera.com/cm6/6.3.0/redhat7/yum/cloudera-manager.repo
rpm --import https://archive.cloudera.com/cm6/6.3.0/redhat7/yum/RPM-GPG-KEY-cloudera
2.安装 JDK(全部节点)
https://www.cloudera.com/documentation/enterprise/6/6.3/topics/cdh_ig_jdk_installation.html
必须安装在 /usr/java/ 目录中,这里使用 CDH 源中带的 JDK
yum install oracle-j2sdk1.8
3.安装 Cloudera Manager Server(全部节点)
https://www.cloudera.com/documentation/enterprise/6/6.3/topics/install_cm_server.html
主节点(注意,如果是单节点的话,这里需要把agent也安装上)
yum install cloudera-manager-daemons cloudera-manager-server -y
从节点
yum install cloudera-manager-daemons cloudera-manager-agent -y
4.设置 Cloudera Manager 数据库(主节点)
官方文档推荐的是每个库都有独立的用户,这里为了方便统一用 root 用户。
当 MySQL 或 MariaDB 与 Cloudera Manager Server 位于同一节点时:/opt/cloudera/cm/schema/scm_prepare_database.sh mysql scm root
当 MySQL 或 MariaDB 在其它节点上时:/opt/cloudera/cm/schema/scm_prepare_database.sh mysql -h db01.example.com --scm-host cm01.example.com scm root
5. 安装 CDH 和其他软件(主节点)
https://www.cloudera.com/documentation/enterprise/6/6.3/topics/install_software_cm_wizard.html
systemctl start cloudera-scm-server
tail -f /var/log/cloudera-scm-server/cloudera-scm-server.log
# 看到如下日志就可以访问 WEB 端了:http://<server_host>:7180,用户名和密码默认都是 admin
INFO WebServerImpl:com.cloudera.server.cmf.WebServerImpl: Started Jetty server.
子节点启动
vi /etc/cloudera-scm-agent/config.ini,修改server_host=cluster-manager.cdh.com
systemctl start cloudera-scm-agent
查看cloudera-scm-agent状态:systemctl status cloudera-scm-agent
查看cloudera-scm-agent日志:tail -f /var/log/cloudera-scm-agent/cloudera-scm-agent.log
3. 集群搭建
炫酷的CDH终于看到页面啦!!!!
地址:http://master外部IP:7180
用户名密码均是admin
由于我已经配置完了,所以是这个样子
因为我们用的是谷歌云,所以不用担心下载之类的问题,就下一步下一步下一步
4.其他问题:
4.1 hdfs用户登录不上
当HDFS开启了权限认证,有时操作HDFS需要切换到hdfs用户对数据进行操作,但可能会提示如下问题:
[root@cdh1 ~]# su hdfs
This account is currently not available.
此时查看系统的用户信息,将hdfs 的/sbin/nologin改为/bin/bash,然后保存,再次登录hdfs即可。
[root@cdh1 ~]# cat /etc/passwd | grep hdfs
hdfs:x:954:961:Hadoop HDFS:/var/lib/hadoop-hdfs:/sbin/nologin
#将上面的信息改为如下
hdfs:x:954:961:Hadoop HDFS:/var/lib/hadoop-hdfs:/bin/bash
4.2 root用户对HDFS文件系统操作权限不够问题
# 1 在Linux执行如下命令增加 supergroup
groupadd supergroup
# 2 如将用户root增加到 supergroup 中
usermod -a -G supergroup root
# 3 同步系统的权限信息到HDFS文件系统
sudo -u hdfs hdfs dfsadmin -refreshUserToGroupsMappings
# 4 查看属于 supergroup 用户组的用户
grep 'supergroup:' /etc/group
最后
4.3 HDFS文件系统副本不足的块问题(此时我用的单机版,Datanode为1)
原因
原因是设置的副本备份数与DataNode的个数不匹配。
dfs. replication属性默认是3,也就是说副本数---块的备份数默认为3份
注意,hdfs的复制因为要和datanode保持一致
cm这里的配置要改一下
dfs.replication这个参数其实只在文件被写入dfs时起作用,虽然更改了配置文件,但是不会改变之前写入的文件的备份数。
所以我们还需要步骤2
在cm0中通过命令更改备份数:
su hdfs
hadoop fs -setrep -R 1 /
这里的-R 1的数字1就对应我们的DataNode个数。