第一章 是什么
背景
在学习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 部署
环境搭建
代码语言:javascript复制本次模拟集群环境使用三个节点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进行集群配置见第九阶段第五节
小技巧:
- 若运行某个指令执行任务阻塞当前 shell 窗口,且想中断运行该任务,若
Ctrl C
不能中断停止,可使用Ctrl Z
将当前任务放到后台进行,从而不阻塞当前 shell 窗口,然后输入jobs -l
,显示当前任务作业的状态及进程号,由kill -9 进程号
,强制终止任务作业
-
netstat -natp |grep 进程号
,查看某个进程使用的端口号du -sh ./
: 统计当前目录的大小du -sh ./*
: 统计当前目录下每个目录的大小ll | wc -l
: 统计当前目录下文件的个数 - 访问 Clouder-manager 的 web 界面 访问:http://ManagerHost:7180, 用户名、密码:admin 若可以访问,则CM安装成功。
- 为什么集群个数更倾向于奇数个,而不是偶数个? 以 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
- 集群管理 添加、删除集群 启动、停止、重启集群 重命名集群 全体集群配置 移动主机
- 主机管理 查看主机详细 主机检查 集群添加主机 分配机架 主机模板 维护模式 删除主机
- 服务管理 添加服务 对比不同集群上的服务配置 启动、停止、重启服务 滚动重启 终止客户端正在执行的命令 删除服务 重命名服务 配置最大进程数 rlimit_fds
- 角色管理 角色实例 添加角色实例 启动、停止、重启角色实例 解除授权 重新授权 删除角色实例 角色组 创建角色组 管理角色组
- 资源管理 动态资源池 静态服务池
- 用户管理
- 安全管理
第三章 其他组件安装
安装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
图形化操作,点点点… 小插曲: 什么叫解耦底层技术的平台产品 ? 直接屏蔽底层的实现
- Hue 介绍 代理 HDFS、Hive 、OOIZE 等模块,调用他们的 API ,执行相应的操作,自己只提供了一个 Web 界面,本身并不做什么事情。
- Hue 的用户模块 在开始使用 Hue 时,首先要进行登录,登录的用户名和密码,由自己设置。使用 Hue 登录成功后,Hue 会将登录的用户名,告诉给 HDFS ,并在 HDFS 中创建用户家目录。 注意: 使用 HDFS 只需要用户名,并不需要密码,需要登录的是 Hue
- Hue 支持文件修改-仅针对小文件
安装 Hive
图形化操作
中间要 Hive 在关系型数据库建立表,并授权
代码语言:javascript复制create database hive DEFAULT CHARACTER SET utf8;
grant all on hive.* TO 'hive'@'%' IDENTIFIED BY 'hive';
安装 OOZIE
同样图形化操作
中间要为 OOZIE 在关系型数量库建立库,并授权
代码语言:javascript复制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 使用
代码语言:javascript复制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 (查询完成后执行)查询最近一次查询的底层信息,[事后诸葛亮]
压缩数据文件的好处:
- 节省空间开销
- 提升计算速度, 由于数据文件压缩后,体积变小,进入内存速度变快,因为 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
代码语言:javascript复制nameNode=hdfs://node01:8020
jobTracker=node01:8032 # 代表ResourceManager端口号
queueName=default
exampleRoot=examples
oozie.wf.application.path=${nameNode}/user/
workflow.xml
代码语言:javascript复制<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