1.CDH介绍
1.1.原生Hadoop的问题
版本管理过于混乱
部署过程较为繁琐,升级难度较大
兼容性差
安全性低
1.2.CDH组件图
CDH特点:
灵活性:存储任何类型的数据并使用各种不同的计算框架进行操作,包括批处理、交互式SQL、免费文本搜索、机器学习和统计计算。
集成:在一个完整的Hadoop平台上快速启动和运行,该平台与广泛的硬件和软件解决方案一起工作。
安全:处理和控制敏感数据。
可伸缩性:启用广泛的应用程序和规模,并扩展它们以满足您的需求。
高可用性:满怀信心地执行任务关键的业务任务。
兼容性:利用您现有的IT基础设施和投资
目前CDH所有安装包都需要付费才能使用了
1.3.CDH和CM(Cloudera Manager)
CDH(Cloudera’s Distribution Including Apache Hadoop),是Hadoop众多分中的一种,由Cloudera公司维护,基于稳定版本的Apache Hadoop构建,并集成了很多补丁,可以直接用于生产环境。是Hadoop等大数据安装包的第三方版本的集合,提供了Hadoop等大数据服务的安装包。
CM(Cloudera Manager)是用于管理cdh集群的端到端应用程序。
Cloudera Manager通过向CDH集群的每个部分提供细粒度的可见性并对其进行控制来设置企业部署标准-授权运营商提高性能、提高服务质量、提高遵从性和降低管理成本。
使用Cloudera Manager,您可以轻松地部署和集中操作完整的CDH堆栈和其他托管服务。
应用程序自动化安装过程,将部署时间从数周减少到分钟;
为您提供在集群范围内运行主机和服务的实时视图;
提供一个单一的中央控制台来执行整个集群的配置更改;
并集成各种报告和诊断工具,以帮助您进行操作。。
服务端/Server:
Cloudera Manager 的核心。主要用于管理 web server 和应用逻辑。它用于安装软件,配置,开始和停止服务,以及管理服务运行的集群。
代理/agent:
安装在每台主机上。它负责启动和停止的进程,部署配置,触发安装和监控主机。
数据库/Database:
存储配置和监控信息。通常可以在一个或多个数据库服务器上运行的多个逻辑数据库。例如,所述的 Cloudera 管理器服务和监视,后台程序使用不同的逻辑数据库。
Cloudera Repository:
由cloudera manager 提供的软件分发库。
客户端/Clients:
提供了一个与 Server 交互的接口
1.4.软件包详情
[root@localhost CDH]# tree
.
├── CDH
│ ├── CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel
│ ├── CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel.sha
│ ├── CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel.sha256
│ ├── manifest.json
│ ├── PHOENIX-1.0.jar
│ ├── PHOENIX-5.0.0-cdh6.2.0.p0.1308267-el7.parcel
│ └── PHOENIX-5.0.0-cdh6.2.0.p0.1308267-el7.parcel.sha
├── CM
│ ├── allkeys.asc
│ ├── cloudera-manager-agent-6.3.1-1466458.el7.x86_64.rpm
│ ├── cloudera-manager-daemons-6.3.1-1466458.el7.x86_64.rpm
│ ├── cloudera-manager-server-6.3.1-1466458.el7.x86_64.rpm
│ ├── cloudera-manager-server-db-2-6.3.1-1466458.el7.x86_64.rpm
│ ├── enterprise-debuginfo-6.3.1-1466458.el7.x86_64.rpm
│ └── oracle-j2sdk1.8-1.8.0+update181-1.x86_64.rpm
└── mysql-connector-java.jar
下载链接:
https://download.csdn.net/download/weixin_42789427/20711416
2.服务器基本配置
2.1.服务器规划
192.168.1.200 cdh-1 Server、mysql、ntpserver
192.168.1.201 cdh-2 Agent
192.168.1.202 cdh-3 Agent
2.2.服务间基础配置
1.修改主机名配置hosts文件--all host
[root@cdh-1 ~]#
[root@cdh-1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.200 cdh-1
192.168.1.201 cdh-2
192.168.1.202 cdh-3
2.关闭系统防火墙--all host
[root@cdh-1 ~]#
[root@cdh-1 ~]# systemctl stop firewalld
[root@cdh-1 ~]# systemctl stop NetworkManager
[root@cdh-1 ~]# systemctl disable firewalld
[root@cdh-1 ~]# systemctl disable NetworkManager
3.关闭selinux--all host
[root@cdh-1 ~]# setenforce 0
[root@cdh-1 ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
4.只允许服务器使用物理内存--all host
setenforce: SELinux is disabled
[root@cdh-1 ~]# echo "vm.swappiness=0" >>/etc/sysctl.conf && sysctl -p
[root@cdh-1 ~]# echo "vm.swappiness=0" >>/etc/sysctl.conf && sysctl -p
vm.swappiness = 0
[root@cdh-1 ~]# echo 1 > /proc/sys/vm/drop_caches
[root@cdh-1 ~]# swapoff -a && swapon -a
5.禁用透明页压缩--all host
[root@cdh-1 ~]# echo "never" >/sys/kernel/mm/transparent_hugepage/defrag
[root@cdh-1 ~]# echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
[root@cdh-1 ~]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.local
[root@cdh-1 ~]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local
[root@cdh-1 ~]# chmod +x /etc/rc.local
6.配置ntp时间同步--all host
[root@cdh-1 ~]# yum install ntp -y
cdh-1配置
[root@cdh-1 ~]# cat <<EOF>/etc/ntp.conf
driftfile /var/lib/ntp/drift
restrict default nomodify
restrict 127.0.0.1
restrict ::1
server 127.127.1.0
fudge 127.127.1.0 stratum 10
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
EOF
[root@cdh-1 ~]# systemctl start ntpd && systemctl enable ntpd
cdh-2、cdh-3
[root@cdh-2 ~]# cat <<EOF>/etc/ntp.conf
driftfile /var/lib/ntp/drift
restrict default nomodify
restrict 127.0.0.1
restrict ::1
server 192.168.1.200 iburst
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitors
EOF
[root@cdh-2 ~]# systemctl start ntpd && systemctl enable ntpd
[root@cdh-2 ~]# crontab -l
#定时同步时间
0 */1 * * * /usr/sbin/ntpdate 192.168.1.200;/sbin/hwclock -w
7.配置最大打开文件数--all host
[root@cdh-1 ~]# cat <<EOF >>/etc/security/limits.conf
* soft nofile 32728
* hard nofile 1024999
* soft nproc 65535
* hard noroc unlimited
* soft memlock unlimited
* hard memlock unlimited
EOF
8.制作CDH本地yum源--cdh-1
[root@cdh-1 ~]# yum install httpd createrepo -y
[root@cdh-1 ~]# echo "ServerName 192.168.1.200" >> /etc/httpd/conf/httpd.conf
[root@cdh-1 ~]# systemctl restart httpd && systemctl enable httpd
[root@cdh-1 CDH]# mv /root/CDH/CM /var/www/html/
[root@cdh-1 ~]# cd /var/www/html/CM/ && createrepo ./
9.配置CDHyum源--all host
[root@cdh-1 ~]# cat <<EOF > /etc/yum.repos.d/CM.repo
[CDH-CM]
name=Cloudera Manager 6.3.1
baseurl=http://192.168.1.200/CM/
gpgcheck=0
enabled=1
EOF
10.安装jdk(这里使用的是CDH的jdk用centos的也可以)--all host
[root@cdh-1 ~]# yum install -y oracle-j2sdk1.8
[root@cdh-1 ~]# cat <<EOF >> /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_181-cloudera
export JRE_HOME=\$JAVA_HOME/jre
export CLASSPATH=.:\$JAVA_HOME/lib:\$JRE_HOME/lib
export PATH=\$JAVA_HOME/bin:\$PATH
EOF
[root@cdh-1 ~]# source /etc/profile
[root@cdh-1 ~]# java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
[root@cdh-1 ~]#
11.配置ssh免密登录--cdh-1
[root@cdh-1 ~]# ssh-keygen
[root@cdh-1 ~]# ssh-copy-id root@192.168.1.200
[root@cdh-1 ~]# ssh-copy-id root@192.168.1.201
[root@cdh-1 ~]# ssh-copy-id root@192.168.1.202
3.CDH配置
1.安装cloudera-manager--all-cdh-1
[root@cdh-1 ~]# yum install -y cloudera-manager-agent cloudera-manager-daemons cloudera-manager-server cloudera-manager-server-db-2
2.安装数据库--cdh-1(使用mariadb简单方便)
[root@cdh-1 ~]# yum install -y mariadb-server
[root@cdh-1 ~]# systemctl start mariadb && systemctl enable mariadb
#初始化数据库
[root@cdh-1 ~]# mysql_secure_installation
#复制mysql的jdbc驱动包到/usr/share/java目录
[root@cdh-1 ~]# mkdir /usr/share/java && mv /root/CDH/mysql-connector-java.jar /usr/share/java/
#创建数据库授权表
[root@cdh-1 ~]# mysql -uroot -proot
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;
grant all privileges on *.* TO root@'%' IDENTIFIED BY 'root';
flush privileges;
#组件与库名对照表
组件名 数据库名
Cloudera Manager Server scm
Activity Monitor amon
Reports Manager rman
Hue hue
Hive Metastore Server metastore
Sentry Server sentry
Cloudera Navigator Audit Server nav
Cloudera Navigator Metadata Server navms
Oozie oozie
#初始化数据库
[root@cdh-1 ~]# /opt/cloudera/cm/schema/scm_prepare_database.sh -h localhost mysql scm root root
3.配置离线parcel库--all-cdh-1
[root@cdh-1 ~]# mv /root/CDH/CDH/* /opt/cloudera/parcel-repo/
[root@cdh-1 ~]# mv /opt/cloudera/parcel-repo/PHOENIX-1.0.jar /opt/cloudera/csd/
[root@cdh-1 ~]# ll /opt/cloudera/parcel-repo/
total 2426228
-rw-r--r-- 1 root root 2082186246 Aug 2 11:11 CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel
-rw-r--r-- 1 root root 40 Aug 2 11:06 CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel.sha
-rw-r--r-- 1 root root 64 Aug 2 11:06 CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel.sha256
-rw-r--r-- 1 root root 33887 Aug 2 11:06 manifest.json
-rw-r--r-- 1 root root 402216960 Aug 2 11:07 PHOENIX-5.0.0-cdh6.2.0.p0.1308267-el7.parcel
-rw-r--r-- 1 root root 41 Aug 2 11:07 PHOENIX-5.0.0-cdh6.2.0.p0.1308267-el7.parcel.sha
4.启动cloudera-scm-server--all-cdh-1
[root@cdh-1 ~]# systemctl start cloudera-scm-server && systemctl enable cloudera-scm-server
[root@cdh-1 ~]# tail -f /var/log/cloudera-scm-server/cloudera-scm-server.log
启动时间很慢,默认端口为7180
[root@cdh-1 ~]# ss -anptl | grep 7180
LISTEN 0 50 *:7180 *:* users:(("java",pid=2467,fd=401
可以访问http://192.168.1.200:7180用户名密码都是admin
输入需要加入集群的agent
输入cdh-1制作的yum源地址
jdk已经安装过了这次就不用再次安装了直接下一步
把manager的私钥下载到本地上传到页面上
由于我们设置了yum源这里会自动安装agent端
因为我们做的是离线parcels源所以也会自动安装
检查网络设置可以直接下一步
可以根据自己需求选择配置,后期都能加添
分配主机角色
根据组件写入对应库
配置目录地址,可以根据服务器磁盘配置
安装详情
安装完成剩下的就点点点操作把
生产中,对CDH集群进行了调优,调整的参数如下:
dfs.namenode.handler.count
NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。对于大集群或者有大量客户端的集群来说,通常需要增大参数dfs.namenode.handler.count的默认值10。设置该值的一般原则是将其设置为集群大小的自然对数乘以20,即20logN,N为集群大小。
dfs.datanode.handler.count
数据节点的服务器线程数,默认为10。可适当增加这个数值来提升DataNode RPC服务的并发度。 在DataNode上设定,取决于系统的繁忙程度,设置太小会导致性能下降甚至报错。线程数的提高将增加DataNode的内存需求,因此,不宜过度调整这个数值。 默认值为3 调整为 10。
dfs.datanode.max.transfer.threads
DataNode可以同时处理的数据传输连接数,即指定在DataNode内外传输数据使用的最大线程数。 官方将该参数的命名改为dfs.datanode.max.transfer.threads。
默认值为4096 调整为8192。
dfs.datanode.du.reserved
当DataNode向NameNode汇报可用的硬盘大小的时候,它会把所有dfs.data.dir所列出的可用的硬盘大小总和发给NameNode。由于mapred.local.dir经常会跟DataNode共享可用的硬盘资源,因此我们需要为Mapreduce任务保留一些硬盘资源。dfs.datanode.du.reserved定义了每个dfs.data.dir所定义的硬盘空间需要保留的大小,以byte为单位。
默认值是10G 调整为50G。
hbase.regionserver.codecs
能够降低存储文件大小以及IO,绝大多数情况下能够提高性能。默认为为空,可以指定gz,lzo等多个,用','分割。
默认值是空 调整为snappy,gz
hbase.client.scanner.timeout.period
hbase.regionserver.lease.period
这俩指标默认值是1分钟 调整为2分钟,但是调整后有报错出来,提示region server的注册时间不能比这个超时时间还要短,必须要小于注册时间,而注册时间是1分钟,所以这个超时时间也只能是1分钟或以下
hbase.regionserver.handler.count
定义连接用户表的客户端并发线程数量。默认值比较小的原因,主要是为了预防用户用一个比较大的写缓冲,然后还有很多客户端并发,这样region servers会垮掉;一般的设置规则是:当请求的内容很大的时候(比如打的put或者scans),那么将该值修改成比较小的值;当请求为较小的get、delete的时候,那么设置一个较大的值(可以和并发数类似)。该值比较大的时候可能会出现停顿或者严重的时候出现OutOfMemery,因为如果请求的内存要求比较大的时候,会导致频繁GC的发生,那么就会产生这种问题。
默认值是10 调整为120
hbase.ipc.server.read.threadpool.size
hbase中RegionServer IPC Read 线程池的大小
默认值是10 调整为150
hbase.hstore.blockingStoreFiles
默认值是10 调整为100
当某一个region的storefile个数达到该值则block写入,等待compact。如果任何一个store(非.META.表里的store)的storefile的文件数大于该值,则在flush memstore前先进行split或者compact,同时把该region添加到flushQueue,延时刷新,这期间会阻塞写操作直到compact完成或者超过hbase.hstore.blockingWaitTime(默认90s)配置的时间,可以设置为30,避免memstore不及时flush。当regionserver运行日志中出现大量的“Region <regionName> has too many store files; delaying flush up to 90000ms"时,说明这个值需要调整了。
hbase.hregion.memstore.flush.size
默认是128M,调整为256M
默认值128M,单位字节,一旦有memstore超过该值将被flush,如果regionserver的jvm内存比较充足(16G以上),可以调整为256M。
hbase.hregion.majorcompaction
默认是7,调整为0,禁止他自动compact
触发major compact的周期。
hbase.hregion.memstore.block.multiplier
默认是2,调整为5
如果一个memstore的内存大小已经超过hbase.hregion.memstore.flush.size * hbase.hregion.memstore.block.multiplier,则会阻塞该memstore的写操作,为避免阻塞,建议设置为5,如果太大,则会有OOM的风险。如果在regionserver日志中出现"Blocking updates for ‘<threadName>‘ on region <regionName> : memstore size <多少M> is >= than blocking <多少M> size"的信息时,说明这个值该调整了。
hbase.regionserver.thread.compaction.small
默认值为1,regionserver做Minor Compaction时线程池里线程数目,可以设置为5。
hbase.regionserver.lease.period
默认1分钟,调整为2分钟
默认值60000(60s),客户端连接regionserver的租约超时时间,客户端必须在这个时间内汇报,否则则认为客户端已死掉。
hbase.client.write.buffer
默认值是2M,调整为5M
默认为2M,写缓存大小,推荐设置为5M,单位是字节,当然越大占用的内存越多,此外测试过设为10M下的入库性能,反而没有5M好
以下是2019年9月18日调整的参数
hbase.ipc.server.max.callqueue.size
未设置的话,值默认值为1024*1024*1024(1G)。可以通过增加queue大小,修改hbase-site.xml,添加如下配置,注意该值不能超过2G,否则会报错,HBASE启动不了,因为JAVA integer 最多支持2147******:
<property>
<name>hbase.ipc.server.max.callqueue.size</name>
<value>2140000000 </value>
</property>
在CDH CM 页面hbase的configuration上搜索 hbase-site
服务端配置和客户端配置都需要修改
然后重启hbase, 并且部署客户端配置
hbase.hregion.max.filesize
默认10G,生产上调整成了30G
hbase.regionserver.maxlogs
默认是32,生产上调整成了128
WAL(Write-Ahead-Log)预写日志是HBase的RegionServer在处理数据插入和删除的过程中用来记录操作内容的一种日志。在每次Put、Delete等一条记录时,首先将其数据写入到RegionServer对应的HLog文件的过程。客户端往RegionServer端提交数据的时候,会先写WAL日志,只有当WAL日志写成功以后,客户端才会被告诉提交数据成功,如果写WAL失败会告知客户端提交失败,换句话说这其实是一个数据落地的过程。
在一个RegionServer上的所有的Region都共享一个HLog,一次数据的提交是先写WAL,写入成功后,再写memstore。当memstore值到达一定是,就会形成一个个StoreFile(理解为HFile格式的封装,本质上还是以HFile的形式存储的)。
如果写操作比较多,那么可以设置高一点。调低可以让rs更快的把数据持久化,那么就可以直接弃掉WAL了。其实写操作比较多可以直接把WAL关闭,这样更省事了。
hbase.regionserver.global.memstore.upperLimit
默认值0.4,改为了0.5
表示rs中的memstore占内存的比例最大值,当达到这个值的时候,就一定进行flush到磁盘的操作。在读比较多的应用中,采用将该值减小的方式,在写比较多的应用中,采用将该值增大的方式,一般改变0.5即可。同cache的限制一般在全部内存的0.8左右为好,这样不太可能出现oom的错误。
hfile.block.cache.size
默认值为0.4,改为了0.3
设置块缓存的内存大小占比;设置为0表示不使用,但是不推荐设置为0,至少需要将hfile文件的目录保存在内存中,在读比较多的应用中,调高该值,在写应用中,调低该值。需要和memstore.upperLimit同时考虑。
CDH中,在页面配置regionserver的heap size
hbase--配置--regionserver--第4页,有这个配置,调整成32000,约等于31.25G
2019年11月27日调整参数:
hbase.regionserver.handler.count
在RegionServers上启动RPC Listener实例的计数。Master使用相同的属性来处理主处理程序的数量。太多的处理者可能会适得其反。使其成为CPU数量的倍数。如果主要是只读的,处理程序计数接近CPU计数做得很好。从CPU数量的两倍开始,并从那里调整。
生产上调整到了120,注意观察内存情况,假如有OOM现象,还要调低。总之要按照CPU的倍数调整。
hbase.ipc.server.callqueue.handler.factor :
0为所有的handler共用一个queue; 1为一个handler一个queue; 0-1之间,比如0.5为两个handler共享一个queue;;; 影响:一个handler只处理他负责的queue,如果配置一个handler一个queue,则有长时间运行task的队列,不能有已经空闲的handler来帮忙处理,只能负责他的handler独自苦逼处理
默认为0,服务器端设置队列个数,假如该值为0.1,那么服务器就会设置handler.count * 0.1 = 30 * 0.1 = 3个队列。先调整这个值来解决callqueue is full的问题。生产上调整成0.2,得到0.2*120=24个队列
hbase.ipc.server.callqueue.read.ratio
将调用队列分成读写队列。指定的时间间隔(应该在0.0到1.0之间)将乘以调用队列的数量。值为0表示不分割调用队列,这意味着读取和写入请求将被推送到相同的一组队列中。低于0.5的值意味着将比写入队列更少的读取队列。值为0.5意味着将有相同数量的读写队列。大于0.5的值意味着将有更多的读队列而不是写入队列。值为1.0意味着除了一个之外的所有队列都用于发送读取请求。示例:假设调用队列的总数为10,则read.ratio为0意味着:10个队列将同时包含读/写请求。0.3的读取比例意味着:3个队列将只包含读取请求,7个队列将只包含写入请求。0.5的read.ratio表示:5个队列将只包含读取请求,5个队列将只包含写入请求。0.8的read.ratio意味着:8个队列将只包含读取请求,2个队列将只包含写入请求。1的read.ratio表示:9个队列将只包含读取请求,1个队列将只包含写入请求。
默认为:0 这个值没调,如果调整的话,不需要重启集群,直接分发配置就行。