1.Hadoop概述
Hadoop优势
- 高可靠性:Hadoop底层维护多个数据副本,即使某个计算元素活存储出现故障也不会导致数据丢失
- 高扩展性:集群分布,方便扩展节点
- 高效性:MapReduce下,集群分配子任务并行工作,加快处理速度
- 高容错性:失败的任务将会自动重新分配
HDFS
- NameNode(nn):存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表和块所在的DataNode
- DataNode(dn):于本地文件系统存储文件块数据,块数据的校验和
- Secondary NameNode(2nn):每隔一段时间对NameNode元数据备份
MapReduce
- Map阶段并行处理输入数据
- Reduce阶段对Map结果进行汇总
- Split -> Map -> Shuffle -> Reduce
YARN
**ResourceManager(RM)**:整体集群资源(内存,CPU…)管理者
**NodeManager(NM)**:单个节点服务器资源管理者
**ApplicationMaster(AM)**:单个任务运行管理者
Container:容器,封装任务运行所需要的资源(内存,CPU,磁盘,网络…)
客户端可以有多个
集群上可以运行多个ApplicationMaster
每个NodeManager上可以有多个Container
相关生态圈
Sqoop:Hadoop,Hive,MySQL等之间进行数据传输,可以将HDFS与关系型数据库互传
ZooKeeper:针对分布式系统的协调系统,配置维护,名字服务,分布式同步,组服务
Kafaka:消息队列,高吞吐量的分布式发布订阅消息系统
Fflume:高可用,高可靠的分布式海量日志采集,聚合与传输系统
Spark:基于内存的大数据计算框架
Flink:基于内存的大数据计算框架,多用于处理实时流
Azkaban:工作流程调度管理系统
Oozie:工作流程调度管理系统
Hive:数据仓库工具,将结构化的数据文件映射为一张数据库表,提供简单的SQL查询功能,可将SQL语句转换为MapReduce任务运行
Hbase:分布式,面向列的非结构化数据库
2.HDFS
2.1 HDFS定义
1.背景定义
HDFS(Hadoop Distributed File System)是一个通过目录树来定位文件的分布式文件系统,适合一次写入,多次读出的场景。
2.HDFS优点
高容错性:
数据自动保存多个副本,还可以增加副本提供容错
某个副本丢失后可以自动恢复
适合处理大数据:
- 数据规模可以打到GB,TB,PB级别
- 能够处理百万级别的文件数量
造价低廉,通过副本机制提高可靠性
3.HDFS缺点:
不适合低延时数据访问:
- 不适合毫秒级的存储数据,不适合实时存储
小文件问题:
- 存储大量小文件会占用NameNode的大量内存来存储文件目录和块信息
- 小文件存储的寻址时间会超过读取时间,违反HDFS设计初衷
不支持并发写入:
- 不允许多线程同时写
- 仅支持数据追加(append),不支持文件其他修改
2.2 HDFS组成架构
- NameNode(nm)
- 管理HDFS的名称空间
- 配置副本策略
- 管理数据块(Block)映射信息
- 处理客户端读写请求
- DataNode(DN)
- 存储实际的数据块(Bolck)
- 执行数据块的读写操作
- Client:
- 文件切分;文件由本地上传HDFS时先由Client将文件切分为一个一个Block,再上传
- 与NameNode交互,获取文件的位置信息
- 与DataNode交互,读取/写入数据
- Client提供一些HDFS管理命令,如NameNode格式化等
- Client通过一些命令访问HDFS,可对HDFS进行增删查改
- Secondary NameNode:
- 辅助NameNode,分担其工作量,如定期合并Fsimage(HDFS元数据的一个永久性检查点,包含HDFS目录和文件的id,类型,目录,用户等序列化信息)和Edits(存放HDFS的所有更新操作的路径,记录client执行的写操作),并推送给NameNode
- 紧急情况下,辅助恢复NameNode
2.3 HDFS文件块大小
HDFS中的文件在物理上是分块存储(Block),块大小可以配置参数(dfs.blocksize)来规定,默认大小为128M,1.X版本为64M
一种观点认为:寻址时间为传输时间的1%时为最佳
- HDFS块设置太小,会增加寻址时间,耗费时间在寻找块的开始位置上
- HDFS块设置太大,从磁盘传输数据的时间明显大于定位块开始位置所需的时间,导致程序处理数据慢
eg.
如果寻址时间为10ms,理想传输时间=10ms/0.01=1000ms=1s
磁盘传输速率普遍为100MB/s
5个block大小=1s*100MB/s=100MB
2.4 HDFS基本命令
1 | hadoop fs 命令 |
1 | [-appendToFile <localsrc> ... <dst>] |
参数提醒
1 | hadoop fs -help 命令 |
上传
- moveFromLocal
1 | 本地剪切到HDFS |
- copyFromLocal
1 | 本地复制到HDFS |
- put
1 | 等同于copyFrom Local |
- appendToFile
1 | 追加一个文件到已存在得文件末尾 |
下载
- copyToLocal
1 | hadoop fs -copyToLocal /HDFS文件路径 /本地文件路径 |
- get
1 | 等同于copyToLocal |
HDFS操作
- ls显示目录信息
1 | hadoop fs -ls /HDFS路径 |
- cat显示文件内容
1 | hadoop fs -cat /HDFS文件路径 |
- chgrp/chmod/chown
1 | hadoop fs -chmod 666 |
- mkdir创建路径
1 | hadoop fs -mkdir /HDFS路径 |
- cp拷贝
1 | hadoop fs -cp /原HDFS文件路径 /目标HDFS文件路径 |
- mv移动
1 | hadoop fs -mv /原HDFS文件路径 /新HDFS文件路径 |
- tail显示文件末尾1kb的数据
1 | hadoop fs -tail /HDFS文件路径 |
- rm删除文件/目录
1 | hadoop fs -rm /HDFS路径 |
- rm -r递归删除目录及目录里的内容
1 | hadoop fs -rm -r /HDFS目标目录 |
- du统计文件夹的大小信息
1 | hadoop fs -du -s -h /HDFS文件夹目录 |
- setrep设置HDFS副本数量
1 | hadoop fs -setrep 10 /HDFS文件路径 |
2.5 HDFS API
暂时先不写
2.6 HDFS读写流程
2.6.1 HDFS写入流程
通过client客户端中的DistributedFileSystem模块与NameNode进行交互,FSDataOutputStream模块与DataNode进行交互
client通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件路径是否存在
NameNode返回是否可以上传
client请求第一个block上传到哪几个DataNode服务器上
NameNode返回3个DataNode节点,dn1,dn2,dn3
client通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求后调用dn2,dn2又调用dn3,建立完整通信管道
dn1,dn2,dn3逐级响应客户端
client往dn1上传第一个block,以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3,每传一个packet会放入一个应答队列等待应答
当一个block传输完成后,客户端再次请求NameNode上传第二个block(重复之前的的操作)
2.6.2 HDFS读取流程
通过Client客户端中的DistributedFileSystem模块与NameNode进行交互,FSDataInputStream模块与DataNode进行交互
- client通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到block文件块所在的DataNode地址
- 按就近原则挑选一台DataNode服务器,请求读取数据
- DataNode开始传输数据给客户断(从磁盘中读取数据输入流Stream,以Packet为单位来验证)
- cilent客户端以Packet为单位接收,先再本地缓存,然后写入目标文件
3.MapReduce
3.1 MapReduce定义
MapReduce是Hadoop的一套分布式运行程序框架。核心功能在于将用户编写的业务逻辑代码与自带默认组件整合,可以使用户在不了解分布式底层架构的情况下直接编写分布式运算程序
1.MapReduce优点
易于编程
MapReduce通过简单的实现一些接口就可以完成分布式程序的编写
易扩展
基于分布式特点,计算资源得不到满足时可以轻松地通过增加集群机器的方式来扩展计算能力
高容错性
当集群中某一台机器挂掉时,MapReduce可以在没有人工参与的情况下把它上面的计算任务转移到另一个节点上运行
海量数据处理
上千台服务器并发工作,可达PB级以上
2.MapReduce缺点
不擅长实时计算
MapReduce适合海量数据的离线计算,但无法在秒级内进行处理,返回结果
不擅长流式计算
MapReduce因其自身设计特点决定数据源是静态的,不能有动态变化
不擅长DAG(有向无环图)计算
MapReduce自身设计中多个应用程序存在依赖关系,前一个应用程序的输出为后一个的输入。此种情况下每个MapReduce作业的输出结果都会写入磁盘,大量IO性能低下
3.2 MapReduce流程
3.2.1 MapReduce 编程规范
Mapper
- 用户自定义的Mapper要继承自己的父类
- Mapper的输入数据时KV对的形式(KV的类型可自定义)
- Mapper中的业务逻辑卸载map()方法中
- Mapper输出的数据是KV对的形式(KV的类型可自定义)
- map()方法(MapTask进程)对每一个<K,V>调用一次
Reducer
- 用户自定义的Reducer要继承自己的父类
- Reducer的输入类型为对应Mapper的输出数据类型,也是KV
- Reducer的业务逻辑写在reduce()方法中
- ReduceTask进程对每一组相同K的<K,V>组调用一次reduce()方法
Driver
可以理解为YARN集群的客户端,用于提交整个程序到YARN集群,提交的是封装了MapReduce程序相关运行参数的job对象
3.3 WC案例
以后写
3.4 MapReduce框架原理
3.4.1 InputFormat
3.4.2 Shuffle
3.4.3 OutputFormat
3.4.4 MapReduce内核
3.4.5 JOIN
3.4.6 ETL
4.Yarn
4.1 Yarn基础架构
Yarn资源管理器在集群运行中统筹规划资源调度,当内存紧张时会释放部分进程,在复合程序申请计算资源时会通过Yarn进行资源分配。Yarn具有高可用的特点,通过Zookeeper存储状态信息并由ResourceManager提供重启机制
- ResourceManager(RM)
- 处理客户端发出的请求
- 监控NodeManager
- 监控ApplicationMaster并控制其启停
- 分配,调度总体资源
- NodeManager(NM)
- 管理单个节点上的资源
- 接收并处理来自ResourceManager的命令
- 接收并处理来自ApplicationManager的命令
- ApplicationManager(AM)
- 为应用程序向ResourceManager申请资源并分配内部任务
- 任务的监控与容错
- Container
- Container是YARN中资源的抽象,将节点上多维度资源(CPU,内存,磁盘等)封装起来的容器