大数据

HDFS 分布式文件系统

  1. 按块存储
    • 支持大规模文件存储
    • 简化系统设计
    • 数据备份
  2. 名称节点,整个HDFS集群的管家。
    • FsImage和editlog
    • 通过shell命令,从上述两个地方最新的元数据,创建一个新版的FsImage(名称节点),创建一个空的 editlog(editlog依然会变大)
    • 第二名称节点(帮助解决editlog过大&冷备份)
      • 冷备份过程:第二名称节点与名称节点定期通信,过大叫停,名称节点创建edit.new,第二名称节点把FsImage和editlog拷贝到本地合并成一个新的FsImage,名称节点将edit.new改为editlog
  3. 数据节点,负责存储实际数据。
  4. 体系结构:hdfs读写先通过名称节点,去读取数据节点.
    • 命名空间 目录+文件+块
  5. 存储原理,冗余数据保存
    • 加快传输速度
    • 容易检查错误
    • 保证可靠性
  6. 数据读取
    • 打开文件,生成fsDataInput Stream输入流,封装了distribution filesystem类对象。
    • 获取数据块信息,与名称节点沟通,将文件数据块地址信息返回。
    • 读取数据,输入流执行read,从距离客户端最近的数据节点开始读。关闭连接。
    • 再次获取数据块信息并读取数据。关闭文件。
  7. 写数据
    • 创建文件请求,生成FSDataOutputStream封装一个distribution filesystem类对象。
    • 创建文件元数据,调用名称节点,名称节点进行检查。
    • 写数据,流水线复制。把数据分成包,放入输出流。数据节点形成一个管道,分包依次发放,客户端发到第一个,第一个发到第二个(复制)……,确认包从最后一个数据节点往前传,传到客户端。
    • 关闭文件。

MapReduce

  1. 一种分布式变成框架。计算向数据靠拢,将应用程序分发到数据所在的机器。map函数输入是一个键值对,输入是一堆键值对。reduce函数输入是一个,输出是一个
  2. 体系结构。
  • client客户端
  • jobtracker 作业跟踪
  • tasktracker 任务调度 执行jobtracker发送的命令
  • slot是一个任务调度单位(资源单位,2.0已经取消),分为map类型和reduce类型。task也分为map类型和reduce类型。
  1. 工作流程。from hdfs对大规模数据集进行分片操作(split,逻辑上),生成很多map任务(由分片数量决定),对每一个map分成多个reduce任务(shuffle),输出到hdfs。
  • map任务和reduce任务之间不进行通信。
  1. shuffle过程。


输入数据进行分片处理,map之后输入处理结果(一堆键值对),写入缓存,满了之后溢写到磁盘中。通过reduce任务取走,经过归并,合并输入到reduce函数,输出到hdfs。

  • 写到缓存是因为:减少寻址开销,一次寻址批量写入
  • 溢写包括:分区,排序,合并
  • map端的shuffle:分区,分区给不同的reduce任务,按照key排序,合并是为了减少溢写到磁盘的数量(如果不经过combine,结果是key-value list,经过的话,结果是key-value n)。
    -reduce端的shuffle:从多个map任务拷贝到reducer,归并数据,写入磁盘。


Spark

  1. spark与hadoop对比
  • hadoop表达能力有限,磁盘io开销大(都写到hdfs里),延迟高,任务之间的连接涉及io开销,难以胜任复杂/多阶段的任务。
  • 提供了多种数据集操作,提供了内存计算效率更高,DAG迭代机制。
  1. 架构
    优点:利用多线程执行任务,减少任务启动开销。executor有一个blockmanager存储模块,将内存和磁盘作为存储设备,较少io开销。



    一个application有一个driver和多个job,一个job包含多个stage,一个stage包括多个task。执行一个application,driver向集群管理器申请资源,启动executor,执行task,结束后把结果返回。

  2. 流程


  • 每个aoolication都有自己的executor进程,以多线程的方式运行task。
  • spark运行与资源管理器无关,只需获取executor进程并保持通信。
  • task数据本地性,推测执行。
  1. RDD 弹性分布式数据集 resillient distributed dataset
    一个RDD是一个分布式对象几何,只读。避免中间数据存储。
  • 执行过程:读入外部数据源,经过一系列转换每次都产生不同的RDD,最后一个RDD经过动作操作计算并输出。
  • 高容错性。血缘关系结构决定,从父RDD转换恢复。
  • 中间结果持久化到内存。数据在内存中RDD传递,避免io开销。
  • 存放对象可以是Java对象,避免了不必要的对象序列化
  1. RDD的依赖关系,帮助划分stage。在DAG中反向解析,遇到宽依赖就断开,遇到窄依赖就加入stage。将窄依赖尽量划分在一个stage中,形成流水线操作。
  • 窄依赖:一对一,多对一。
  • 宽依赖:一对多。
  • shufflemapstage
  • resultstage 直接输出结果
  1. spark部署


数据仓库hive

  1. 本来不具有数据的存储和分析,提供了一种语言。
  • 采用批处理方式处理海量数据,将hiveQL语句转为mr任务。
  • 存储的静态数据,适合采用批处理处理方式。
  • 提供了一系列工具对数据进行存储处理。
  1. hive对外访问接口,驱动模块(把HiveQL转换为MR语句),元数据存储模块(独立的关系型数据库)


你可能感兴趣的:(大数据)