CDH——Cloudera’s Distribution Including Apache Hadoop

时间:2022-07-22
本文章向大家介绍CDH——Cloudera’s Distribution Including Apache Hadoop,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

第一章 是什么

背景

在学习CDH之前,我们首先可以考虑如下问题:

  • 1000台服务器的集群,最少要花费多长时间来搭建好Hadoop集群? 包括Hive、Hbase、Flume、Kafka、Spark等等
  • 只给你一天时间,是否能够完成以上工作?
  • 对于以上集群进行hadoop版本升级,你会选择什么升级方案,最少要花费多长时间? 新版本的Hadoop,与Hive、Hbase、Flume、Kafka、Spark等兼容问题如何解决?
个人考量
搭建hdfs ->搭建哪个版本->哪个模式(单机,伪分布式,完全分布式)->ha
nfs/jn 用于同名 nn 之间的数据信息
hadoop软件选择什么版本?去哪下?如何进行编译安装 ? 集群搭建? 
搭建成功运行效率异常(分钟级别-> 小时级别>)日志分析(数据倾斜? shiffer)
如何将合适的版本启动安装,  集群异常预警, 版本自动兼容
这些都是在搭建大数据环境下架构师需要考虑的事情

补充: 为什么 在 Hadoop 2.x 中 HDFS 中有 ZKFC 进程,而 yarn 却没有? 在 Hadoop 1.x 升级到 Hadoop 2.x 的过程中,考虑到向下兼容的问题, NameNode 进程没有嵌入 ZKFC 中的代码,而另外开辟一个进程 ZKFC 。 再者由于 Hadoop 1.x 中没有 yarn 组件,Hadoop 2.x 中才出现的 yarn 组件, 所以 yarn 不用考虑向下兼容的问题,即 ResourceManager 进程就直接嵌入 ZKFC 中的代码,只运行一个进程。

介绍

Cloudera’s Distribution Including Apache Hadoop: 简称“CDH”, 是Hadoop众多分支中的一种,由Cloudera维护,基于稳定版本的Apache Hadoop构建, 是由cloudera进行开发的大数据一站式平台管理解决方案 基于Web的用户界面,支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、 Hbase、Zookeeper、Sqoop,简化了大数据平台的安装、使用难度。点击查看官网

特性

  • 提供了Hadoop的核心
  • 可扩展存储
  • 分布式计算
  • 基于Web的用户界面
  • 版本划分清晰
  • 版本更新速度快
  • 支持Kerberos安全认证
  • 文档清晰
  • 支持多种安装方式(Cloudera Manager方式)
个人理解
CDH: 类比Linux的安装光盘  安装源
CM : 代替人做很多事情
CMS:  反馈集群运维信息
优点
省去在官网下载源码的编译工作  
考虑软件兼容问题  
监控io,容量,故障预警  
缺点
轻开源( 没有相关索引的创建. API的包装 )

Apache Hadoop 不足之处

  • 版本管理混乱
  • 部署过程繁琐、升级过程复杂
  • 兼容性差
  • 安全性低

Hadoop 发行版

  • Apache Hadoop
  • Cloudera’s Distribution Including Apache Hadoop(CDH)
  • Hortonworks Data Platform (HDP)
  • MapR
  • EMR

架构

结构图

微观架构

宏观架构

组件说明

  • Server 管理控制台服务器和应用程序逻辑 负责软件安装、配置 启动和停止服务 管理服务运行的群集
  • Agent 安装在每台主机上 负责启动和停止进程,配置,监控主机
  • Management Service 由一组角色组成的服务,执行各种监视、报警和报告功能
  • Database
  • Cloudera Repository
  • Clients Admin Console API

第二章 安装

CDH 安装方式

  • Cloudera Manager
  • Yum
  • Rpm
  • Tarball

CDH5.4 http://archive.cloudera.com/cdh5/

Cloudera Manager5.4.3: http://www.cloudera.com/downloads/manager/5-4-3.html

Cloudera Manager 部署

环境搭建

本次模拟集群环境使用三个节点node01,node02,node03 运行内存16G 则虚拟机内存分配10 2 2 运行内存为8G 则虚拟机内存分配4 1 1 剩余的2G留给操作系统

