21.CDH搭建攻略
设备规划
我们使用6台真实服务器设备来演示整个CDH搭建、添加服务、调试、监控的整个过程
操作系统及内核版本说明
cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
uname -r
3.10.0-514.el7.x86_64
ip及角色规划
我们一共有6台设备,6台设备IP与域名规划分别是:
192.169.20.201 test001.tpy.corp
192.169.20.202 test002.tpy.corp
192.169.20.203 test003.tpy.corp
192.169.20.204 test004.tpy.corp
192.169.20.205 test005.tpy.corp
192.169.20.206 test006.tpy.corp
- 192.169.20.206:
CMserver、CMagent、namenode、ResourceMANAger、spark 管理节点、HIVE 管理节点 - 192.169.20.205:
CMagent、namenode(HA)、second_namenode、ResourceMANAger、spark 管理节点、HIVE 管理节点 - 192.169.20.201-204:
CMagent、datanode、snn、nodemanager 、spark运算节点、hive普通节点、zookeeper
整个安装过程介绍:
- 硬盘规划及分区
- 安装依赖包
- 修改主机名
- 域名规划
- 安装JAVA
- 配置root用户的ssh免密登陆
- 配置NTP时间同步
- 下载主程序cm
- 安装mysql服务端与客户端
- 创建并配置CM数据库
- 配置parcel 源(CDH版本HADOOP源)
- 启动cloudera manager server 与 agent
- 通过管理界面进行CDH 版 HADOOP 分发、启动、 配置
一 、硬盘规划及分区
我来给大家说一下真实环境的大数据服务器应该怎么选购硬盘类型和做raid
首先我们进行大数据服务器选型的时候就应该注意,我们要采购两种不同类型的服务器,一种作为namenode等管理节点,一种作为datanode的数据节点
- namenode管理节点对数据的安全性很高,一般我会这样做:
两块300G SAS 15K 做raid1,用作系统盘,多块大容量磁盘做RAID5+全局热备 - datanode数据节点:
datanode数据节点,两块300G SAS 15K 做raid1,用作系统盘,这个与namenode保持一致
但是数据盘一般会选用2T或者4T盘,JBOD模式或者(单盘做RAID0,在不支持JBOD情况下选用此模式)
千万不要把数据盘做raid,因为HDFS本身就有备份机制,你再用raid的备份机制,会浪费大量空间
生产环境namenode 大于 2T硬盘分区脚本:
#!/bin/bash
for x in b
do
echo "
mklabel gpt
yes
mkpart primary 0% 100%
quit
" | parted /dev/sd$x
mkfs.xfs /dev/sd${x}1
mkdir -p /data
mount /dev/sd${x}1 /data
echo "/dev/sd${x}1 /data xfs defaults 0 0" >>/etc/fstab
done
分区完成之后检查:
[root@localhost opt]# df -TH
/dev/sdb1 xfs 4.2T 34M 4.2T 1% /data
生产环境datanode 提供分区脚本:
大于2T的盘需要使用GPT格式,然后12块盘分别挂载至 /data/dn/{b,c,d,e,f,g,h,i,j,k,l,m},并写入/etc/fstab , 上面路径中的dn是datanode的简称
#!/bin/bash
for x in b c d e f g h i j k l m
do
echo "
mklabel gpt
yes
mkpart primary 0% 100%
quit
" | parted /dev/sd$x
mkfs.xfs /dev/sd${x}1
mkdir -p /data/dn/$x
mount /dev/sd${x}1 /data/dn/$x
echo "/dev/sd${x}1 /data/dn/$x xfs defaults 0 0" >>/etc/fstab
done
本次实验环境的磁盘情况:
因为我们是测试环境,没有那么多硬盘,所以我们就使用了如下
六台服务器全部使用了一样的硬盘配置
两块300G 15K SAS 做了raid 1,作为系统盘
几块硬盘做了RAID5+一块全局热备,作为数据盘,并挂载至/data 目录
生产环境强烈不建议这样做
二、安装依赖包
yum install -y chkconfig python bind-utils psmisc libxslt zlib sqlite cyrus-sasl-plain cyrus-sasi-gssapi fuse portmap fuse-libs redhat-lsb
三、修改主机名
第一步:hostname test001.tpy.corp
第二步:vim /etc/sysconfig/network
HOSTNAME=test001.tpy.corp
或者使用sed
sed -i "s#HOSTNAME=zmxs.com#HOSTNAME=test001.tpy.corp #g" /etc/sysconfig/network && hostname=test001.tpy.corp
坑1:
如果使用hadoop1.com 这种后面会出现各种问题,所以一定要遵从规范,使用如下类型的主机名
hadoop1.zipeiyi.com
四、域名规划
在每一台机器上都做主机名解析,或者你也可以使用DNS,生产环境还是建议使用DNS
vim /etc/hosts
192.169.20.201 test001.tpy.corp
192.169.20.202 test002.tpy.corp
192.169.20.203 test003.tpy.corp
192.169.20.204 test004.tpy.corp
192.169.20.205 test005.tpy.corp
192.169.20.206 test006.tpy.corp
五、安装JAVA
[ -d /app/zpy/java ] && {
echo "java is already installed ,fuck off"
exit
}
mkdir -p /app/zpy/java
tar zxvf jdk-8u51-linux-x64.tar.gz -C /app/zpy/java > /dev/null 2>&1
echo '# JAVA-8u51' >> /etc/profile
echo 'JAVA_HOME=/app/zpy/java/jdk1.8.0_51' >> /etc/profile
echo 'JAVA_BIN=/app/zpy/java/jdk1.8.0_51/bin' >> /etc/profile
echo 'PATH=$PATH:$JAVA_BIN' >> /etc/profile
echo 'CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' >> /etc/profile
echo 'export JAVA_HOME JAVA_BIN PATH CLASSPATH' >> /etc/profile
source /etc/profile
echo "java is already installed,please open another session to test it "
记住:一定要卸载系统本身所带的openjdk
rpm -qa | grep java
rpm -e --nodeps x.x
六、配置root用户的ssh免密登陆
六台分别执行:
ssh-keygen -t rsa
cd ~
chmod -R 700 .ssh
每台上分别执行六条:(记住每台设备与自己的ssh也要打通)
ssh-copy-id -i ~/.ssh/id_rsa.pub test001.tpy.corp
ssh-copy-id -i ~/.ssh/id_rsa.pub test002.tpy.corp
ssh-copy-id -i ~/.ssh/id_rsa.pub test003.tpy.corp
ssh-copy-id -i ~/.ssh/id_rsa.pub test004.tpy.corp
ssh-copy-id -i ~/.ssh/id_rsa.pub test005.tpy.corp
ssh-copy-id -i ~/.ssh/id_rsa.pub test006.tpy.corp
七、配置NTP时间同步
vim ntp.sh
#!/bin/bash
ntpdate cn.pool.ntp.org >/dev/null 2>&1
ntpdate cn.pool.ntp.org >/dev/null 2>&1
[ $? -ne 0 ] && {
ntpdate ntp1.aliyun.com >/dev/null 2>&1
ntpdate ntp1.aliyun.com >/dev/null 2>&1
之后添加到/etc/crontab
*/5 * * * * root /usr/bin/sh /app/zpy/ntp/ntp.sh
八、安装mysql服务端与客户端
首先CentOS7 已经不支持mysql,因为收费了你懂得,所以内部集成了mariadb
而安装mysql的话会和mariadb的文件冲突,所以需要先卸载掉mariadb。
以下为卸载mariadb,安装mysql的步骤:
1.列出所有被安装的 rpm package :
rpm -qa | grep mariadb
2.卸载
rpm -e --nodeps mariadb-libs-5.5.37-1.el7_0.x86_64
3.下载mysql的yum源
cd /etc/yum.repos.d/
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum install -y mysql-server #这个server端只需要在cm主节点上安装就好了,这个我们需要安装在06节点上
yum install -y mysql。#这个6台设备都要安装
4.在test006.tpy.corp上面编辑他的mysql配置文件,配置文件模版:
[mysqld]
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 = 16M
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
# For MySQL version 5.1.8 or later. Comment out binlog_format for older versions.
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.在主节点上启动mysql服务端:
service mysqld start
6.设置初始密码及自启动
mysqladmin -u root password '1qaz@WSX?'
chkconfig mysqld on
八、下载主程序
下载Cloudera Manager
The recommended tool for installing Cloudera
我们先去CDH官网查看下依赖关系:
https://www.cloudera.com/
进入downloads,选择Cloudera Manager,版本选择5.11.0
进入之后,会选择注册等步骤,这个我们暂时略过
进入下载页面后,会有
Supported Opetating Systems
Supported JDK Versions
Supported DATAbases
然后我们进入CDH源 网址,下载clouderaManager
http://archive-primary.cloudera.com/cm5/cm/5/
下载主程序:
wget http://archive.cloudera.com/cm5/cm/5/cloudera-manager-centos7-cm5.11.0_x86_64.tar.gz
tar zxvf cloudera-manager-centos7-cm5.11.0_x86_64.tar.gz
解压完成后发现有两个文件夹:
[root@test006 zpy]# ll
drwxr-xr-x 4 1106 4001 36 Apr 13 05:15 cloudera
drwxr-xr-x 9 1106 4001 88 Apr 13 05:15 cm-5.11.0
九、创建并配置CM数据库
安装MySQL JDBC驱动
下载JDBC连接mysql的库:mysql-connector-java-5.1.38-bin.jar
下载地址:https://dev.mysql.com/downloads/file/?id=412737
最新版 https://dev.mysql.com/downloads/file/?id=470332
下载下来是一个tar.gz 的包,解压后文件夹内有一个.jar的包
cp mysql-connector-java-5.1.44-bin.jar /app/zpy/cm-5.11.0/share/cmf/lib/
创建数据库
/app/zpy/cm-5.11.0/share/cmf/schema/scm_prepare_database.sh mysql cm -hlocalhost -uroot -p1qaz@WSX? --scm-host localhost scm scm scm
之后我们检查数据库:
mysql> show databases ;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cm |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)
发现多了一个cm库
登录数据库执行
Use cm;
Flush tables;
mysql为了提高其性能,部分数据时缓存在内存中,因此要刷新表(清除缓存),就需要使用
配置cm代理:
vim /app/zpy/cm-5.11.0/etc/cloudera-scm-agent/config.ini
修改:
server_host=hadoop1.zipeiyi.com(这里一定写域名)
可以看到它的server_port是7180
vim /app/zpy/cm-5.11.0/etc/cloudera-scm-agent/config.ini
修改:
parcel_dir=/app/zpy/cloudera/parcels
十、配置parcel 源
我们选择的parcel源服务器就是test006.tpy.corp
yum install httpd
mkdir -p /var/www/html/cdh5/parcels/latest
cd /var/www/html/cdh5/parcels/latest
wget http://archive.cloudera.com/cdh5/parcels/5.11.0/CDH-5.11.0-1.cdh5.11.0.p0.34-el7.parcel
wget http://archive.cloudera.com/cdh5/parcels/5.11.0/CDH-5.11.0-1.cdh5.11.0.p0.34-el7.parcel.sha1
wget http://archive.cloudera.com/cdh5/parcels/5.11.0/manifest.json
mv CDH-5.11.0-1.cdh5.11.0.p0.34-el7.parcel.sha1 CDH-5.11.0-1.cdh5.11.0.p0.34-el7.parcel.sha
service httpd start
验证:http://192.169.20.206/cdh5/parcels/latest/
十一、分发程序
把test006主机上的cm-5.11.0,拷贝到其他所有机器上
scp -r cm-5.11.0/ root@test001.tpy.corp:/app/zpy
scp -r cm-5.11.0/ root@test002.tpy.corp:/app/zpy
scp -r cm-5.11.0/ root@test003.tpy.corp:/app/zpy
scp -r cm-5.11.0/ root@test004.tpy.corp:/app/zpy
scp -r cm-5.11.0/ root@test005.tpy.corp:/app/zpy
十二、创建用户
每台设备上都添加用户:
useradd --system --home=/app/zpy/cm-5.11.0/run/cloudera-scm-server --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm
添加用户说明:
-d, --home HOME_DIR
The new user will be created using HOME_DIR as the value for the user′s login directory. The default is to append the LOGIN name to BASE_DIR and use that as the login
directory name. The directory HOME_DIR does not have to exist but will not be created if it is missing.
-c comment
新 帐 号 password 档 的 说 明 栏 。
十三、创建目录并修改权限
mkdir -p /app/zpy/cloudera/parcels
chown cloudera-scm:cloudera-scm /app/zpy/cloudera/parcels
chown -R cloudera-scm:cloudera-scm /app/zpy/cloudera
mkdir -p /var/lib/cloudera-scm-server
chmod 777 /var/lib/cloudera-scm-server
十四、在test006.tpy.corp 上面启动cloudera-server
1)启动命令:
/app/zpy/cm-5.11.0/etc/init.d/cloudera-scm-server start
2)启动之后注意观察日志,日志目录:
/app/zpy/cm-5.11.0/log/cloudera-scm-server
3)检查错误日志:
sed -n "/ERROR/p" cloudera-scm-server.log
发现错误日志:
2017-10-22 18:12:30,501 ERROR main:org.hibernate.engine.jdbc.spi.SqlExceptionHelper: Table 'cm.CM_VERSION' doesn't exist(表不存在)
解决方法:
这是因为没有cm库没有被识别的原因
A.关闭cm-server
/app/zpy/cm-5.11.0/etc/init.d/cloudera-scm-server stop
B. 登陆数据库
检查表是否存在,之后执行 flush tables;
C.重启cloudera-server
/app/zpy/cm-5.11.0/etc/init.d/cloudera-scm-server start
再次检查日志,发现没有继续报错
以下是你有可能遇到的其他报错:
报错二:
/var/lib/cloudera-scm-server 没有权限,进入后发现没有这个目录,所以临时创建
[root@hadoop1 ~]# mkdir -p /var/lib/cloudera-scm-server
[root@hadoop1 ~]# chmod 777 /var/lib/cloudera-scm-server
报错三:
对于没有innodb的情况
>show databases;查看
删除/var/lib/mysql/下ib*,重启服务即可
十五、在所有主机上启动cm-agent
/app/zpy/cm-5.11.0/etc/init.d/cloudera-scm-agent start
然后去看下日志:
/app/zpy/cm-5.11.0/log/cloudera-scm-agent
发现报错:
[22/Oct/2017 21:07:24 +0000] 2353 MainThread agent ERROR Caught unexpected exception in main loop.
Traceback (most recent call last):
File "/app/zpy/cm-5.11.0/lib64/cmf/agent/build/env/lib/python2.7/site-packages/cmf-5.11.0-py2.7.egg/cmf/agent.py", line 710, in __issue_heartbeat
self._init_after_first_heartbeat_response(resp_data)
File "/app/zpy/cm-5.11.0/lib64/cmf/agent/build/env/lib/python2.7/site-packages/cmf-5.11.0-py2.7.egg/cmf/agent.py", line 948, in _init_after_first_heartbeat_response
self.client_configs.load()
File "/app/zpy/cm-5.11.0/lib64/cmf/agent/build/env/lib/python2.7/site-packages/cmf-5.11.0-py2.7.egg/cmf/client_configs.py", line 713, in load
new_deployed.update(self._lookup_alternatives(fname))
File "/app/zpy/cm-5.11.0/lib64/cmf/agent/build/env/lib/python2.7/site-packages/cmf-5.11.0-py2.7.egg/cmf/client_configs.py", line 434, in _lookup_alternatives
return self._parse_alternatives(alt_name, out)
File "/app/zpy/cm-5.11.0/lib64/cmf/agent/build/env/lib/python2.7/site-packages/cmf-5.11.0-py2.7.egg/cmf/client_configs.py", line 446, in _parse_alternatives
path, _, _, priority_str = line.rstrip().split(" ")
ValueError: too many values to unpack
解决方案是修改 /app/zpy/cm-5.11.0/lib64/cmf/agent/build/env/lib/python2.7/site-packages/cmf-5.11.0-py2.7.egg/cmf/client_configs.py 这个脚本的第444行。
for line in output.splitlines():
if line.startswith("/"):
if len(line.rstrip().split(" "))<=4:
path, _, _, priority_str = line.rstrip().split(" ")
# Ignore the alternative if it's not managed by CM.
if CM_MAGIC_PREFIX not in os.path.basename(path):
continue
try:
priority = int(priority_str)
except ValueError:
THROTTLED_LOG.info("Failed to parse %s: %s", name, line)
key = ClientConfigKey(name, path)
value = ClientConfigValue(priority, self._read_generation(path))
ret[key] = value
else:
pass
return ret
添加 if len(line.rstrip().split(" "))<=4: 和 else: pass;
十六 安装cm 控制台








