Hadoop 知识整理
# hadoop知识点整理
## 第一章 大数据的概念
大数据是指无法用现有的软件工具提取、存储、搜索、共享、分析和处理的海量的复杂的数据图集。
### 特征
**4个V**:
- Volume:数据体量巨大
- Variety:数据种类繁多
- Value:数据价值密度低
- Velocity:处理速度快
### hadoop生态圈
大数据工具主要包括:Hadoop、Hbase、ZooKeeper、Hive、Mahout、Sqoop、Storm等
#### Hadoop
**Doug Cutting**开发,受到**Map/Reduce**启发,核心是**MapReduce编程模型和HDFS分布式文件系统**。
采用分而治之的思想,Map用来切分大的数据,Reduce用来合并Map计算的结果。
HDFS 分布式文件系统,为海量数据提供存储服务,将大文件拆分为块,多节点存放,具有高吞吐量、高容错性的特点。
#### HBASE
HBASE是Apache开源的KV型数据库,是建立在HDFS之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。
仅支持单行事务。
主要用来存储非结构化和半结构化的松散数据。
#### Hive
Apache Hive数据仓库软件提供对存储在分布式中的大型数据集的查询和管理,它本事是建立在Hadoop之上的
#### Storm
Apache Storm是一个免费、开源的分布式实时计算机系统,简化了数据流的可靠处理。
#### ZooKeeper
zooKeeper是一个高性能、分布式的开源分布式应用协调服务,他是storm、hbase的重要组件,它是一个为分布式应用提供一致性服务的软件。
服务端跑在JAVA上
ZooKeeper有两个角色,一个是leader,负责写服务和数据同步,剩下的是follower,提供读服务。
**特点**:
- 顺序一致性:按照客户端发送请求的顺序更新数据
- 原子性
- 单一性:无论客户端连接哪个server都看到同一个视图
- 可靠性:一旦数据更新成功将一直保持,直到新的更新
- 及时性:客户会在一个确定的时间内得到最新的数据
**运用场景**:
- 数据发布订阅
- 名空间服务
- 分布式通知
- 分布式锁
- 集群管理
#### sqoop
sqoop是Apache顶级项目,允许用户将数据从关系型数据库中抽取数据到Hadoop中
#### mahout
mahout是一个强大的数据挖掘工具,是一个分布式机器学习算法的集合,包括分布式协同过滤的实现、分类、聚类等
### Hadoop历史和版本
历史:
- 2011年12月,Apache基金会发布了Apache Hadoop 版本1.0
- 2013年8月,版本2.0.6可用
- 2017年12月发布Apache Hadoop3
发行版:
Hadoop有许多变体:
- Cloudera Hadoop分布:是Coludera Enterprise的核心,包括Apache Hadoop、Apache Spark,Apache Kafka 以及十多个其他紧密继承的领先开源项目
- Hortonworks Hadoop分布:是基于YARN的安全性强、企业就绪的开源版本
- MapR Hadoop分布:是Hadoop的完成整企业级发行版
- PivotalHD:是领先的基于标准的Hadoop该发行版,为Business Data Lake架构奠定了基础
优势:
- 高可靠性
- 高拓展性
- 高效性
- 高容错性
## 第二章 Hadoop 组成与结构
Hadoop1的三大核心模块:
- Common模块:支持其他模块的工具模块
- HDFS模块:一个高可靠、高吞吐量的分布式文件系统
- MapReduce模块:一个分布式的资源调度和离线并行计算系统
Hadoop2的组成:
MapReduce模块仅作为分布式计算框架存在,资源调度功能交给YARN来调度处理
### HDFS
一个分布式文件系统。
HDF的设计适合一次写入多次读出的场景且不支持文件修改。适合用来做数据分析,并不适合做网盘使用。
Master-Slave结构,Master是NameNode,Slave是DataNode
client职责如下:
- 文件切分
- 与NameNode交互获取文件的位置信息
- 与DataNode交互读取或写入数据
- 提供一些明恋来管理HDFS,比如启动或者关闭HDFS
- 可以通过一些命令来访问HDFS
NameNode职责如下:
- 配置副本策略
- 处理client读写请求
- 管理block(数据块)映射信息,以元数据的形式存储在Fsimage镜像文件中
- 管理HDFS命名空间
DataNode的职责:
- 执行实际的数据块
- 执行数据块的读写操作
SecondaryNameNode,第二名称节点,并非名称节点的热备,晋档NameNode重启或者热备NameNode激活时将宕机前所保留集群的快照发送给NameNode以恢复此前集群的状态。具体功能为:
- 存辅NameNode,分担其工作量
- 定期合并Fsimage和Edits,并推送给NameNode
- 在紧急情况下可辅助恢复NameNode
优点:
- 高容错性
- 适合大数据处理
- 支持流式数据访问
- 可构建在廉价机器上
缺点:
- 不适合低延时数据访问
- 无法高效的对大量小文件进行存储
- 不支持并发写入文件和随机修改
### YARN架构
MRv1的局限:
- 扩展性差
- 可靠性差
- 资源利用率低
- 无法支持多种计算机框架
YARN是一个弹性计算平台,他的目标已经不局限于支持MapReduce一种计算框架,而是朝着对多种框架的统一管理前进
优点:
- 资源利用率高
- 运维成本低
- 数据共享
对比:
| | V1 | V2 |
| ----------- | ---------------------------------------------------------------- | -------------------------------------------------------------------------- |
| 基本框架 | JobTracker由资源管理和作业控制两部分组成 | 将JobTracker的两个功能拆分成两个独立的进程,资源管理进程负责整个集群的资源,而作业控制则是直接与应用程序相关的模块,每个进程只负责一个作业 |
| 编程模型与数据处理引擎 | | MRv2重用了v1中的编程模型与数据处理引擎 |
| 运行时环境 | 由JobTracker和TaskTracker两类服务组成,JT负责资源和任务的管理与调度,TT负责单个节点的资源管理和任务进行 | 将资源部管理与应用程序管理分开,分别又YARN和ApplicationMaster负责 |
#### YARN基本架构
总体上仍然是Master/Slave架构
YARN的组成成分如下:
- ResourceManager:一个全局的资源管理器,负责整个系统的资源管理与分配。它由两个组件构成:
- 调度器(Scheduler):根据容量、队列等限制条件将资源分配给各个正在运行的应用程序
- 应用程序管理器(Application Manager ASM):负责整个系统中所有应用程序
- ApplicationMaster(AM)的主要功能有:
- 与RM调度器协商以获取资源(Container)
- 将得到的任务进一步分给内部任务
- 与NM通信以启动/停止任务
- 监控所有任务运行状态
- NodeManager:是每个节点上资源和任务管理器
- Container:是YARN山中的资源抽象,它封装了某个节点上的多维度资源
## 第三章 Hadoop运行模式与大数据技术框架
Hadoop的运行模式主要有四种:
- 本地模式
- 伪分布式
- 全分布式
- 高可用模式
### 伪分布式模式
Hadoop可以运行在单个节点上,其中每一个Hadoop守护进程运行在单独的Java进程中,这个模式称之为伪分布式模式。Hadoop所有进程都运行在一台服务器以模拟全分布式模式,常用于学习阶段。
后台的五个进程为:
- NameNode
- DataNode
- SecondaryNameNode
- ResourceManager
- NodeManager
### 高可用模式
Hadoop是一种主从式架构,这样就会有**单点故障**的问题
## HDFS
- 数据块(block)
- HDFS默认的最基本的存储单位是128MB的数据块
- 128M为一块
- 一个文件如果小于一个数据块的大小,并不占用整个数据块的空间
- 存放策略(3副本)
- 第一个和client同node
- 第二个放在与第一个节点的不同机架中的随机的一个node
- 第三个放在与第一个节点不同的机架中与第二个不同的随机node中
- NameNode 和DataNode
- HDFS体系结构中有两类节点,一类是NameNode ( Master) ,又叫"元数据节点";另一类是DataNode (Slave) ,又叫"数据 节点”。
- 元数据节点用来管理文件系统的命名空间,作用如下:
- 其将所有的文件和文件夹的元数据保存在一个文件 系统树中
- 这些信息也会在硬盘上保存成以下文件:命名空间镜像(namespace image)及修改日志(edit log)
- 还保存了一个文件包括哪些数据块,分布在哪些数据节点上,然而这些信息并不存储在硬盘上,而是在系统启动的时候从数据节点收集而成的
- 数据节点是文件系统中真正存储数据的地方,作用如下:
- 客户端(clien)或者 元数据信息(namenode)可以向数据节点请求写入或者读出数据块
- 周期性的向元数据节点回报其存储的数据块信息
- `hadoop.tmp.dir`,临时目录,其他临时目录的父目录,默认 `/tmp/hadoop-${user.name}`,在`core-site.xml`中配置
- 元数据节点目录结构,在`hdfs-site.xml`中配置`dfs.name.dir`参数,以`,`分隔,默认在`{hadoop.tmp.dir}/dir/name`
- 数据节点目录结构
- 在`hdfs-site.xml`中配置参数`dfs.data.dir`,以`,`分隔
- HDFS通信协议
- 所有HDFS通信协议都是构建在TCP/IP协议上的
- HDFS安全模式
- Namenode启动后会进入一种称为安全模式的特殊状态。处于安全模式的Namenode是不会进行数据块的复制的。Namenode从所有的DataNode接受心跳信号和块状态报告
**Name Node、DataNode 和Client**
- Namencodte 是分布式文件素统中的管理者, 主要负责管理 文件系统的命名空间、集群配置信息和存储块的复制等。NameNode 会将文件系统的Meta-data 存储在内存中,这些信息主要包括了文件信息,每个文件对应的文件块的信息和每个 文件块DataNode的信息等。
- DataNode是文件存储的基本单元, 它将Block 存储在本地文件系统中,保存了Block 的meta-data,同时 周期性地将所有存在的Block信息发送给NameNode.
- Client 就是需要获取分布式文件系统文件的应用程序。
- Client读取文件信息
### Hadoop Shell命令
实际上是属性,命令为:`hadoop fs -xx`
- `cat`:
- `chgrp`: change group
- `chmod`:
- `chown`
- `copyFromLocal`
- `copyToLocal`
- `cp`: copy
- `du`:显示目录中所有文件的大小
- `dus`:显示单个文件大小
- `expunge`:清空回收站
- `get`:复制到本地
- `getmerge`:将 source dir 中的文件链接成 local target dir
- ls
- lsr:递归ls
- mkdir
- movefromLocal
- mv
- put:本地到远程
- rm
- rmr:递归rm
- setrep:改变副本数
- stat:返回指定路径的统计信息
- tail:将尾部1kb的字节输出到stdout
- test:检测文件是否存在
- text:将源文件输出为文本格式
- touchz:新建一个0自己的文件
Hadoop管理命令:
- distcp:分布式拷贝(集群之间)
- fsck:检查整个文件系统的健康情况
- jar:运行java文件
- job:用于和MapReduce交互
- balancer:运行集群平衡工具
- dfsadmin:运行一个dfs admin客户端
- namenode: 运行namenode
### java接口
Hadoop中关于文件操作类基本都在`org.apache.hadoop.fs`包中
Hadoop类库中最终面向用户提供接口是`FileSystem`
```java
// 获取FileSystem具体类
static FileSystem get(Configuration conf);
// 写文件
public FSDataOutputStream create(Path f) throws IOException;
//读文件
// 上传文件到HDFS
public void copyFileLocalFile(Path src,Path dist);
// 重命名文件
public abstract boolean rename(Path src, Path dist);
// 删除文件&目录
public abstract boolean delete(Path f, boolean recursive) throws IOException;
// 创建目录
public boolean mkdirs(Path f) throws IOException;
// 遍历目录
public abstract FileStatus[] listStatus(Path f) throws FileNotFoundException, IOException
```
## MapReduce
```java
public void map(Object Key,Text value,Context context)
throws IOExcetion, InterruptedException{
}
```
### MapReduce工作原理
MapReduce框架的运作完全基于“键值对”,即数据的输入是一批“键值对” (key-value) ,生成的结果也是批“键值对”,只是有时候它们的类型不一样而已。Key和value的类由于需要支持被序列化 (Serealire) 操作,所以它们必须要实现`Writable` 接口,而且key的类还必须实现`WirtableComparable`接口,使得可以让框架对数据集的执行排序操作,MapRedtre运行机制,按照时间顺序包括:输入分片(input split)、map 阶段、combiner 阶段、shuffle阶段和reduce阶段。
在进行map计算之前,MapReduce会根据输入文件计算输入分片
### YARN运行流程
1. JobClient 向YARY中提交应用程序,其中 包括ApplicationMaster 程序、启动ApplicationMaster的命令、用户程序、环境变量、作业信息、文件位置信息等
2. RecourseManager为该应用程序分配第一个 Container. 并与对应的 Node-Manager 通信(通过心跳方式),更求它在这个Container中启动应用程序的ApplicationMaster
3. ApplicationMaster首先向ReoourceManager注册,这样用 户可以直接通过ResourceManager查看应用程序的运行状态。然后它将为各个任务申请资源,并监控它的运行状,直到运行结束
4. ApplicationMaster 采用轮询的方式通过RPC协议向ResourceManager申请和领取资源
5. 一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务
6. NodeManager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中, 并通过运行该脚本启动任务。
7. 各个任务通过某个RPC协议向AplcationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
8. 应用程序运行完成后, ApplicationMaster向ResourceManager注销并关闭自己
### 作业关键过程详解
**map**:map任务最终是交给Map任务执行器
**Reduce**:从所有map节点取到属于自己的map输出
**Partitioner**:当Mapper处理好数据后,需要使用Partitioner(分区器)确定怎样合理地将Mapper输出分配到Reduce上
**Combiner**:相当于一个本地的Reduce,主要是对Mapper输出的大量本地文件进行一次合并。Combiner函数执行时机可能是在map的merge操作完成之前
### MapReduce各种输入输出
**InputFormat**:负责处理MR的输入部分,来决定Map的数量,InputFormat
**FileInputFormat**:是所有以文件作为数据源的InputFormat实现的基类,FileInputFormat保存作为job输入的所有文件
## MapReduce 设计模式
- **过滤器模式**:设定某种条件,当负责条件时保留数据,不符合条件时丢弃数据
- **Top N**:根据数据集的排名,获取前N条记录
- **去重模式**:去重
- **数据重组**:按照一定的规划整理数据。数据重组要求划分的分区数量已经确定,划分分区的条件已经确定
-