CDH集群部署最佳实践

一、集群规划

如果你正准备从0开始搭建一套CDH集群应用于生产环境,那么此时需要做的事情应该是 结合当前的数据、业务、硬件、节点、服务等对集群做合理的规划,而不是马上动手去安装软件。

合理的集群规划应该做到以下几点:

  • 充分了解当前的数据现状
  • 与业务方深入沟通,了解将会在集群上运行的业务,集群将会为业务提供什么服务
  • 结合数据现状与业务,合理预估未来的数据量增长
  • 盘点当前可用的硬件资源,包括机柜机架、服务器、交换机等
  • 当前硬件资源不充足的情况下,根据数据评估情况作出采购建议
  • 根据业务属性与组成,合理规划集群的部署架构
  • 根据可用硬件资源,对集群节点的服务角色进行合理划分

以上步骤完成之后才是动手进行安装与部署。

你将会对集群的架构模式、应用方向与业务场景了然于胸,并确保这个集群(或者是集群组)能够提供稳定、高效、高性能的服务,为业务保驾护航。

并有能力能够提供 集群建设目标

  • 性能需求

    • 简单查询100G数据量时,耗时上限
    • 复杂查询(join)时,耗时上限
    • 历史数据导入时,耗时上限
    • 增量数据导入时,耗时上限
  • 可靠性需求:每月宕机次数(<1),每月宕机时间(<10min)
  • 可用性:每台机器每月的宕机时间
  • 容错性:机器故障,数据不丢失

1.1 硬件规划

硬件规划决定集群将使用多少硬件资源,以及什么配置的硬件资源。

可以从以下几个维度进行评估:

  1. 数据现状

    • 盘点所有数据情况,包括数据源、数据量、数据大小、数据维度等信息
  2. 工作负载

    • 评估在集群与数据之上将执行的任务类型
    • 如实时计算、离线计算、图像处理、关系网络等应用场景以及是否提供OLTP服务等
  3. 未来数据量预估

    • 根据数据源与业务应用场景可以对未来衍生的数据总量与数据增量做大致评估
    • 评估的时间范围视业务场景而定,建议做不少于一年的规划
  4. 硬件资源现状

    • 盘点目前可用的硬件资源,确认是否满足所评估的规模及要求
    • 机房机柜空间、电源(双)等是否充足(需考虑后续扩容问题)
    • 网络交换机性能是否满足要求(建议万兆网卡(双))
    • 查看服务器磁盘、内存、CPU等资源是否需要补充
  5. 硬件选择

    • 现有硬件资源不满足的需求的情况下,结合运维建议提出需要增加或者新采购的硬件型号、配置等
    • 确认所需服务器数量

本位示例主机列表:

  • cdh2-1
  • cdh2-2
  • cdh2-3
  • cdh2-4
  • cdh2-5
  • cdh2-6
  • cdh2-7
  • cdh2-8

服务器硬件情况如下:

| 数量 | CPU | 内存 | 硬盘 |
| --- | --- | --- | --- |
| 8 | 10 | 64G | 3.3T |

1.2 集群架构

混合型集群

指由一个统一的大集群提供所有大数据服务,所有组件集中安装在同一个集群中,有部署简单、运维方便、易于使用等优点。

但是由于混合型集群集群承载了所有功能,职能繁多,网络带宽、磁盘IO等为集群共享,会因大型离线任务占用大量网络或磁盘IO峰值,对线上业务会造成短暂延迟。

且集群环境较为复杂,有较多对线上业务造成影响的风险。

专用型集群

专用型集群指根据不同的需求与功能职责对集群进行划分,由多个职责不同、硬件隔离的集群组成集群组环境提供服务。

子集群各司其职,根据自身业务最大化利用硬件资源,互相独立互不影响。部署较为复杂,运维难度增加。

专用型集群根据业务与应用场景可以划分如下:

  • 离线计算集群
  • 实时计算集群
  • 数据服务集群
  • GPU深度学习集群
  • 图数据库集群

等等。

HBase提供实时读写服务的生产环境下建议将HBase集群独立部署为数据服务集群,参考:HBase最佳实践 - 「集群部署」小节。

1.3 节点规划

进行节点角色划分时尽可能遵守以下原则:

  • CM监控服务在小集群下可以部署在同一主机,大集群下需要独立部署
  • 集群主节点与子节点独立部署(HDFS/HBase/Yarn),且各自子节点部署在相同主机上

    • 独立部署可以避免子节点大量读写、计算引起IO、CPU、网络等资源阻塞而导致主节点异常甚至宕机
    • HDFS/HBase/Yarn部署在相同主机上可以最大化利用数据本地化特性
    • 如果数据量巨大,而集群存储空间不足的时候忽视以上两点,满足业务需求放在第一位
  • Hive、Hue、Impala、Sentry等服务/元数据服务需要部署在同一主机

    • Hue+Sentry对Hive与Impala进行权限控制的时候需要读取Linux主机的用户与用户组进行判别,如果部署在不同主机上则需要在每个主机上创建相同的用户与用户组
    • 或者使用LDAP进行账号管理
    • 条件允许情况下,独立主机或者压力小的主机
  • Zookeeper尽量使用5个节点,且条件允许下最好在不同的物理主机上

    • 5个节点的zk可以保证leader的快速选举
    • 在不同的物理主机上可以最大限度保证安全

示例集群主要进程分布如下:

  • CM服务(monitors):cdh2-4
  • HDFS主节点(NameNode):cdh2-1,cdh2-2
  • HDFS容灾节点(JournalNode):cdh2-[1:3]
  • HDFS数据节点(DataNode):cdh2-[3:8]
  • HBase主节点(HMaster):cdh2-1,cdh2-2
  • HBase数据节点(RegionServer):cdh2-[3:8]
  • Yarn主节点(ResourceManager):cdh2-1,cdh2-2
  • Yarn子节点(NodeManager):cdh2-[3:8]
  • Hive元数据服务(Metastore、HiveServer2):cdh2-3
  • Hue服务(HueServer):cdh2-3
  • Impala服务(CatalogServer、StateStore):cdh2-3
  • Sentry权限验证服务(SentryServer):cdh2-3
  • Oozie服务(OozieServer):cdh2-3
  • Zookeeper服务(Server):cdh2-[1:5]
  • Solr服务(SolrServer):cdh2-4
  • Spark服务(HistoryServer):cdh2-4
  • Kakfa服务(KafkaBroker):cdh2-[6:8]
  • Flume(Agent):cdh2-[6-8]

1.4 集群结构图

CDH集群部署最佳实践

二、集群安装与部署

2.1 打开系统网络

操作系统安装初始,如果无法ping通内部服务,则检查 /etc/sysconfig/network-scripts/ifcfg-ens33 文件,确认 ONBOOT 的值如果为no需要修改为yes(Centos7.5虚拟机安装初始默认为no),否则网络无法连通。