# 使用 xshell 登录时
# 不能 open 方式登录,可能会影响后面 ssh 免密
# 而是采用 ssh 方式登录
ssh root@node01,node02,node03

#1、网络配置
# ip配置
vi /etc/sysconfig/network
# host地址映射配置(添加node节点和对应ip的配置)
vi /etc/hosts


# 2、SSH免密钥登录
## 确保没有这个目录
cd /root/.ssh 
## 利用下面命令自动创建.ssh目录, 进入到这个目录下输入下面命令创建免密钥文件
ssh localhost 
## 创建密钥,复制
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
## 输入下面命令以后, .ssh目录下会生成authorized_keys文件,用于存放公钥信息
ssh-copy-id node1/node2/node3

## 两两免密 ,每个人都要将自己的公钥发给其他节点
node1->23
node2->13
node3->12
## 两两免密可以可以这样规划 
node1->node2,node2->node2, node3->node2, 然后将node2生成authorized_keys分发到node1和node3即可

# 3、防火墙关闭
service iptables stop
chkconfig iptables off

# 4、SELINUX关闭
setenforce 0
vi /etc/selinux/config 
SELINUX=disabled

# 5、安装JDK配置环境变量
export JAVA_HOME=/usr/java/jdkXXX
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 6、安装NTP(时间同步服务)
## 获取阿里云
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
## 更新 yum 缓存
yum makecache
yum install -y ntp
## 设置开机启动 
chkconfig ntpd on
## 启动 ntpd 服务
service ntpd start
## 设置时间同步
ntpdate ntp1.aliyun.com

# 7、安装配置mysql
## 安装
yum install -y mysql-server
## 授权
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
##刷新
flush privileges

# 8、下载第三方依赖包
yum install -y chkconfig python bind-utils psmisc libxslt zlib sqlite cyrus-sasl-plain cyrus-sasl-gssapi fuse fuse-libs redhat-lsb

cloudera Manager 安装

集群分发时,一定要先分发,后启动

HOST

node01

node02

node03

Server

*

Agent

*

*

*

# node1上传所需要的所有资料( 图1 )
# 1、安装Cloudera Manager Server、Agent(所有节点: 这个是需要自己推敲的)
mkdir /opt/cloudera-manager # (node01,node02,node03) 
tar zxf cloudera-manager*.tar.gz -C /opt/cloudera-manager(图2)

# 2、配置CM Agent # (node1)
修改文件/opt/cloudera-manager/cm-5.4.3/etc/cloudera-scm-agent/config.ini中server_host
server.host=node1
server.port=7182  (无需记忆,这个是cm和web页面通信的端口)


# 3、创建用户cloudera-scm # (所有节点都要添加---没有家目录,没有解释器,不能够登陆) 
useradd --system --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm


# 4. 创建Parcel目录
## Server节点(node01)
mkdir -p /opt/cloudera/parcel-repo
### 更改文件的角色与权限
chown cloudera-scm:cloudera-scm /opt/cloudera/parcel-repo

## Agent节点, 被分发后节点存放文件的目录(node01,node02,node03) 
mkdir -p /opt/cloudera/parcels
chown cloudera-scm:cloudera-scm /opt/cloudera/parcels


# 5、配置CM Server数据库 # (node01)
## 拷贝mysql jar文件到目录.没有请创建
/usr/share/java/
## 上传并修改mysql的驱动jar名称, 注意jar包名称要修改为
mysql-connector-java.jar

# 进入到node01的MySQL中
## 授权
grant all on *.* to 'temp'@'%' identified by 'temp' with grant option;
## 进入到cm的指定目录
cd /opt/cloudera-manager/cm-5.4.3/share/cmf/schema/
## 运行脚本文件
./scm_prepare_database.sh mysql temp -h node1-utemp -ptemp --scm-host node1scm scm scm
### 格式:数据库类型、数据库、数据库服务器、用户名、密码、cm server服务器



