分布式大数据处理框架
- 可靠
- 高效
- 可伸缩
包含HDFS MapReduce等框架
分层
- 数据来源
- 数据传输
- 数据存储 – HDFS
- 数据管理
- 数据计算
- 任务调度
- 业务模型
HDFS 分布式文件系统
- 高容错性
- 低廉硬件适配
- 高吞吐量
- 超大数据集
client: 提交读取请求
- HDFS的api编写程序交互
- Hadoop的Datenodes
NameNode: 全局把控
DateNodes:数据存储
两个node对他们进行操作处理。client类似仓库管理员,Namenode类似存储系统,而DateNodes相当于存储的货柜。
所以,NameNode响应client请求,DataNode处理产品存取,并根据NameNode反馈数据
Block:一个文件拆分成多个Block存储
详细阐述
NameNode:client请求响应、维护文件系统的目录结构、管理文件和block之间关系,block和DataNode的关系。对HDFS目录、文件、块做类似增删改等操作。块存储于存储中只有一个active状态的NameNode,负责对HDFS管理
特点
- NameNode是中心服务器,单一节点,管理namespcae和client对file的访问
- NameNode负责文件元数据操作,DataNode处理文件内容的读写请求。文件相关数据流数据流不经过NameNode,只询问它与关联的DataNode
- NameNode控制副本存放在哪个DataNode —— 全局情况决定放置块。
- 尽量保证读取最近的副本,降低块消耗与读取时延
- 管理data block的复制,周期性从cluster的每个DataNode接受 心跳信号(表示这个DataNode节点工作正常)与块状态报告(包含了这个DataNode所有数据块的列表)
DataNodes:数据块 ( Block ) 文件被分成多个 block 存储在磁盘上。文件有多个副本。Namenode和Client进行存储、检索block,定期向NameNode发送心跳信息、汇报本身、所有的block信息,健康状况
特点
- 数据块在 DataNode 以文件存储在磁盘上
- 数据本身
- 元数据(数据块长度,校验和,时间戳)
- DataNode启动,向NameNode注册。周期性向NameNode上报块信息
- 心跳3seconds 一次,返回结果附带 一个命令(NameNode发送给DataNode),如复制数据块,删除数据块。若超10分钟无心跳,认为该节点不可用
- cluster可以安全加入or 推出某些机器
Block:可靠性的基础 —— HDFS把文件分为大小一样的块(除了最后一块),通过copy实现容错。大小和副本系数针对文件配置。HDFS文件时一次写入的。限制一个时间内只能由一个用户写入
- 文件分成块,大小默认128M,每个块多个副本存储在不同机器,副本数在文件生成的时候指定(默认3
- NameNode是主节点,存储文件元数据(文件名,文件目录结构,文件属性,生成时间,副本数,文件权限,文件块列表和所在的DataNode)
- DataNode在本地 File System存储文件块数据,块数据校验和
- 创建、删除、移动、重命名文件。文件创建、写入、关闭后无法修改
NameNode + 多个DataNode(多数情况下NN和DN在不同节点上
Hive
处理结构化、半结构化数据。SQL语句转换MapReduce任务查询,分析数据。
根据业务匹配需求 —— 多种输入输出格式、存储格式、数据类型。根据具体业务配置。分区、桶的方式组织、管理数据,便于查询、分析数据 —— 还有自定义函数
扩展、易用、灵活、可定制。处理大规模数据
把sql语句转换为MapReduce任务运行。
Hive的表 == HDFS的目录、文件(按照表名把文件分开)
- 分区表:分区的值就是子文件
系统架构
- CLI: shell命令行
- JDBC/ODBC 为Hive的Java
- WebGUI 浏览器访问Hive
- Thrift: 可扩展、跨语言的服务开发
- 跨语言无缝衔接
- 解释器编译器,优化查询计划的生产,查询计划存储在HDFS,后有MapReduce调用执行
- Hive数据存在HDFS中,大部分查询由MapReduce完成(包括*的查询不会产生
- Hive将元数据存在metastore中。元数据包括表的名字、表的列、分区、属性 —— 表的属性(是否为外部表),表数据所在目录
Hive的Metastore组件是Hive元数据存放地
- Metastore服务
- 后台数据存储(关系数据库
默认状况下,Metastore和Hive服务安装在一起,在同一个进程中。
Metastore独立安装于集群里(与Hive剥离),Hive远程调用Metastore服务,让他们运行在不同的进程里 —— 保证Hive的稳定性。 Hive依赖于HDFS与YARN
MapReduce
分而治之思想。拆分的前提 —— 任务可以并行计算且没有依赖关系。 Map负责分,Reduce负责合起来。
使用Map和Reduce两个函数进行高层的并行编程抽象模型。
- Map:对一组元素重复式处理
- Reduce,对Map结果进行进一步结果整理
处理类型 : key value键值对. .
- 统一的计算框架,隐藏系统层面细节
- 把what need to do 和 how to do分开,提供抽象和高层变成接口框架
分布式程序部署到hadoop集群运行,node扩展到成百上千个内容.增加机器扩展计算能力,计算数量基本和节点数增长保持线性增长。任何单一机器节点宕机了,它可以把上面的计算任务转移到另一个节点上运行,不影响整个作业任务得完成(hadoop实现)
局限
- 实时计算差
- 多用于离线作业,无法实现秒级数据响应
- 无法进行流式计算(动态数据),该主要针对静态数据集
Hadoop MapReduce编程
需要有三类实例进程
- MRAppMaster
- 整个程序过程调度、状态协调
- MapTask
- map阶段数据处理 —— 并行
- ReduceTask
- reduce阶段数据处理流程 —— 依赖Map的输出结果
Mapper,Reducer,Driver(提交运行mr程序的客户端驱动)。mapper,reducer,前两者继承自己的父类。mapper在map方法中写逻辑业务,reducer在reduce()中写业务,程序需要Driver提交
工作流程
map,shuffle,reduce
- map
数据源读取到数据,默认是得到kv键值对,处理后输出kv键值对
- shuffle
map的数据会进行:分区、排序、分组等动作重组 —— 洗牌的逆过程
- 分区:key相同在一个分区,一个分区被同一个reduce处理
- 排序:key字典序排序
- 分组:key相同为一组,一组调用reduce处理一次
- reduce
shuffle的数据进行聚合处理,输出结果kv对
序列化机制
serialization:结构化对象转化为字节流 —— 网络传输or写入持久存储的过程
deserialization:字节流转化为结构化对象,重新创建对象
Why serializate?
- 持久化格式
- 通信
- 数据拷贝,克隆机制
java中:对象标识为二进制字节数组。实现序列化,需要实现java.io.serializable的接口。
而在hadoop中,使用writable接口实现序列化机制。但没有比较功能 —— 和java的comparable合并,提供一个接口WritableComparable
|hadoop数据类型|java||
实践如下:
https://segmentfault.com/a/1190000040852791
Map阶段执行过程
- 目录文件按标准切片(一般切片大小就是块大小
- 按切片数据解析为key value对
- 调用map解析出来一个kv对就是用一次map方法
- 对3的结果分区(默认一个区,分区数量就是reducer任务运行的数量,默认一个reducer
- 分区的value排序(如果key相同按value排序,
- 数据局部聚合 combiner处理,key相同就会进行一次reduce方法(默认没有,因为后续还有reducer
reduce阶段
- reducer主动从Mapper任务复制 kv对
- 复制到reducer的本地数据进行合并
- 对排序后的kv对调用reduce方法