手动检查各个主机上的网络设置,如果有问题则修改配置:

# ONBOOT=no 改成 ONBOOT=yes
vim /etc/sysconfig/network-scripts/ifcfg-ens33
reboot

2.2 硬盘挂载

如果服务器硬盘已插入还未挂载则需要先载入硬盘:

# 格式化硬盘为xfs
mkfs -t xfs /dev/sdb

# 硬盘挂载
# 主节点
mount  /dev/sdb  /opt
# 计算节点
mount  /dev/sdb  /opt/data1
mount  /dev/sdc  /opt/data2

# 查看挂载结果
df -HT

2.3 自动化安装

使用自动化脚本工具进行安装操作:

# 获取安装脚本,上传相关安装软件包至服务器(JDK、MySQL、CM、CDH等)
yum install -y git
git clone https://github.com/chubbyjiang/cdh-deploy-robot.git
cd cdh-deploy-robot

# 编辑节点主机名
vi hosts
# 修改安装配置项
vi deploy-robot.cnf
# 执行
sh deploy-robot.sh install_all

安装脚本将会执行 配置SSH免密登录、安装软件、操作系统优化、Java等开发环境初始化、MySQL安装、CM服务安装、操作系统性能测试等过程。

脚本操作说明见:CDH集群自动化部署工具

等待cloudera-scm-server进程起来后,在浏览器输入 ip:7180 进入CM管理界面部署CDH组件。

第三部分将详细描述集群手动安装过程,与自动安装达成的效果一致,如已通过自动脚本完成CM服务安装可直接前往第四部分CDH部署。

三、手动安装

以下操作均为Centos7.5操作系统上进行。

3.1 系统设置

主机名配置

设置集群机器主机名,并加入各自hosts文件中:

# 设置各主机主机名
hostnamectl set-hostname cdh2-1

# 更新hosts文件
echo "192.168.2.1 cdh2-1" >> /etc/hosts
echo "192.168.2.2 cdh2-2" >> /etc/hosts
echo "192.168.2.3 cdh2-3" >> /etc/hosts
echo "192.168.2.4 cdh2-4" >> /etc/hosts
echo "192.168.2.5 cdh2-5" >> /etc/hosts
echo "192.168.2.6 cdh2-6" >> /etc/hosts
echo "192.168.2.7 cdh2-7" >> /etc/hosts
echo "192.168.2.8 cdh2-8" >> /etc/hosts

# 拷贝
scp /etc/hosts root@cdh2-2:/etc

SSH免密登录

需要有root权限的用户(root或者sudo权限)设置免密登录。

在各个主机上操作:

# 生成密钥
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 拷贝密钥到登录主机
ssh-copy-id -i ~/.ssh/id_rsa.pub root@cdh2-1

从登录主机上复制到其他主机:

# 同步密钥
scp ~/.ssh/authorized_keys root@cdh2-2:~/.ssh/
# 测试
ssh cdh2-2 date

安装Ansible

安装ansible批量管理主机:

# 控制机器上安装ansible
yum install -y ansible

安装完毕后配置修改 /etc/ansible/hosts 对需要管理的主机进行配置,默认配置需要修改编辑 /etc/ansible/ansible.cfg

ansible使用配置参考 Ansible官网

host示例配置如下:

[except1]
cdh2-[2:8]

[all]
cdh2-[1:8]

关闭selinux

查看selinux状态:

# Enforcing 开启状态
# Disabled 关闭状态
ansible all -a "getenforce"

修改为关闭状态:

# 在控制机器上修改内容
vim /etc/selinux/config
SELINUX=disable 
# 同步到其他机器
ansible all -m copy -a "src=/etc/selinux/config dest=/etc/selinux/config"
# 需要重启时候启用

禁用IPv6

Centos7.5默认开启IPv6,CM组件明确说明不支持系统的IPv6功能,IPv6开启状态下可能会出现不可预料的错误,需要提前关闭。

查看IPv6启用状态可以通过以下几种方式:

  • ifconfig:查看是否有IPv6的地址(inet6)
  • lsmod:查看是否有ipv6关键字
  • disable_ipv6:查看/proc/sys/net/ipv6/conf/all/disable_ipv6文件内容,0为开启,1为关闭
# 查看IPv6当前状态,有值则为打开,空则为关闭
ansible all -a "lsmod | grep ipv6"

IPv6打开的情况下如何关闭:

# 第六行添加
vim /etc/default/grub
GRUB_CMDLINE_LUNUX="ipv6.disable=1 ...."
ansible all -m copy -a "src=/etc/default/grub dest=/etc/default/grub"
# 重启
ansible all -a "reboot"
# 验证
ansible all -a "lsmod | grep ipv6"

防火墙设置

局域网内部安全情况下最好关闭防火墙,因为CM管理组件和CDH组件有大量的端口进行通讯,需要配置很多防火墙策略。

需要开放的端口可参考 官网说明,如果不能确保开放所有所需端口,则需要关闭防火墙。

关闭防火墙:

firewall

ansible all -a "systemctl status firewalld"
ansible all -a "systemctl stop firewalld"
ansible all -a "systemctl disable firewalld"

iptables

ansible all -a "chkconfig iptables off"
ansible all -a "service iptables status"
ansible all -a "service iptables stop"

DNS服务器

# 添加dns,有则略过
echo "nameserver 114.114.114.114" >> /etc/resolv.conf
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
# 文件同步
ansible all -m copy -a "src=/etc/resolv.conf dest=/etc/resolv.conf"

NTP配置

# 调整时区
ansible all -a "ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime"
# 安装ntp
ansible all -a "yum install ntp -y"
# 手动同步时间(ntpd服务关闭的情况下),避免时间差距过大导致同步失败
ansible all -a "ntpdate -u 0.cn.pool.ntp.org"

# 配置ntp服务器地址
vim /etc/ntp.conf
# 有外网的情况下可直接配置外部ntp服务器
echo "server ntp1.aliyun.com" >> /etc/ntp.conf
# 其他备用ntp服务器
# server 0.pool.ntp.org
# server 1.pool.ntp.org
# server 2.pool.ntp.org
# server 0.pool.ntp.org  # 有域名负载均衡
# server 0.cn.pool.ntp.org  # 有域名负载均衡
# server ntp.tuna.tsinghua.edu.cn # 清华大学

# 启动ntp
ansible all -a "systemctl start ntpd"
# 开机启动
ansible all -a "systemctl enable ntpd"

# 查看系统硬件时间
hwclock --systohc

附:NTP内网服务器搭建

配置内网NTP-Server(管理节点)。

ntp.conf配置文件内容如下:

#新增:日志文件
logfile /var/log/ntpd.log
restrict default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1