sysctl vm.swappiness=10 && echo “vm.swappiness=10” >>/etc/sysctl.conf
echo never > /sys/kernel/mm/transparent_hugepage/defrag && echo never > /sys/kernel/mm/transparent_hugepage/enabled
vim /etc/rc.local
添加:
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo never > /sys/kernel/mm/transparent_hugepage/enabled



页面下方有一个了解更多帮助:
创建数据库时,输入的作为数据库主机名称的值必须与为主机输入的值(若有的话)匹配(请参阅 Installing and Configuring an External Database)。
例如,如您为 Activity Monitor 数据库输入了以下值
grant all on activity_monitor.* TO 'amon_user'@'localhost' IDENTIFIED BY 'amon_password';
,则在此处为数据库主机名称输入的值必须为 localhost。
另一方面,当您创建数据库时输入了以下值
grant all on activity_monitor.* TO 'amon_user'@'myhost-1.myco.com' IDENTIFIED BY 'amon_password';
,则在此处为数据库主机名称输入的值必须为 myhost-1.myco.com。
如您未指定主机或使用了通配符以从任意主机访问,则可在此处输入完全限定域名 (FQDN) 或 localhost。例如,如您输入了
grant all on activity_monitor.* TO 'amon_user'@'%' IDENTIFIED BY 'amon_password';
,则在此处为数据库主机名称输入的值可以为 FQDN 或 localhost。
同样,如您输入了
grant all on activity_monitor.* TO 'amon_user' IDENTIFIED BY 'amon_password';
,则在此处为数据库主机名称输入的值可以为 FQDN 或 localhost。
按照提示需要修改权限:
mysql> grant all on *.* to root@'test028.tf.corp' identified by '1qaz@WSX?';
Query OK, 0 rows affected (0.01 sec)





