Hadoop基础

て烟熏妆下的殇ゞ 提交于 2019-12-15 19:08:00

Hadoop基础

简介

  • Hadoop是可靠的可扩展的开源分布式计算分布式存储框架

  • 由Hadoop Common,HDFS,MapReduce,Yarn 组成

    • HDFS:分布式文件系统
    • MapReduce:分布式计算框架
    • Yarn:资源调度系统
  • Hadoop的优势

    • 高可靠
      • 数据存储: 数据块多副本
      • 数据计算: 某个节点崩溃, 会自动重新调度作业计算
    • 高扩展性
      • 存储/计算资源不够时,可以横向的线性扩展机器
      • 一个集群中可以包含数以千计的节点
      • 集群可以使用廉价机器,成本低
    • Hadoop生态系统成熟
  • Hadoop能做什么

    • 搭建大型数据仓库
    • PB级数据的存储 处理 分析 统计等业务
      • 搜索引擎
      • 日志分析
      • 数据挖掘
      • BI

1、HDFS(数据分块,冗余存储)

  • HDFS的启动

    • $HADOOP_HOME/sbin/start-dfs.sh
    • 退出安全模式(safemode) hdfs dfsadmin -safemode leave
    • 通过IP:50070查看hdfs的运行状态
  • HDFS的shell命令

    • 和linux指令基本一致 只是需要加上hadoop fs -命令
    常用的例如:ls  text  mv  put  rm
    
    例:
        hadoop fs -mkdir -p /hadoop001/test  # 在HDFS中创建文件夹
    
    • 文件基本操作(上传,删除,下载)
  • HDFS的设计思路

    • 文件拆分(文件的并行处理,存储的负载均衡)
    • 数据冗余(容错)
  • HDFS 的设计目标

    • 适合运行在通用硬件(commodity hardware)上的分布式文件系统
    • 高度容错性的系统,适合部署在廉价的机器上
    • HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用
    • 容易扩展,为用户提供性能不错的文件存储服务
  • HDFS的架构

    • NameNode

      fsimage - 它是在NameNode启动时对整个文件系统的快照

      edit logs - 它是在NameNode启动后,对文件系统的改动序列

      只有在NameNode重启时,edit logs才会合并到fsimage文件中,从而得到一个文件系统的最新快照。但是在产品集群中NameNode是很少重启的,这也意味着当NameNode运行了很长时间后,edit logs文件会变得很大。在这种情况下就会出现下面一些问题:

      1. edit logs文件会变的很大,怎么去管理这个文件是一个挑战。
      2. NameNode的重启会花费很长时间,因为有很多改动[笔者注:在edit logs中]要合并到fsimage文件上。
      3. 如果NameNode挂掉了,那我们就丢失了很多改动因为此时的fsimage文件非常旧。
      • 负责客户端请求的响应
      • 负责元数据(文件的名称、副本系数、Block存放的DN)的管理
        • 元数据 MetaData 描述数据的数据
      • 监控DataNode健康状况 10分钟没有收到DataNode报告认为Datanode死掉了
    • DataNode

      • 存储用户的文件对应的数据块(Block)
      • 要定期向NN发送心跳信息,汇报本身及其所有的block信息,健康状况
    • secondarynamenode

      它的职责是合并NameNode的edit logs到fsimage文件中,解决namenode的问题

      • 首先,它定时到NameNode去获取edit logs,并更新到fsimage上。
      • 一旦它有了新的fsimage文件,它将其拷贝回NameNode中。
      • NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间。

      Secondary NameNode的整个目的是在HDFS中提供一个检查点。它只是NameNode的一个助手节点。这也是它在社区内被认为是检查点节点的原因。

  • HDFS的缺点

    • 低延迟的数据访问
    • 小文件存储

2、YARN

  • Yarn是资源管理系统,可以让多个不同框架共享资源,提高资源利用率
  • Yarn的架构和执行流程
    • ResourceManager: RM 资源管理器 整个集群同一时间提供服务的RM只有一个,负责集群资源的统一管理和调度 处理客户端的请求: submit, kill 监控我们的NM,一旦某个NM挂了,那么该NM上运行的任务需要告诉我们的AM来如何进行处理
    • NodeManager: NM 节点管理器 整个集群中有多个,负责自己本身节点资源管理和使用 定时向RM汇报本节点的资源使用情况 接收并处理来自RM的各种命令:启动Container 处理来自AM的命令
    • ApplicationMaster: AM 每个应用程序对应一个:MR、Spark,负责应用程序的管理 为应用程序向RM申请资源(core、memory),分配给内部task 需要与NM通信:启动/停止task,task是运行在container里面,AM也是运行在container里面
    • Container 容器: 封装了CPU、Memory等资源的一个容器,是一个任务运行环境的抽象
    • Client: 提交作业 查询作业的运行进度,杀死作业

​ 1、Client提交作业请求

​ 2、ResourceManager 进程和 NodeManager 进程通信,根据集群资源,为用户程序分配第一 个Container(容器),并将 ApplicationMaster 分发到这个容器上面

​ 3、在启动的Container中创建ApplicationMaster

​ 4、ApplicationMaster启动后向ResourceManager注册进程,申请资源