#授权192.168.1.0网段上所有机器可以从这台机器上查询和时间同步
restrict 192.168.0.0 mask 255.255.0.0 nomodify notrap

#新增:时间服务器列表
#server 0.cn.pool.ntp.org iburst
#server 1.cn.pool.ntp.org iburst
#server 2.cn.pool.ntp.org iburst
#server 3.cn.pool.ntp.org iburst

#新增:当外部时间不可用时,使用本地时间
server 127.127.1.0 biurst
fudge 127.127.1.0 stratum 10

#新增:允许上层时间服务器主动修改本机时间
#restrict 0.cn.pool.ntp.org nomodify notrap noquery
#restrict 1.cn.pool.ntp.org nomodify notrap noquery
#restrict 2.cn.pool.ntp.org nomodify notrap noquery

includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor

3.2 软件包安装

修改yum源

默认国外的yum源下载速度缓慢,替换为国内阿里云的yum源。

# 备份
ansible all -a "mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup"
# 下载
ansible all -a "wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo"
# 更新
ansible all -m shell -a "yum clean all && yum makecache"
ansible all -a "yum -y update"

系统软件安装

安装后续需要用到的系统软件,以备日后服务器无外网无法下载的情况。

# 包括不限于
ansible all -a "yum install -y expect bc net-tools iotop zip unzip telnet wget iperf3 fio ntfs-3g lzo iftop vim"

JDK与Scala

Java安装

JDK下载地址:Cloudera Archive CM, 根据对应的cm版本选择下载。

# 以jdk1.8示例
ansible all -m copy -a "src=/tmp/oracle-j2sdk1.8 dest=/tmp/oracle-j2sdk1.8"
ansible all -m shell -a "yum localinstall -y oracle-j2sdk1.8 && ln -s /usr/java/jdk1.8.0_141-cloudera /usr/java/default"

Scala安装

下载地址:Scala

# 以2.11.8示例
ansible all -m shell -a "rm -rf /usr/scala && mkdir -p /usr/scala"
cp /tmp/scala-2.11.8.tgz /usr/scala
ansible all -m copy -a "src=/usr/scala/scala-2.11.8.tgz dest=/usr/scala/scala-2.11.8.tgz"
ansible all -m shell -a "cd /usr/scala && tar -zxvf scala-2.11.8.tgz && rm -rf scala-2.11.8.tgz"

配置环境变量

ansible all -a "echo JAVA_HOME=/usr/java/jdk1.8.0_141-cloudera >> /etc/profile"
ansible all -a "echo SCALA_HOME=/usr/scala/scala-2.11.8 >> /etc/profile"
ansible all -a "echo CLASSPATH=$JAVA_HOME/bin:$SCALA_HOME/bin >> /etc/profile"
ansible all -a "echo export PATH=$JAVA_HOME:$SCALA_HOME:$CLASSPATH:$PATH >> /etc/profile"
ansible all -a "source /etc/profile"

Python与Python包

Centos7自带python2.7,Centos6自带python2.6需要升级。

python -V
# Python 2.7.5

安装python3.6

# 依赖包安装
ansible all -a "yum install -y openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel gcc-c++ python36-devel cyrus-sasl-lib.x86_64 cyrus-sasl-devel.x86_64 libgsasl-devel.x86_64 epel-release"
# yum源下载
ansible all -a "yum install https://centos7.iuscommunity.org/ius-release.rpm -y"
# 安装python3.6
ansible all -a "yum install python36 -y"
# 安装setuptools
ansible all -a "wget -P /tmp --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-19.6.tar.gz#md5=c607dd118eae682c44ed146367a17e26"
ansible all -a "tar -zxvf /tmp/setuptools-19.6.tar.gz"
ansible all -m shell -a "cd /tmp/setuptools-19.6 && python3.6 setup.py build && python3.6 setup.py install"
# 安装pip3.6
ansible all -a "wget -P /tmp --no-check-certificate https://pypi.python.org/packages/source/p/pip/pip-8.0.2.tar.gz#md5=3a73c4188f8dbad6a1e6f6d44d117eeb"
ansible all -a "tar -zxvf /tmp/pip-8.0.2.tar.gz"
ansible all -m shell -a "cd /tmp/pip-8.0.2 && python3.6 setup.py build && python3.6 setup.py install"

修改pip源

ansible all -a "mkdir ~/.pip"
vim ~/.pip/pip.conf

# 内容修改如下
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

# 文件同步
ansibe all -m copy -a "src=/root/.pip/pip.conf dest=/root/.pip/pip.conf"

# 更新
ansible all -m shell -a "pip3.6 install --upgrade setuptools && easy_install-3.6 -U setuptools && pip3.6 install --upgrade pip"

安装python所需依赖包:

ansibe all -m copy -a "src=/tmp/requirements.txt dest=/tmp/requirements.txt"
ansible all -a "pip3.6 install -r /tmp/requirements.txt"

3.3 其他系统设置

中文乱码

安装操作系统时选择了中文语言,使用时发现部分中文会有乱码的情况,解决方案如下:

vim /etc/locale.conf
# 内容
LANG=zh_CN.UTF-8
LC_CTYPE=zh_CN.UTF-8
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=

# 更新
ansible all -m copy -a "src=/etc/locale.conf dest=/etc/locale.conf"
ansible all -a "source /etc/locale.conf"

tuned

ansible all -a "systemctl start tuned"
ansible all -a "systemctl status tuned"
# 显示No current active profile
ansible all -a "tuned-adm off"
ansible all -a "tuned-adm list"
# 关闭tuned服务
ansible all -a "systemctl stop tuned"
ansible all -a "systemctl disable tuned"

大页面关闭

# 输出[always] never意味着THP已启用,always [never]意味着THP未启用
ansible all -a "cat /sys/kernel/mm/transparent_hugepage/enabled"
ansible all -a "cat /sys/kernel/mm/transparent_hugepage/defrag"

# 关闭
ansible all -m shell -a "echo never > /sys/kernel/mm/transparent_hugepage/enabled"
ansible all -m shell -a "echo never > /sys/kernel/mm/transparent_hugepage/defrag"
# 设置开机关闭
echo "echo never > /sys/kernel/mm/transparent_hugepage/defrag" >> /etc/rc.local
echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.local
chmod +x /etc/rc.d/rc.local

# 在GRUB_CMDLINE_LINUX项目后面添加一个参数:transparent_hugepage=never
vim /etc/default/grub
ansile all -m copy -a "src=/etc/default/grub dest=/etc/default/grub"
# 重新生成gurb.cfg文件
ansible all -a "grub2-mkconfig -o /boot/grub2/grub.cfg"

swappiness

