思考题:
- Hadoop项目的由来
- HDFS的体系结构
- HDFS的运行机制
- Hadoop中MapReduce的实现机制
- Htable的数据结构
- Hbase的运行机制
- Yarn对Hadoop的核心改进
- Spark架构及运行机制
- Storm架构及运行机制
- Kafka架构及运行机制
- Pregel架构及运行机制
-
Hadoop
Overview
得名于一头大象的名字
- 起源于一个开源的网络搜索引擎项目Apache Nutch
重要组件
主要概念:数据块、NameNode、DataNode、命令行接口、基本文件系统操作
- NameNode——Master,DataNode——ChunkServer
引入了Node之间的距离,通过网络拓扑结构来衡量节点的距离,网络可以看做一棵树,节点间的距离是节点到他们最近的共同祖先的距离和。
MapReduce实现过程
Job Distribution:MR程序被打包成jar文件和XML文件,被传送到各个数据所在HDFS的datanode上运行,Job在执行前就被序列化和分布式
- Data Distribution:计算数据的存储是分布的——HDFS,Mapper被传送到数据节点计算,传输中间结果到Reducer,然后Reducer汇总计算结果保存到HDFS中
不同的进程
JobTracker
是MapReduce
的集中处理点,存在单点故障的风险。JobTracker
不只是简单的分配任务,还需要负责监控运行状态,重新调度任务等等。JobTracker
完成了太多了任务,造成了过多的资源消耗。MapReduce
Job非常多的时候,会造成很大的内存开销,潜在来说,也增加了JobTracker fail的风险。在一主多辅的架构下,老Hadoop存在4000个辅节点的上限。TaskTracker
端,没有考虑具体资源的使用情况,仅仅是以Map/Reduce task
的数目作为资源调度的指标。比如说,两个大内存消耗的task被调度到一块,很容易出现OOM
。TaskTracker
把资源强制划分为Map Task Slot
和Reduce Task Slot
,过于简单粗暴,可能造成资源浪费。-
Yarn架构
ResourceManager进行资源分配
- Yarn的变化
- 客户端不变,开发使用者是透明的,原有代码不必大改
- JobTracker和TaskTracker被拆分成ResourceManager、ApplicationMaster和NodeManager三部分
- ResourceManager 是一个中心的服务,它做的事情是调度、启动每一个 Job 所属的 ApplicationMaster、另外监控 ApplicationMaster 的存在情况。
- ResourceManager 负责作业与资源的调度。接收JobSubmitter 提交的作业,按照作业的上下文 (Context)信息,以及从 NodeManager 收集来的状态信息,启动调度过程,分配一个 Container 作为 App Master
- ApplicationMaster负责一个 Job 生命周期内的所有工作,包括task 的监控、重启等等。类似老的框架中JobTracker。但注意每一个 Job(不是每一种)都有一个ApplicationMaster,它可以运行在 ResourceManager以外的机器上。
- NodeManager 功能比较专一,就是负责 Container 状态的维护,并向RM保持心跳。
Yarn的优势
- 大大减小了JobTracker的资源消耗,并且让检测每一个Job子任务状态的程序分布式化了,更安全,优美
- 老的框架中,JobTracker 一个很大的负担就是监控 job 下的 tasks 的运行状况,现在,这个部分就扔给ApplicationMaster 做了,而 ResourceManager 中有一个模块叫做 ApplicationsMasters( 注意不是ApplicationMaster),它是监测 ApplicationMaster 的运行状况,如果出问题,会将其在其他机器上重启。
- AppMst可自定义,更多类型的编程模型能够运行在Hadoop集群上。
- 资源的表示以内存为单位,比之前的slot更为合理
- Container资源隔离。
HBase
HBase即Hadoop Database,是Hadoop中的数据库
Master Server存放元数据
- 管理区域服务器
- 指派区域服务器服务特定区域
- 恢复失效的区域服务器
- 元数据
META
- 全部用户区域的属性数据都放在元数据表中
- 包括区域中数据起止行、区域在线状态等
- 保存区域服务器地址
- META表包含多个区域,区域属性数据存储在ROOT节点上
- 根表
ROOT
- 只包含一个区域
- 将META元数据中的区域映射到Region Server
- 存储元数据服务器的位置,以及映射了哪些元数据区域
Region Server存放表的一部分,即若干行,这些行叫做“区域”
- 为区域的访问提供服务,负责维护区域的分割,负责数据持久化
- 每个区域包含一个随机ID,区域内的行也是按行键有序的
- 弹性可扩展机制:每个表最初只有一个区域,当体积超过某个阈值时,表会被分成两个大小相同的
Region
- 处理读写请求,向Master上报自己的心跳
- 写:首先写预写日志,数据并非直接写文件系统,先缓存,然后批量写,同时在日志中做标记
- 读:首先在内存缓存中找,如果存在多个版本,返回顺序按照从最新到最老
- 如果映射文件数量超过阈值,区域服务器会进行一次合并
- 如果Region文件大过阈值,会按照行的方式对半分割,被分割区域通过垃圾回收机制回收
- 由于检测没有心跳,主服务器能够探知区域服务器的失效;主服务器将失效服务器所提供服务的区域重新分配给其它区域服务器;原失效区域服务器的“预写”日志由主服务器进行分割并派送给新的区域服务器。
Pig
可以理解为HBase的SQLHive
Hive是Hadoop中的数据仓库,注重数据的分析和处理
将SQL查询转换成一系列在Hadoop集群上的MapReduce作业
- 将数据组织成表
-
Spark
适用场景:适用于反复迭代运算场景,机器学习、数据挖掘等;
- 不适用于异步细粒度更新状态的应用:比如增量爬虫、索引等;
- 磁盘数据本地化,内存数据本地化,计算本地化
- RDD
- RDD是一个数据集,不可改变,分布在集群上
- 通过DAG来实现自动数据恢复,支持内存物化和硬盘物化,来保存中间结果
- 所有的操作都是针对RDD的。
RDD
Storm是一个分布式流处理框架,实时处理数据,一主多辅架构,一个master和一群worker组成,通过zookeeper集群协调
- 主节点后台程序Nimbus
- 响应集群节点,分配任务和检测故障
- 流式计算不存在结束,计算拓扑一直存在,不断等待新的数据到来,直到该计算拓扑被手动停止然后释放
- 工作阶段后台程序Supervisor
- 收听工作指派,运行工作进程
- Supervisor接受任务,然后管理自己的worker来执行任务
- 流
- Storm中数据处理的核心概念
- Storm中的数据处理从最初输入到最终输出是一个流,每个流构成了一个拓扑topology
- 也就是说,Storm中一个应用是一个拓扑,拓扑中的每一步(spout或bolt)都是一个task
- 拓扑的组件
- Spout喷口:Topology中产生源数据流的组件,只发不收
- Bolt门闩:Topology中接收数据和处理数据的组件,必收可发可不发
- Tuple:一次消息传递的基本单元
Storm消息分组方式
订阅-发布机制
- 在模块较多、连接复杂的情况下,指向性传递存在效率低下的问题。
- 当交互频繁时,需要一个消息总线,实现“消息快递”:消息发送者A通过快递服务(消息总线)将消息传递给B,消息总线批量处理消息。
- 消息生产者将消息发布给消息管理器;消息的消费者从消息管理器处进行订阅,消息管理器接受到消息之后将消息向已订阅该消息的消费者转发消息。
消息系统的特点
适用于单位消息量较小但传递频繁的领域:社交网络、非视频类的传感器IoT数据、日志类
- 特点
- 高吞吐量:同时为发布和订阅提供高吞吐量,每秒可以产生250K消息,每秒处理550K消息
- 可持久化:消息可持久化到磁盘,防止数据丢失
- 分布式,易于扩展
- 支持online和offline场景
- 消息被处理的状态在consumer端维护,而不是有server维护,失败时自动平衡
- 架构
- Producer:Producer通过push向kafka发布消息
- Broker
- Consumer:Consumer通过pull方式从kafka获取消息
- 消息管理的基本概念
- Topic:消息类别
- Partition:每个Topic包含若干个partition,每个partition对应一个文件夹,存储该partition的数据和索引文件
- Consumer Group:同一个topic的一条消息只能被同一个group内的一个consumer消费,但多个group可以同时消费这个消息
- 消息发布机制
- Producer指定发布的topic
- Topic里的信息物理上分为多个partition存储
- Broker存储若干topic的partition,允许同topic的不同 partition存储在不同的broker上
- 由zookeeper统一管理
- Producer可以通过指定消息的key控制将消息发到某个 partition
- 消息消费机制
- Consumer需要指定消费的Topic
- Consumer需要指定隶属的consumer group
- 一个Topic里的每条信息只能被consumer group中的一个 consumer消费,属于不同consumer group的consumer 可以共同消费一个topic的相同信息
- Consumer group里的consumer和topic的partition按照 id顺序进行消费,例如0/1/2consumer分别消费0、3/1、 4/2号partition,如果partition数比consumer数少,则id 数超过partition数的consumer无法获取数据
- 消息存储机制
- 消息在partition上顺序写磁盘,通过偏移量访问
- 消息被持久化,在访问后不删除
- 通过配置保存时长和partition文件大小控制删除
- 发布——订阅
- 传统发布订阅只需要topic和consumer
- 增加了partition和consumer group概念
- Partition能够增加消息发布效率 ,相当于把topic的存储机器分布式化,避免单一机器速度过慢导致 性能受限
- Consumer group能够增加消息消费效率 相当于把topic的消费者分布式化,避免单一消费者过慢导致性能 受限
可靠性保障
Google提出的分布式图计算平台,采用BSP模型
- 架构
- 一主多辅的主从架构
- 切边法分割子图
- 主节点负责管理工作,不参与具体计算
- 从节点负责每步的计算,负责相互传递消息
- 节点状态
- Step 0时每个节点均活跃
- 执行之后进入不活动状态
- 接收消息则转入激活
- 没有活动节点和消息时,整个算法结束