谷歌 MapReduce BigTable GFS 大数据 分布式 的三驾马车
特定问题的特定方案
搜索引擎的基础是什么?
架构的层次
应用1、应用2、应用3、应用4........ |
---|
算法(MapRuduce) |
数据模型(BigTable) |
文件系统(GFS) |
Google的三篇论文一直是分布式领域传阅的经典。
根据MapReduce,于是我们有了Hadoop;
根据BigTable,于是我们有了HBase。
根据GFS,于是我们有了HDFS;
而在这三篇论文里都提及Google的一个lock service---Chubby,于是我们有了Zookeeper
GFS:Google File System
如何保存一个文件?
元数据,索引,块存储
如何保存一个大文件?
1 chunk = 64MB=64*1024=65,536 blocks(小块变大块)
优点
减少元数据 减少流量
缺点
小文件会浪费空间
如何保存一个超大大文件
Master + many ChunkServers
缺点
ChunkServer数据的任何改变都需要通知Master
如何减少Master存储的数据和流量?
Master不记录每块数据的偏移量( diskOffset)
优点
减少Master的元数据信息
减少Master和Chunkserver之间的通信
如何发现数据损坏
多级校验
1 chunk = a list of blocks1 block = 64KB
Block保存检验和(checksum)1 checksum = 32bit
1T文件的检验和大小. 1T/64KB*32bit = 64MB
读取一块数据时对checksum进行验证
如何减少ChunkServer挂掉带来的损失?
复制Chunks
创建多少副本? 答案:3
如何选择一个副本的ChunkServer?
- 硬盘利用率低
- 限制最新数据块的写入数量·
- 跨机架跨中心:2+1
如何恢复损坏的chunk?
向Master求助
发现ChunkServer挂掉?
心跳
ChunkServer挂掉后恢复数据?
基于存活副本数的恢复策略
怎么应对热点?
当副本过度繁忙,复制到更多ChunkServer
基于ChunkServer的硬盘和带宽利用率来选择
怎么读一个文件?
怎么写一个文件?
总结
GFS特定于大文件的场景
读写过程是核心
Bigtable: A Distributed Storage System for Structured Data
如何在文件内快速查询?
Table = a list of sorted <key, value>
怎么保持很大的表?
A table = a list of tablets(小表)
A tablet = a list of sorted <key value>
如何保存超大表?
A table = a list of tablets(小表)
A tablet = a list of SSTables(小小表)
A SSTable = a list of sorted <key, value>
如何写数据?
当内存中的数据到达一定数量时,就落盘。落盘时顺序写磁盘。
内存 | GFS/Disk
通过写入memTable(内存表)来加速
A tablet = memTable + a list of SSTables
内存表过大怎么办?
将memTable导入硬盘,成为一个新的SSTable
如何避免内存数据丢失?
A tablet = memTable + a list of SSTables + log
怎么读数据?
因为之前的写策略
SSTable内部的数据是有序的
SSTable之间的数据是无序的
需要查找所有的SSTable和memTable需要在硬盘中的SSTable查找该元素
怎么加速读数据?
加索引
ASSTable = a list of sorted <key, value>= a list of 64K blocks + index
Index会预加载到内存
通过index找到硬盘的位置
布隆过滤器(判断数据一定不在表中)
A SSTable = a list of sorted <key, value>= a list of 64K blocks + index + bloomfilter
Bloomfilters会预加载到内存
表的逻辑视图是什么?
big table不是关系型数据库,但是沿用了关系型的行列表的概念
将逻辑视图转换为物理存储
Nosql 天然不支持jion操作
Bigtable的架构是什么?
总结
Bigtable使用<key,value>的物理结构存储了超大表
吃内存的Bigtable和吃硬盘的GFS相互配合
MapReduce: Simplified Data Processing on Large Clusters
MapReduce
Input split Map Shuffle Reduce Finalize
总结
MapReduce就是分治法
来洋葱、拿洋葱、切洋葱、放洋葱、拼洋葱、送洋葱