ansible all -a "cat /proc/sys/vm/swappiness"
ansible all -a "sysctl -w vm.swappiness=1"
echo "vm.swappiness=1" >> /etc/sysctl.conf
ansible all -m copy -a "src=/etc/sysctl.conf dest=/etc/sysctl.conf"

会话超时

echo "TMOUT=900">>/etc/profile

内核优化

 echo -e "\nnet.ipv4.tcp_tw_reuse = 1
 \nnet.ipv4.tcp_tw_recycle = 1
 \nnet.ipv4.tcp_keepalive_time = 1200
 \nnet.ipv4.ip_local_port_range = 10000 65000
 \nnet.ipv4.tcp_max_syn_backlog = 8192
 \nnet.ipv4.tcp_max_tw_buckets = 5000
 \nfs.file-max = 655350
 \nnet.ipv4.route.gc_timeout = 100
 \nnet.ipv4.tcp_syn_retries = 1
 \nnet.ipv4.tcp_synack_retries = 1
 \nnet.core.netdev_max_backlog = 16384
 \nnet.ipv4.tcp_max_orphans = 16384
 \nnet.ipv4.tcp_fin_timeout = 2
 \net.core.somaxconn=32768
 \kernel.threads-max=196605
 \kernel.pid_max=196605
 \vm.max_map_count=393210"  >> /etc/sysctl.conf

最大打开文件数

ulimit -a
sed -i '$ a\* soft nofile 196605' /etc/security/limits.conf
sed -i '$ a\* hard nofile 196605' /etc/security/limits.conf
echo "* soft nproc 196605" >> /etc/security/limits.conf
echo "* hard nproc 196605" >> /etc/security/limits.conf

3.4 系统性能测试

网络测试

使用iperf测试主机之间的网络传输效率。

# 在一个主机上启动iperf 服务端
iperf3 -s -p 12345 -i 1
# 另外一个主机启动iperf 客户端连接服务端
iperf3 -c cdh85-19 -p 12345 -i 1 -t 10 -w 100K

磁盘IO测试

使用fio工具对io进行各个场景的读写性能测试。

随机读

fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=4k -size=60G -numjobs=64 -runtime=10 -group_reporting -name=file -allow_mounted_write=1

顺序读

fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=4k -size=60G -numjobs=64 -runtime=10 -group_reporting -name=file -allow_mounted_write=1

随机写

fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=60G -numjobs=64 -runtime=10 -group_reporting -name=file -allow_mounted_write=1

顺序写

fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=4k -size=60G -numjobs=64 -runtime=10 -group_reporting -name=file -allow_mounted_write=1

混合随机读写

fio -filename=/dev/sda -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=30 -ioengine=psync -bs=4k -size=60G -numjobs=64 -runtime=10 -group_reporting -name=file -ioscheduler=noop -allow_mounted_write=1

todo:

  • 内存性能测试
  • 操作系统性能测试

3.5 MySQL数据库

卸载已有mariadb数据库。

rpm -qa|grep -i mariadb
rpm -e mariadb-libs-5.5.60-1.el7_5.x86_64 --nodeps

下载mysql安装包。

# mysql官网下载bundle安装包并上传至服务器

# 安装
rpm -ivh /tmp/mysql-community-common-5.7.20-1.el7.x86_64.rpm
rpm -ivh /tmp/mysql-community-libs-5.7.20-1.el7.x86_64.rpm
rpm -ivh /tmp/mysql-community-client-5.7.20-1.el7.x86_64.rpm
rpm -ivh /tmp/mysql-community-server-5.7.20-1.el7.x86_64.rpm

创建MySQL数据目录(非默认盘):

mkdir -p /opt/mysql/data

修改mysql配置文件内容

vim /etc/my.conf

[mysqld]
# datadir修改为/opt/mysql/data
datadir=/opt/mysql/data
socket=/var/lib/mysql/mysql.sock

# set the isolation level to READ-COMMITTED
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 - Allow 100 maximum connections for each database and then add 50 extra connections. 
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.
# 修改binlog存储路径
log_bin=/opt/mysql/binlog/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
# set the innodb_flush_method property to O_DIRECT.
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

备份文件logfile文件

cp /var/lib/mysql/ib_logfile0 /tmp/hadoop/ib_logfile0.ba
cp /var/lib/mysql/ib_logfile1 /tmp/hadoop/ib_logfile1.ba

安装mysql驱动

# 官网下载mysql驱动并上传至服务器
# Installing the MySQL JDBC Driver
tar zxvf /tmp/mysql-connector-java-5.1.46.tar.gz

ansible all -a "mkdir -p /usr/share/java/"
# 注意去掉版本号,否则cm无法使用
ansible all -m copy -a "src=/tmp/mysql-connector-java-5.1.46/mysql-connector-java-5.1.46-bin.jar /usr/share/java/usr/share/java/mysql-connector-java.jar"
rm -rf /tmp/mysql-connector-java-5.1.46*

启动mysql服务

systemctl start mysqld
systemctl status mysqld
systemctl enable mysqld

设置mysql账号密码

# 初始密码
grep "temporary password" /var/log/mysqld.log
# 重置
/usr/bin/mysql_secure_installation

mysql5.7以上强制密码策略不满足可以通过以下方式修改:

# 默认1,中等强度策略
mysql -u root -p"$init_passwd" --connect-expired-password -e "set global validate_password_policy=0"
# 默认8长度
mysql -u root -p"$init_passwd" --connect-expired-password -e "set global validate_password_length=1"

进入mysql并创建数据库:

mysql -u root -p

# Configure the Cloudera Manager Server, Activity Monitor, Reports Manager, Cloudera Navigator Audit Server, and Cloudera Navigator Metadata Server databases to support the utf8mb4 character set encoding.
# Configure all other databases to use the utf8 character set.
CREATE DATABASE scm DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON scm.* TO 'scm'@'%' IDENTIFIED BY 'scm@DW';
CREATE DATABASE amon DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON amon.* TO 'amon'@'%' IDENTIFIED BY 'amon@DW';
CREATE DATABASE rman DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON rman.* TO 'rman'@'%' IDENTIFIED BY 'rman@DW';
CREATE DATABASE hue DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON hue.* TO 'hue'@'%' IDENTIFIED BY 'hue@DW';
CREATE DATABASE metastore DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON metastore.* TO 'hive'@'%' IDENTIFIED BY 'hive@DW';
CREATE DATABASE sentry DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON sentry.* TO 'sentry'@'%' IDENTIFIED BY 'sentry@DW';
CREATE DATABASE nav DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON nav.* TO 'nav'@'%' IDENTIFIED BY 'nav@DW';
CREATE DATABASE navms DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON navms.* TO 'navms'@'%' IDENTIFIED BY 'navms@DW';
CREATE DATABASE oozie DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL ON oozie.* TO 'oozie'@'%' IDENTIFIED BY 'oozie@DW';
SHOW DATABASES;