# 6、制作CDH本地源 #(node01)
## 将上传好的文件 CDH-5.4.0-1.cdh5.4.0.p0.27-el6.parcel 以及 manifest.json,将放到server节点的/opt/cloudera/parcel-repo下。
### mv xx ./ 移动到当前目录下, 这一步的目的是完成server持有本地cdh的安装源的配置
### 打开manifest.json文件,里面是json格式的配置, 自行配置的方式是:找到与下载版本相对应的hash码,新建文件,文件名与你的parel包名一致,并加上.sha后缀,将hash码复制到文件中保存。


# 7、分发
cd /opt/cloudera-manager/  
scp -r ./*  root@node02:`pwd`
scp -r ./*  root@node03:`pwd`
## 在复制时, 可以将标准输出扔到黑洞中, 但是异常仍会打印在Xshell窗口
scp -r ./*  root@node03:`pwd` 1> dev/null


# 7、启动CM Server、Agent(图3)
cd /opt/cloudera-manager/cm-5.4.3/etc/init.d/
./cloudera-scm-server start
## 注意!!! Sever首次启动会自动创建表以及数据,不要立即关闭或重启,否则需要删除所有表及数据重新安装
./cloudera-scm-agent start

## 8. 访问( 图4, 图5 )
node1:7180/cmf/login

web页面操作CDH进行集群配置见第九阶段第五节

小技巧:

  1. 若运行某个指令执行任务阻塞当前 shell 窗口,且想中断运行该任务,若 Ctrl + C不能中断停止,可使用 Ctrl + Z 将当前任务放到后台进行,从而不阻塞当前 shell 窗口,然后输入 jobs -l,显示当前任务作业的状态及进程号,由 kill -9 进程号,强制终止任务作业
  1. netstat -natp |grep 进程号,查看某个进程使用的端口号 du -sh ./: 统计当前目录的大小 du -sh ./*: 统计当前目录下每个目录的大小 ll | wc -l : 统计当前目录下文件的个数
  2. 访问 Clouder-manager 的 web 界面 访问:http://ManagerHost:7180, 用户名、密码:admin 若可以访问,则CM安装成功。
  3. 为什么集群个数更倾向于奇数个,而不是偶数个? 以 3 台集群和 4 台集群举例: 3 台集群,若其中有一台宕机了,3 / 2 = 1.5 < 2,达到了过半的条件,集群可以运行。 4 台集群,若其中有一台宕机了,4 / 2 = 2 < 3,达到了过半的条件,集群也可以运行。 但是4 台主机集群和 3台主机集群却承担相同的风险,且成本 4 台主机集群的成本比 3 台主机集群的成本高 举例,若 4 台主机集群中,宕机了 2 台,剩余 2 台,不满足集群主机数量过分的条件,就不保证了集群的数据一致性,进而集群的可用性。同样 3 台主机集群中,宕机了 2台,剩余 1台,也满足集群主机数量过半的条件,即 4 台主机集群和 3台主机集群却承担相同的风险。 说明: 集群中主机数量过半才能正常运行,因为集群中的网络条件等其他因素,可能会出现某台主机在一定时间内不能接受到或者发送消息,所以以集群中主机数量过半作为条件,是较为合理的。

图1

图2

图3

图4

图5

ClouderManager 功能使用

主机 - host 机架 - rack 集群 - Cluster 服务 - service 服务实例 - service instance 角色 - role 角色实例 - role instance 角色组 - role group 主机模板 - host template parcel 静态服务池 - static service pool 动态资源池 - dynamic resource pool

通过Web页面来管理ClouderManager

  1. 集群管理 添加、删除集群 启动、停止、重启集群 重命名集群 全体集群配置 移动主机
  2. 主机管理 查看主机详细 主机检查 集群添加主机 分配机架 主机模板 维护模式 删除主机
  3. 服务管理 添加服务 对比不同集群上的服务配置 启动、停止、重启服务 滚动重启 终止客户端正在执行的命令 删除服务 重命名服务 配置最大进程数 rlimit_fds
  4. 角色管理 角色实例 添加角色实例 启动、停止、重启角色实例 解除授权 重新授权 删除角色实例 角色组 创建角色组 管理角色组
  5. 资源管理 动态资源池 静态服务池
  6. 用户管理
  7. 安全管理

第三章 其他组件安装

安装Hue

Hue是一个开源的Apache Hadoop UI系统。 通过使用Hue我们可以在浏览器端的Web控制台上与Hadoop集群进行交互来分析处理数据。 例如操作HDFS上的数据、运行Hive脚本、管理Oozie任务等等。 是基于Python Web框架Django实现的。 支持任何版本Hadoop

Hue 的特点:

  • 基于文件浏览器(File Browser)访问HDFS
  • 基于web编辑器来开发和运行Hive查询
  • 支持基于Solr进行搜索的应用,并提供可视化的数据视图,报表生成
  • 通过web调试和开发impala交互式查询
  • spark调试和开发
  • Pig开发和调试
  • oozie任务的开发,监控,和工作流协调调度
  • Hbase数据查询和修改,数据展示
  • Hive的元数据(metastore)查询
  • MapReduce任务进度查看,日志追踪
  • 创建和提交MapReduce,Streaming,Java job任务
  • Sqoop2的开发和调试
  • Zookeeper的浏览和编辑
  • 数据库(MySQL,PostGres,SQlite,Oracle)的查询和展示
  • Hub自身没有任何功能, 只是封装了相关技术的API, 我们通过图形化界面即可调用相关的API
  • 文件系统hdfs支持修改, 但是修改并不是真正的修改, 而是删除+重新上传的操作

安装 Hue

图形化操作,点点点… 小插曲: 什么叫解耦底层技术的平台产品 ? 直接屏蔽底层的实现

  1. Hue 介绍 代理 HDFS、Hive 、OOIZE 等模块,调用他们的 API ,执行相应的操作,自己只提供了一个 Web 界面,本身并不做什么事情。
  2. Hue 的用户模块 在开始使用 Hue 时,首先要进行登录,登录的用户名和密码,由自己设置。使用 Hue 登录成功后,Hue 会将登录的用户名,告诉给 HDFS ,并在 HDFS 中创建用户家目录。 注意: 使用 HDFS 只需要用户名,并不需要密码,需要登录的是 Hue
  3. Hue 支持文件修改-仅针对小文件

安装 Hive

图形化操作

中间要 Hive 在关系型数据库建立表,并授权

create database hive  DEFAULT CHARACTER SET utf8;
grant all on hive.* TO 'hive'@'%' IDENTIFIED BY 'hive';

安装 OOZIE

同样图形化操作

中间要为 OOZIE 在关系型数量库建立库,并授权

create database oozie     DEFAULT CHARACTER SET utf8;
grant all on oozie.* TO 'oozie'@'%' IDENTIFIED BY 'oozie';

安装Implal

Cloudera 公司推出,提供对 HDFS 、HBase 数据的高性能、低延迟的交互式 SQL 查询功能 基于 Hive 使用内存计算,兼顾数据仓库、具有实时、批处理、多并发等特点 是 CDH 平台首选的 PB 级大数据实时查询分析引擎

Shuffle

  • MapReduce Shuffle : ​ 首先数据会进行序列化,然后放入环形字节数组缓冲池,当缓冲池达到阈值(默认为 80 M)后,会触发 spill 溢写操作,将缓冲池中的数据写入磁盘文件中,在过程中,会先进行二次排序、分区等操作。若相同的 key 的文件数量达到三个以上,触发 combiner 操作(归并排序),合并文件。注意: 若相同的 key 文件,spill 溢写二次产生二个文件,但不会执行 combiner 操作。从中得出:MapReduce 不能将相同的 key 文件归并到一个文件中,进而得出,MapReduce 写的时候必须采用二次排序的机制来分区有序,且分区里 key 有序(邻接排列在一起), 才能够保证MapReduce 的原语(相同的 key 为一组,方法内迭代这一组数据)。 MapReduce Shuffile 消耗的计算资源较多,二次排序不可避免
  • Spark Shuffle: rpartition : 重新分区 …

Implal 架构

  • Implal 启动后会加载 Hive 的 MetaStore 元数据
  • Implal 基于内存计算, 运行速度比 Hive 快的多
  • Implal 创建元数据会持久化到 Hive 中 ​ Hive 为 Implal 做元数据持久化的操作,而 Hive 的元数据存放在关系型数据库中(MySQL、Oracle 中)
  • Impalad 建完一张表, 然后同步给Statestore, Statestore 将建的表广播给其他的 Impalad 并且广播给Catalog, Catalog将更新修改同步给Hive的 Metastore
  • Hive的 Metastore是Impala的持久化层, 任务时完成了元数据的持久化操作
  • 在这里Hive中直接建表, 表不会动态更新给 Impalad, 但是我们一般不会直接变更元数据

安装 Implal

Catalog Server 安装在 node01 机器上 StateStore 安装在 node01 机器上 Daemon 安装在 node02、node03 机器上

Impala 使用

Impala 的使用 SQL 与 Hive 的使用类似,但是不支持 Hive 一些特殊操作,如: UDF等。

impala-shell -p  显示 sql 执行计划
impala-shell -i  host 登录指定 impala
impala-shell -q sql(语句) 不进入交互界面,图1
-B  去掉表格美化的样式(去除制表符,图2 )
-f  sql 文件的位置(结合脚本使用)
-o  输出文件
-c  查询失败后继续执行


使用  impala-shell 打开,进入 impala 交互界面
show tables; 
特殊用法
help
connect <hostname:port>连接主机, 默认端口为21000
refresh <tablename> 增量刷新元数据库
invalidate metadata 全量刷新元数据库,将 Hive 的元数据同步刷新到 impala
explain <sql>  显示查询执行计划,步骤
shell <shell> 不退出 impala—shell ,执行  Linux 命令
profile (查询完成后执行)查询最近一次查询的底层信息,[事后诸葛亮]

压缩数据文件的好处:

  1. 节省空间开销
  2. 提升计算速度, 由于数据文件压缩后,体积变小,进入内存速度变快,因为 IO 小了。

图1

图2

存储和分区

银行中存放的数据类型一般为 Parquet

Impala 与 HBase 整合

与 Hive 和 HBase 整合类似

安装OOZIE

Oozie 是用于 Hadoop 平台的开源的工作流调度引擎, 用来管理 Hadoop 作业 属于 web 应用程序,由 Oozie Client 和 Oozie Server 两个组件构成。 Oozie Server 运行于 Java Servlet 容器(tomcat) 中的 web 程序 官网: https://oozie.apache.org

作用

架构

Oozie 安装与使用

Oozie 启动成功后,打开 Web 的 UI 界面

解决方法:

  • 下载 http://archive.cloudera.com/gplextras/misc/ext-2.2.zip
yum -y install unzip
unzip  ext-2.2.zip -d  /var/lib/oozie
  • 修改 配置 Configuration,保存,重新启动 Oozie

job.properties

nameNode=hdfs://node01:8020
jobTracker=node01:8032  # 代表ResourceManager端口号
queueName=default
exampleRoot=examples

oozie.wf.application.path=${nameNode}/user/

workflow.xml

<workflow-app xmlns="uri:oozie:workflow:0.3" name="shell-wf">
	<start to="shell-node"/>
	<action name="shell-node">
		<shell xmlns="uri:oozie:shell-action:0.1">
    		<job-tracker>${jobTracker}</job-tracker>                         
			<name-node><${nameNode}</name-node>
			<configuration>
	        	<property>	
                   		<name>mapred.job.queue.name</name>
						<value>${queueName}</value>
				</property>
			</configuration>
			<exec>echo</exec>
			<argument>hi shell in oozie</argument>
		</shell>
		<ok to="end"/>
        <error to="fail"/>
	</action>
	<kill name="fail">
		<message>
			Map/Reduce failed, error message [${wf:errorMessgae(wf:lastErrorNode())}]
		</message>
	</kill>
	<end name="end" />
</workflow-app>

Oozie Cli 命令

运行Oozie脚本

hdfs上传脚本文件 Oozie cli 运行脚本

点击WebUI 页面, 查看脚本任务执行详情

查看执行的节点以及执行的详细信息

查看该任务的MapReduce

查看MapReduce中的Map任务

查看map 任务的日志信息

通过标准输出查看workflow.xml 定义的工作流结果

注意:如果出现了错误信息, 也是通过这样的方式进行追错!!!

使用Oozie 图形化编辑器执行(Workflow 工作流)

链接:https://pan.baidu.com/s/1K699SW7RiD7zfDGnGs2JOA 提取码:ysao