​ 5、ApplicationMaster申请到资源后,向对应的NodeManager申请启动Container,将要执行的 程序分发到NodeManager上

​ 6、Container启动后,执行对应的任务

​ 7、Tast执行完毕之后,向ApplicationMaster返回结果

​ 8、ApplicationMaster向ResourceManager 请求kill

  • Yarn的启动

    • 启动yarn

      $HADOOP_HOME/sbin/start-yarn.sh
      
    • jps查看进程 ResourceManager NodeManager

    • 图形化界面 IP:8088

    • 停止YARN相关的进程 sbin/stop-yarn.sh

3、MapReduce

3.1、MapReduce概念

  • MapReduce编程分Map和Reduce阶段
    • 将作业拆分成Map阶段和Reduce阶段
    • Map阶段 Map Tasks 分:把复杂的问题分解为若干"简单的任务"
    • Reduce阶段: Reduce Tasks 合:reduce
  • MapReduce编程执行步骤
    • 准备MapReduce的输入数据
    • 准备Mapper数据
    • Shuffle
    • Reduce处理
    • 结果输出

3.2、Python使用MRJob包实现MapReduce

  • mrjob介绍
    • 使用python开发在Hadoop上运行的程序, mrjob是最简单的方式
    • mrjob程序可以在本地测试运行也可以部署到Hadoop集群上运行
# 实现Wordcount
from mrjob.job import MRJob

class MRWordCount(MRJob):

    #每一行从line中输入
    def mapper(self, _, line):
        for word in line.split():
            yield word,1

    # word相同的 会走到同一个reduce
    def reducer(self, word, counts):
        yield word, sum(counts)

if __name__ == '__main__':
    MRWordCount.run()

运行:

python mr_word_count.py my_file.txt
  • 运行MRJob的不同方式

    • 内嵌式

      • 特点是调试方便,启动单一进程模拟任务执行状态和结果,默认(-r inline)可以省略,输出文件使用 > output-file 或-o output-file,比如下面两种运行方式是等价的

        python word_count.py -r inline input.txt > output.txt python word_count.py input.txt > output.txt

    • Hadoop方式

      • python word_count.py -r hadoop hdfs:///test.txt -o hdfs:///output

4、Hadoop生态系统

在这里插入图片描述

  • Hive:数据仓库

    R:数据分析

    Mahout:机器学习库

    pig:脚本语言,跟Hive类似

    Oozie:工作流引擎,管理作业执行顺序

    Zookeeper:用户无感知,主节点挂掉选择从节点作为主的

    Flume:日志收集框架

    Sqoop:数据交换框架,例如:关系型数据库与HDFS之间的数据交换

    Hbase : 海量数据中的查询,相当于分布式文件系统中的数据库

    Spark: 分布式的计算框架基于内存

    • spark core
    • spark sql
    • spark streaming 准实时 不算是一个标准的流式计算
    • spark ML spark MLlib

    Kafka: 消息队列

    Storm: 分布式的流式计算框架 python操作storm

    Flink: 分布式的流式计算框架

5、HDFS读写及高可用

  • HDFS写流程
    • 客户端向NameNode发出写文件请求。
    • NameNode检查是否已存在文件、检查权限。若通过检查,NameNode返回可写的DataNode列表。
    • 客户端按128MB大小来切分文件。
    • 客户端将NameNode返回的DataNode列表和Data数据一同发送给最近的第一个DataNode节点,此后客户端和NameNode分配的多个DataNode构成pipeline管道,客户端只向第一个DataNode写数据,数据的复制由DataNode通过pipeline管道传给第二个、第三个…DataNode。
    • 每个DataNode写完一个块后,会返回确认信息。
    • 所有数据写完,发送完成信号给NameNode。
  • HDFS读流程
    • 客户端向NameNode发出读文件请求,将文件名传递给NameNode
    • NameNode返回该文件的BlockID列表,以及每个BlockID所保存的DataNode地址
    • 客户端从列表中每个Block对应的第一个DataNode中开始读取数据
  • HDFS如何实现高可用(HA)
    • 数据存储故障容错
      • 磁盘介质在存储过程中受环境或者老化影响,数据可能错乱
      • 对于存储在 DataNode 上的数据块,计算并存储校验和(CheckSum)
      • 读取数据的时候, 重新计算读取出来的数据校验和, 校验不正确抛出异常, 从其它DataNode上读取备份数据
    • 磁盘故障容错
      • DataNode 监测到本机的某块磁盘损坏
      • 将该块磁盘上存储的所有 BlockID 报告给 NameNode
      • NameNode 检查这些数据块在哪些DataNode上有备份,
      • 通知相应DataNode, 将数据复制到其他服务器上
    • DataNode故障容错
      • 通过心跳和NameNode保持通讯
      • 超时未发送心跳, NameNode会认为这个DataNode已经宕机
      • NameNode查找这个DataNode上有哪些数据块, 以及这些数据在其它DataNode服务器上的存储情况
      • 从其它DataNode服务器上复制数据
    • NameNode故障容错
      • 主从热备 secondary namenode
      • zookeeper配合 master节点选举
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!