注意事项:

在大型集群中Activity Monitor 与 Service Monitor 使用的数据库应该分配不同的磁盘卷来进行读写。

在超过50个节点的集群中,不要将所有服务的数据库装在一个节点中,否则该节点的数据库压力会很大。最好能为每个服务配置不同位于不同节点上的数据库。

不需要使用专门的数据库服务器,但是每个服务的数据库应该分散在不同的节点上。

如果集群节点超过1000个,将mysql的max_allowed_packet值设置为16M。

For MySQL 5.6 and 5.7, you must install the MySQL-shared-compat or MySQL-shared package. This is required for the Cloudera Manager Agent package installation.

3.6 安装Cloudera Manager服务

本次过程不启用auto-ssl。

安装CM软件包

创建免密root权限用户

vim /etc/sudoers
cloudera-scm    ALL=(ALL)    NOPASSWD:ALL 

# 同步
ansible except1 -m copy -a "src=/etc/sudoers dest=/etc/sudoers"

这里 下载rpm离线安装包,所需文件及软件列表如下(以6.1版本为例):

  • allkeys.asc
  • cloudera-manager.repo
  • oracle-j2sdk1.8-1.8.0+update181-1.x86_64.rpm
  • cloudera-manager-server-db-2-6.1.0-853290.el7.x86_64.rpm
  • cloudera-manager-server-6.1.0-853290.el7.x86_64.rpm
  • cloudera-manager-daemons-6.1.0-853290.el7.x86_64.rpm
  • cloudera-manager-agent-6.1.0-853290.el7.x86_64.rpm

上传并安装

