HDFS 分布式文件系统
- 按块存储
- 支持大规模文件存储
- 简化系统设计
- 数据备份
- 名称节点,整个HDFS集群的管家。
- FsImage和editlog
- 通过shell命令,从上述两个地方最新的元数据,创建一个新版的FsImage(名称节点),创建一个空的 editlog(editlog依然会变大)
- 第二名称节点(帮助解决editlog过大&冷备份)
- 冷备份过程:第二名称节点与名称节点定期通信,过大叫停,名称节点创建edit.new,第二名称节点把FsImage和editlog拷贝到本地合并成一个新的FsImage,名称节点将edit.new改为editlog
- 数据节点,负责存储实际数据。
- 体系结构:hdfs读写先通过名称节点,去读取数据节点.
- 命名空间 目录+文件+块
- 存储原理,冗余数据保存
- 加快传输速度
- 容易检查错误
- 保证可靠性
- 数据读取
- 打开文件,生成fsDataInput Stream输入流,封装了distribution filesystem类对象。
- 获取数据块信息,与名称节点沟通,将文件数据块地址信息返回。
- 读取数据,输入流执行read,从距离客户端最近的数据节点开始读。关闭连接。
- 再次获取数据块信息并读取数据。关闭文件。
- 写数据
- 创建文件请求,生成FSDataOutputStream封装一个distribution filesystem类对象。
- 创建文件元数据,调用名称节点,名称节点进行检查。
- 写数据,流水线复制。把数据分成包,放入输出流。数据节点形成一个管道,分包依次发放,客户端发到第一个,第一个发到第二个(复制)……,确认包从最后一个数据节点往前传,传到客户端。
- 关闭文件。
MapReduce
- 一种分布式变成框架。计算向数据靠拢,将应用程序分发到数据所在的机器。map函数输入是一个键值对,输入是一堆键值对。reduce函数输入是一个<key,value-list>,输出是一个<key,value>。
- 体系结构。
- client客户端
- jobtracker 作业跟踪
- tasktracker 任务调度 执行jobtracker发送的命令
- slot是一个任务调度单位(资源单位,2.0已经取消),分为map类型和reduce类型。task也分为map类型和reduce类型。
- 工作流程。from hdfs对大规模数据集进行分片操作(split,逻辑上),生成很多map任务(由分片数量决定),对每一个map分成多个reduce任务(shuffle),输出到hdfs。
- map任务和reduce任务之间不进行通信。
-
shuffle过程。
输入数据进行分片处理,map之后输入处理结果(一堆键值对),写入缓存,满了之后溢写到磁盘中。通过reduce任务取走,经过归并,合并输入到reduce函数,输出到hdfs。
- 写到缓存是因为:减少寻址开销,一次寻址批量写入
- 溢写包括:分区,排序,合并
-
map端的shuffle:分区,分区给不同的reduce任务,按照key排序,合并是为了减少溢写到磁盘的数量(如果不经过combine,结果是key-value list,经过的话,结果是key-value n)。
-reduce端的shuffle:从多个map任务拷贝到reducer,归并数据,写入磁盘。
Spark
- spark与hadoop对比
- hadoop表达能力有限,磁盘io开销大(都写到hdfs里),延迟高,任务之间的连接涉及io开销,难以胜任复杂/多阶段的任务。
- 提供了多种数据集操作,提供了内存计算效率更高,DAG迭代机制。
-
架构
优点:利用多线程执行任务,减少任务启动开销。executor有一个blockmanager存储模块,将内存和磁盘作为存储设备,较少io开销。
一个application有一个driver和多个job,一个job包含多个stage,一个stage包括多个task。执行一个application,driver向集群管理器申请资源,启动executor,执行task,结束后把结果返回。
-
流程
- 每个aoolication都有自己的executor进程,以多线程的方式运行task。
- spark运行与资源管理器无关,只需获取executor进程并保持通信。
- task数据本地性,推测执行。
- RDD 弹性分布式数据集 resillient distributed dataset
一个RDD是一个分布式对象几何,只读。避免中间数据存储。
- 执行过程:读入外部数据源,经过一系列转换每次都产生不同的RDD,最后一个RDD经过动作操作计算并输出。
- 高容错性。血缘关系结构决定,从父RDD转换恢复。
- 中间结果持久化到内存。数据在内存中RDD传递,避免io开销。
- 存放对象可以是Java对象,避免了不必要的对象序列化
- RDD的依赖关系,帮助划分stage。在DAG中反向解析,遇到宽依赖就断开,遇到窄依赖就加入stage。将窄依赖尽量划分在一个stage中,形成流水线操作。
- 窄依赖:一对一,多对一。
- 宽依赖:一对多。
- shufflemapstage
- resultstage 直接输出结果
-
spark部署
数据仓库hive
- 本来不具有数据的存储和分析,提供了一种语言。
- 采用批处理方式处理海量数据,将hiveQL语句转为mr任务。
- 存储的静态数据,适合采用批处理处理方式。
- 提供了一系列工具对数据进行存储处理。
-
hive对外访问接口,驱动模块(把HiveQL转换为MR语句),元数据存储模块(独立的关系型数据库)
网友评论