十七、安装hive
解决方案:
for hive hive安装前cp(--hive-master节点才需要这个mysql连接库--)
cd /app/zpy/cm-5.11.0/share/cmf/lib/
cp mysql-connector-java-5.1.25-bin.jar /app/zpy/cloudera/parcels/CDH-5.11.0-1.cdh5.11.0.p0.34/lib/hive/lib/




之后登陆mysql
create database hive ;
grant all on hive.* to 'hive'@'test028.tf.corp' identified by '1qaz@WSX?';


spark 关于 JAVA_HOME报错相关:
echo "export JAVA_HOME=/app/zpy/java/jdk1.8.0_51" >> /app/zpy/cloudera/parcels/CDH-5.11.0-1.cdh5.11.0.p0.34/meta/cdh_env.sh

解决方案:
for hive hive安装前cp(--hive-master节点才需要这个mysql连接库--)
cd /app/zpy/cm-5.11.0/share/cmf/lib/
cp mysql-connector-java-5.1.25-bin.jar /app/zpy/cloudera/parcels/CDH-5.11.0-1.cdh5.11.0.p0.34/lib/hive/lib/
删除整个hive服务,重新安装
十八、安装hbase
首先安装hbase 需要首先按装zookeeper,安装过程略

十九 安装spark
spark 有两种模式
spark on yarn
spark standalone
我们一般选择 spark on yarn