# 主节点安装所有服务
rpm -ivh --force --nodeps /tmp/cm/*.rpm
# 子节点安装daemons和agent
rpm -ivh --force --nodeps /tmp/cm/daemons*.rpm
rpm -ivh --force --nodeps /tmp/cm/agent*.rpm

**附:yum方式安装**

安装yum源

ansible all -m copy -a "src=/tmp/cm/cloudera-manager.repo dest=/etc/yum.repos.d"
ansible all -m shell -a "yum clean all && yum makecache"

将会下载很多依赖包,需要联网

ansible all -m shell -a "yum localinstall cloudera-manager-daemons-6.1.0-769885.el7.x86_64.rpm cloudera-manager-agent-6.1.0-769885.el7.x86_64.rpm cloudera-manager-server-6.1.0-769885.el7.x86_64.rpm"


#### CDH parcel包

在线安装耗时太长且不稳定,本次只考虑离线安装方式。

从 [这里](https://archive.cloudera.com/cdh6/) 下载以下文件及软件:

- manifest.json
- CDH-6.1.0-1.cdh6.1.0.p0.770702-el7.parcel 

创建安装路径

mkdir -p /opt/cloudera/parcel-repo
mv /tmp/cm/CDH-6.1.0-1.cdh6.1.0.p0.770702-el7.parcel /opt/cloudera/parcel-repo
mv /tmp/cm/manifest.json /opt/cloudera/parcel-repo

创建签名文件

cd /opt/cloudera/parcel-repo && sha1sum CDH-6.1.0-1.cdh6.1.0.p0.770702-el7.parcel | awk '{ print $1 }' > CDH-6.1.0-1.cdh6.1.0.p0.770702-el7.parcel.sha


#### 初始化Cloudera Manager

cm数据库配置

cat /etc/cloudera-scm-server/db.properties

初始化数据库

/opt/cloudera/cm/schema/scm_prepare_database.sh -h cdh2-3 mysql scm scm

启动server

systemctl start cloudera-scm-server

查看日志

tail -f /var/log/cloudera-scm-server/cloudera-scm-server.log

各个节点上启动agent

ansible all -a "systemctl start cloudera-scm-agent"


### 3.7 附:卸载Cloudera Manager服务

删除mysql数据库

drop database scm;
drop database amon;
drop database rman;
drop database hue;
drop database metastore;
drop database sentry;
drop database nav;
drop database navms;
drop database oozie;


卸载软件

ansible all -a "yum -y remove cloudera-manager-*"
ansible all -a "umount /var/run/cloudera-scm-agent/process"

删除数据目录

ansible all -a "rm -Rf /var/lib/cloudera /var/log/cloudera /var/run/cloudera /etc/cloudera /tmp/.scm_prepare_node.lock"


## 四、CDH组件部署

### 4.1 界面安装

进入Web界面,根据节点角色划分安装CDH组件,并启动集群。

正常启动集群后需要根据业务与应用场景对各个组件的配置属性进行调优工作。

### 4.2 组件配置调优

如果对组件配置调优无从下手,可以参考以下配置的调整。

#### HBase

根据使用的业务场景不同,HBase配置优化选项有很大的差异。

有关HBase的性能、配置优化与配置项计算说明可以参考:[HBase最佳实践](https://zhuanlan.zhihu.com/p/72150364) - 「性能优化」小节。 

#### Yarn

开启压缩

mapreduce.output.fileoutputformat.compress=已启用
mapreduce.output.fileoutputformat.compress.type=BLOCK
mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec
mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec
mapreduce.map.output.compress=已启用
zlib.compress.level=DEFAULT_COMPRESSION

设置资源队列

yarn.nodemanager.resource.memory-mb:每台主机上能够被Yarn使用的内存大小
yarn.app.mapreduce.am.resource.cpu-vcores:每台主机上能够被Yarn使用的CPU核心数
yarn.scheduler.minimum-allocation-mb:Container最小申请的内存大小
yarn.scheduler.maximum-allocation-mb:Container最大可申请的内存大小

Service Monitor 客户端配置替代

mapreduce.output.fileoutputformat.compresstruemapreduce.output.fileoutputformat.compress.codecorg.apache.hadoop.io.compress.SnappyCodecio.compression.codecsorg.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.DeflateCodec,org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.Lz4Codec

YARN 服务 MapReduce 高级配置代码段(安全阀)

mapreduce.map.output.compresstruemapred.map.output.compress.codecorg.apache.hadoop.io.compress.SnappyCodec

以上用户需要包含在yarn acl控制的用户中,最好和hue超级用户一致(可以直接访问hdfs页面的路径,但是允许所有人访问,有风险)

hadoop.http.staticuser.useryarn


资源行管参数细节解释说明:

- AM参数mapreduce.map.memory.mb=1536MB,表示AM要为map Container申请1536MB资源,但RM实际分配的内存却是2048MB,因为yarn.scheduler.mininum-allocation-mb=1024MB,这定义了RM最小要分配1024MB,1536MB超过了这个值,所以实际分配给AM的值为2048MB。
- AM参数mapreduce.map.java.opts=-Xmx 1024m,表示运行map任务的jvm内存为1024MB,因为map任务要运行在Container里面,所以这个参数的值略微小于mapreduce.map.memory.mb=1536MB这个值。
- NM参数yarn.nodemanager.vmem-pmem-radio=2.1,这表示NodeManager可以分配给map/reduce Container 2.1倍的虚拟内存,安照上面的配置,实际分配给map Container容器的虚拟内存大小为2048 * 2.1=3225.6MB,若实际用到的内存超过这个值,NM就会kill掉这个map Container,任务执行过程就会出现异常。
- AM参数mapreduce.reduce.memory.mb=3072MB,表示分配给reduce Container的容器大小为3072MB,而map Container的大小分配的是1536MB,从这也看出,reduce Container容器的大小最好是map Container大小的两倍。
- NM参数yarn.nodemanager.resource.mem.mb=24576MB,这个值表示节点分配给NodeManager的可用内存,也就是节点用来执行yarn任务的内存大小。这个值要根据实际服务器内存大小来配置,比如我们hadoop集群机器内存是128GB,我们可以分配其中的80%给yarn,也就是102GB。

**Yarn动态资源队列设置**

在Cloudera Manager界面点击集群选项卡,进入动态资源池配置,设置任务队列、队列资源、访问控制等信息。

#### Spark

spark-conf/spark-defaults.conf 的 Spark 客户端高级配置代码段(安全阀)

spark.driver.extraJavaOptions=-Dfile.encoding=UTF-8
spark.executor.extraJavaOptions=-Dfile.encoding=UTF-8
spark.hadoop.mapred.output.compress=true
spark.hadoop.mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
spark.hadoop.mapred.output.compression.type=BLOCK

修改spark默认的python版本

spark2-conf/spark-env.sh 的 Spark 2 客户端高级配置代码段(安全阀)

PYSPARK_PYTHON=/usr/bin/python3.6

spark-shell或者spark-submit使用

spark.pyspark.python


#### hdfs

压缩设置

io.compression.codecs=org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.DeflateCodec,org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.Lz4Codec

存量数据导入后可进行rebalance操作

sudo -u hdfs hadoop balancer -threshold 10 -policy datanode

启用HA

HDFS服务配置中开启HA设置


#### Impala

hue启用impala

hue_safety_value.ini
[impala]
server_host=
server_port=

hue管理用户勾选组的impala权限


#### Kafka

kafka默认分区数修改为8

num.partitions=8


#### 使用Sentry进行权限管理

Hue、Hive启用Sentry设置:

- hue开启sentry服务
- hive 启用数据库中的存储通知
- hue添加hue用户组和用户,超级管理权限
- security添加super role给hue组,所有权限

添加普通用户流程:

- linux添加用户和用户组
- hue添加用户和用户组
- security添加role给到组

**建议结合LDAP进行账号体系管理。**

### 4.3 其他配置

#### CM集群警报配置

进入Cloudera Manager Service配置界面,搜索alert对邮件警报进行配置。

- 启用电子邮件警报
- 邮件服务器协议:smtp
- 邮箱服务器主机名称:邮箱服务器地址
- 邮箱服务器用户名:邮箱登录用户名
- 邮箱服务器密码:邮箱登录用户密码
- 邮件发件人地址:同登录用户名
- 邮件收件人地址:多个使用逗号隔开

#### 使用hdfs纠错码

HDFS纠错码参考 [这里](https://cloud.tencent.com/developer/article/1363393)。

<!--

hadoop fs -mkdir /ec_xor
hdfs ec -getPolicy -path /ec_xor
hdfs ec -enablePolicy -policy XOR-2-1-1024k
hdfs ec -setPolicy -path /ec_xor -policy XOR-2-1-1024k
hdfs ec -getPolicy -path /ec_xor
hdfs ec -setPolicy -path /ec_xor -policy RS-10-4-1024k
hdfs ec -enablePolicy -policy RS-6-3-1024k
hdfs ec -setPolicy -path /ec_xor -policy RS-6-3-1024k
ll
vi ec_test.txt
hadoop fs -put ec_test.txt /ec_xor
hdfs ec -setPolicy -path /ec_xor_s -policy XOR-2-1-1024k
hdfs ec -setPolicy -path /ec_xor_m -policy XOR-2-1-1024k
hdfs ec -setPolicy -path /ec_xor_l -policy XOR-2-1-1024k
ll
hadoop fs -put mysql-connector-java-8.0.12-1.el7.noarch.rpm /ec_xor
hadoop fs -put mysql-connector-java-8.0.12-1.el7.noarch.rpm /ec_xor_s
hadoop fs -put mysql-connector-java-8.0.12-1.el7.noarch.rpm /ec_xor_m
hadoop fs -put mysql-connector-java-8.0.12-1.el7.noarch.rpm /ec_xor_l
hadoop fs -put Downloads.zip /ec_xor_s
hadoop fs -put /ec_xor_s
hadoop fs -put Downloads.zip /ec_xor_l
hdfs fsck /ec_xor_s -files -blocks -locations
rz -E
hadoop fs -rmr /ec_xor_s/
hadoop fs -mkdir /ec_xor_s/
hdfs ec -setPolicy -path /ec_xor_s -policy XOR-2-1-1024k
hadoop fs -ls /ec_xor_m/D
hadoop fs -ls /ec_xor_m/
hadoop fs -rm -r /ec_xor_m/Downloads.zip
hadoop fs -rm -r /ec_xor_l/mysql-connector-java-8.0.12-1.el7.noarch.rpm
ll
hadoop fs -put MTracer.zip /ec_xor_s
hdfs fsck /ec_xor_s -files -blocks -locations
hdfs fsck /ec_xor_m -files -blocks -locations
hdfs fsck /ec_xor_l -files -blocks -locations
hdfs ec -getPolicy -path /tmp
hdfs ec -getPolicy -path /
hdfs ec -getPolicy -path /ec_xor
hadoop fs -ls /
hadoop fs -ls /user
hdfs ec -setPolicy -path /user/zhangsan
hdfs ec -getPolicy -path /user/zhangsan
hdfs ec -getPolicy -path /user/yarn
hdfs ec -getPolicy -path /user/zhangsan -policy XOR-2-1-1024k
hdfs ec -setPolicy -path /user/zhangsan -policy XOR-2-1-102
hdfs ec -getPolicy -path /user/yarn
hdfs ec -getPolicy -path /user/zhangsan
hadoop fs -ls /user/zhangsan
hadoop fs -ls /ec_xor_l
hadoop fs -du -h /ec_xor_l

-->

### 4.4 集群性能测试

#### HDFS性能测试

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -D test.build.data=/tmp/benchmark -write -nrFiles 1000 -fileSize 100

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -D test.build.data=/tmp/benchmark -read -nrFiles 1000 -fileSize 100

清理数据

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -D test.build.data=/tmp/benchmark -clean


<!--

写
hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -D test.build.data=/tmp/benchmark -write -nrFiles 10 -fileSize 100
19/04/10 18:47:37 INFO fs.TestDFSIO: ----- TestDFSIO ----- : write
19/04/10 18:47:37 INFO fs.TestDFSIO:             Date & time: Wed Apr 10 18:47:37 CST 2019
19/04/10 18:47:37 INFO fs.TestDFSIO:         Number of files: 10
19/04/10 18:47:37 INFO fs.TestDFSIO:  Total MBytes processed: 1000
19/04/10 18:47:37 INFO fs.TestDFSIO:       Throughput mb/sec: 87.5
19/04/10 18:47:37 INFO fs.TestDFSIO:  Average IO rate mb/sec: 90.16
19/04/10 18:47:37 INFO fs.TestDFSIO:   IO rate std deviation: 14.55
19/04/10 18:47:37 INFO fs.TestDFSIO:      Test exec time sec: 31.95

# 对比项
yarn jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -D mapreduce.job.queuename=xy_yarn_pool.production -D mapred.output.compress=false -D test.build.data=/tmp/benchmark -write -nrFiles 10 -fileSize 100
19/04/10 22:15:40 INFO fs.TestDFSIO: ----- TestDFSIO ----- : write
19/04/10 22:15:40 INFO fs.TestDFSIO:             Date & time: Wed Apr 10 22:15:40 CST 2019
19/04/10 22:15:40 INFO fs.TestDFSIO:         Number of files: 10
19/04/10 22:15:40 INFO fs.TestDFSIO:  Total MBytes processed: 1000
19/04/10 22:15:40 INFO fs.TestDFSIO:       Throughput mb/sec: 259.54
19/04/10 22:15:40 INFO fs.TestDFSIO:  Average IO rate mb/sec: 260.74
19/04/10 22:15:40 INFO fs.TestDFSIO:   IO rate std deviation: 17.77
19/04/10 22:15:40 INFO fs.TestDFSIO:      Test exec time sec: 26.13

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -D test.build.data=/tmp/benchmark -write -nrFiles 1000 -fileSize 100
19/04/10 18:53:53 INFO fs.TestDFSIO:         Number of files: 1000
19/04/10 18:53:53 INFO fs.TestDFSIO:  Total MBytes processed: 100000
19/04/10 18:53:53 INFO fs.TestDFSIO:       Throughput mb/sec: 6.42
19/04/10 18:53:53 INFO fs.TestDFSIO:  Average IO rate mb/sec: 23.27
19/04/10 18:53:53 INFO fs.TestDFSIO:   IO rate std deviation: 24.57
19/04/10 18:53:53 INFO fs.TestDFSIO:      Test exec time sec: 316.87

yarn jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -D mapreduce.job.queuename=xy_yarn_pool.production -D mapred.output.compress=false -D test.build.data=/tmp/benchmark -write -nrFiles 1000 -fileSize 100
19/04/10 22:14:26 INFO fs.TestDFSIO: ----- TestDFSIO ----- : write
19/04/10 22:14:26 INFO fs.TestDFSIO:             Date & time: Wed Apr 10 22:14:26 CST 2019
19/04/10 22:14:26 INFO fs.TestDFSIO:         Number of files: 1000
19/04/10 22:14:26 INFO fs.TestDFSIO:  Total MBytes processed: 100000
19/04/10 22:14:26 INFO fs.TestDFSIO:       Throughput mb/sec: 112.77
19/04/10 22:14:26 INFO fs.TestDFSIO:  Average IO rate mb/sec: 153.85
19/04/10 22:14:26 INFO fs.TestDFSIO:   IO rate std deviation: 74.12
19/04/10 22:14:26 INFO fs.TestDFSIO:      Test exec time sec: 43.1


读
hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -D test.build.data=/tmp/benchmark -read -nrFiles 10 -fileSize 100
19/04/10 18:58:40 INFO fs.TestDFSIO:         Number of files: 10
19/04/10 18:58:40 INFO fs.TestDFSIO:  Total MBytes processed: 1000
19/04/10 18:58:40 INFO fs.TestDFSIO:       Throughput mb/sec: 238.89
19/04/10 18:58:40 INFO fs.TestDFSIO:  Average IO rate mb/sec: 350.91
19/04/10 18:58:40 INFO fs.TestDFSIO:   IO rate std deviation: 197.92
19/04/10 18:58:40 INFO fs.TestDFSIO:      Test exec time sec: 25.89

yarn jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -D mapreduce.job.queuename=xy_yarn_pool.production -D mapred.output.compress=false -D test.build.data=/tmp/benchmark -read -nrFiles 10 -fileSize 100
19/04/10 22:18:41 INFO fs.TestDFSIO: ----- TestDFSIO ----- : read
19/04/10 22:18:41 INFO fs.TestDFSIO:             Date & time: Wed Apr 10 22:18:41 CST 2019
19/04/10 22:18:41 INFO fs.TestDFSIO:         Number of files: 10
19/04/10 22:18:41 INFO fs.TestDFSIO:  Total MBytes processed: 1000
19/04/10 22:18:41 INFO fs.TestDFSIO:       Throughput mb/sec: 625
19/04/10 22:18:41 INFO fs.TestDFSIO:  Average IO rate mb/sec: 661.85
19/04/10 22:18:41 INFO fs.TestDFSIO:   IO rate std deviation: 145.13
19/04/10 22:18:41 INFO fs.TestDFSIO:      Test exec time sec: 24.19

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -D test.build.data=/tmp/benchmark -read -nrFiles 1000 -fileSize 100
19/04/10 19:02:55 INFO fs.TestDFSIO:         Number of files: 1000
19/04/10 19:02:55 INFO fs.TestDFSIO:  Total MBytes processed: 100000
19/04/10 19:02:55 INFO fs.TestDFSIO:       Throughput mb/sec: 21.41
19/04/10 19:02:55 INFO fs.TestDFSIO:  Average IO rate mb/sec: 134.32
19/04/10 19:02:55 INFO fs.TestDFSIO:   IO rate std deviation: 141.37
19/04/10 19:02:55 INFO fs.TestDFSIO:      Test exec time sec: 196.53

yarn jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -D mapreduce.job.queuename=xy_yarn_pool.production -D mapred.output.compress=false -D test.build.data=/tmp/benchmark -read -nrFiles 1000 -fileSize 100
19/04/10 22:23:33 INFO fs.TestDFSIO: ----- TestDFSIO ----- : read
19/04/10 22:23:33 INFO fs.TestDFSIO:             Date & time: Wed Apr 10 22:23:33 CST 2019
19/04/10 22:23:33 INFO fs.TestDFSIO:         Number of files: 1000
19/04/10 22:23:33 INFO fs.TestDFSIO:  Total MBytes processed: 100000
19/04/10 22:23:33 INFO fs.TestDFSIO:       Throughput mb/sec: 290.01
19/04/10 22:23:33 INFO fs.TestDFSIO:  Average IO rate mb/sec: 512.34
19/04/10 22:23:33 INFO fs.TestDFSIO:   IO rate std deviation: 397.11
19/04/10 22:23:33 INFO fs.TestDFSIO:      Test exec time sec: 39.97

hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -D test.build.data=/tmp/benchmark -clean
yarn jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-tests.jar TestDFSIO -D mapreduce.job.queuename=xy_yarn_pool.production -D test.build.data=/tmp/benchmark -clean
# TeraSort命令耗时42.787s
-->

#### hbase性能测试

hbase org.apache.hadoop.hbase.PerformanceEvaluation --nomapred --rows=100000 --presplit=100 sequentialWrite 10
19/04/11 09:08:19 INFO hbase.PerformanceEvaluation: [SequentialWriteTest] Min: 14083ms Max: 14549ms Avg: 14270ms

hbase org.apache.hadoop.hbase.PerformanceEvaluation --nomapred --rows=100000 --presplit=100 randomWrite 10
19/04/11 09:09:59 INFO hbase.PerformanceEvaluation: [RandomWriteTest] Min: 20766ms Max: 21968ms Avg: 21383ms

hbase org.apache.hadoop.hbase.PerformanceEvaluation --nomapred --rows=100000 sequentialRead 10
19/04/11 09:12:07 INFO hbase.PerformanceEvaluation: [SequentialReadTest] Min: 50383ms Max: 52429ms Avg: 51691ms

hbase org.apache.hadoop.hbase.PerformanceEvaluation --nomapred --rows=100000 randomRead 10
19/04/11 09:13:46 INFO hbase.PerformanceEvaluation: [RandomReadTest] Min: 73645ms Max: 74517ms Avg: 74130ms

sudo -u hdfs hbase pe sequentialWrite 1
sudo -u hdfs hbase pe sequentialRead 1
sudo -u hdfs hbase pe randomWrite 1
sudo -u hdfs hbase pe randomRead 1

count 'TestTable', {INTERVAL => 100000, CACHE => 50000}


<!--




#### 磁盘信息

查看硬盘信息

fdisk -l

挂载硬盘

mkfs.xfs /dev/sdb
mount /dev/sdb /opt
umount /dev/sdb


磁盘SSD信息

1为磁盘可旋转,HDD

0为不可旋转,SSD

lsblk -d -o name,rota


磁盘开机自动挂载

blkid /dev/sdb | awk -F '"' '{printf "UUID=%s /opt %s defaults 0 2n",$2,$4}' >> /etc/fstab
cat /etc/fstab | grep opt


**附:centos挂载ntfs硬盘**

fdisk -l
mkdir /mnt/ukey

挂载

mount -t ntfs-3g /dev/sdb1 /mnt/ukey

卸载

umount /dev/sdb1

磁盘繁忙的情况下查看占用的进程

fuser -mv /mnt/

kill

kill -9 pid

重新卸载

umount /dev/sdb1



#### 便捷脚本

pyspark-shell

!/bin/bash

pyspark \
--master yarn \
--queue root.moxing \
--driver-memory 1G \
--executor-memory 4G \
--executor-cores 1 \
--num-executors 10 \
--conf spark.dynamicAllocation.enabled=false


spark-shell

!/bin/bash

spark-shell \
--master yarn \
--deploy-mode client \
--queue root.moxing \
--driver-memory 1G \
--executor-memory 5G \
--num-executors 10 \
--executor-cores 1 \
--conf spark.port.maxRetries=1000 \
--conf spark.yarn.executor.memoryOverhead=5120 \
--conf spark.dynamicAllocation.enabled=false \
--conf spark.hbase.host=cdh2-1,cdh2-2,cdh2-3,cdh2-4,cdh2-5 \
--conf spark.hbase.config=/etc/hbase/conf/hbase-site.xml \
--conf spark.executor.extraClassPath=/opt/cloudera/parcels/CDH/lib/hbase/lib/* \
--conf spark.driver.extraClassPath=/opt/cloudera/parcels/CDH/lib/hbase/lib/*


spark-submit

!/bin/bash

if [ $# -lt 7 ]
then

echo "Usage: [app name] [deploy mode] [mem of driver] [num of executor] [core of executor] [mem of executor] [main class] [path of jar] [more custom params]"
exit 1

fi

name=$1
deploy=$2
memDriv=$3
numExec=$4
coreExec=$5
memExec=$6
class=$6
jar=$7

params=""
if [ $# -gt 8 ]
then

    for((p=9;p<=$#;p++))
    do
            params="$params ${!p}"
    done

fi

spark-submit \
--conf spark.dynamicAllocation.enabled=false \
--name $name \
--master yarn \
--deploy-mode $deploy \
--queue root.prd \
--driver-memory $memDriv \
--num-executors $numExec \
--executor-memory $memExec \
--executor-cores $coreExec \
--class $class \
--jars /home/dw_prd/jars/mysql-connector-java-5.1.35.jar \
--conf spark.executor.extraClassPath=/opt/cloudera/parcels/CDH/lib/hbase/lib/* \
--conf spark.driver.extraClassPath=/opt/cloudera/parcels/CDH/lib/hbase/lib/* $jar $params


hive-beeline

beeline --hiveconf mapreduce.job.queuename=xy_yarn_pool.production -u 'jdbc:hive2://172.20.15.12:10000/xy_app_hive' -n xy_app_hive -p dj@hy#fdabc9 -f $1 --hivevar fo_tab=credit_mining.fo_payment_encrypt --hivevar fi_tab=credit_mining.fi_gw_express_order_idcard1_encrypt --hivevar yanka_tab=xy_ods.t_serve_business_order_real_time_encrypt --hivevar laundering_4_1_tab=xy_app_hive.member_user_newest_status_d_incr --hivevar laundering_4_2_tab=xy_app_spark.prd_member_lending_data_4_d_incr_v2 --hivevar laundering_5_1_tab=xy_app_hive.member_user_newest_status_5_d_incr --hivevar laundering_5_2_tab=xy_app_spark.prd_member_lending_data_5_d_incr_v2


yarn-logs

!/bin/bash

if [ $# -lt 1 ]
then

echo "Usage: [app id]"
exit 1

fi

yarn logs -applicationId $1 | grep '^ batb|Exception' --color


yarn-kill

!/bin/bash

if [ $# -lt 1 ]
then

echo "Usage: [app id]"
exit 1

fi

yarn application -kill $1

上一篇:打卡小程序接口设计流程图


下一篇:微信小程序-template模板