2019独角兽企业重金招聘Python工程师标准>>>

1、Hadoop简介

Apache Hadoop软件库是一个框架,允许在集群服务器上使用简单的编程模型对大数据集进行分布式处理。Hadoop被设计成能够从单台服务器扩展到数以千计的服务器,每台服务器都有本地的计算和存储资源。Hadoop的高可用性并不依赖硬件,其代码库自身就能在应用层侦测并处理硬件故障,因此能基于服务器集群提供高可用性的服务。

1.2、Apache版本衍化

Apache Hadoop版本分为两代,我们将第一代Hadoop称为Hadoop 1.0,第二代Hadoop称为Hadoop 2.0。第一代Hadoop包含三个大版本,分别是0.20.x,0.21.x和0.22.x,其中,0.20.x最后演化成1.0.x,变成了稳定版,而0.21.x和0.22.x包含NameNode HA等新的重大特性。第二代Hadoop包含两个版本,分别是0.23.x和2.x,它们完全不同于Hadoop 1.0,是一套全新的架构,均包含HDFS Federation和YARN两个系统,相比于0.23.x,2.x增加了NameNode HA和Wire-compatibility两个重大特性。

1.3、HDFS架构

如上图所示HDFS是Master和Slave的结构,分为NameNode、Secondary NameNode和DataNode三种角色。

  1. NameNode:在Hadoop1.X中只有一个Master节点,管理HDFS的名称空间和数据块映射信息、配置副本策略和处理客户端请求;
  2. Secondary NameNode:辅助NameNode,分担NameNode工作,定期合并fsimage和fsedits并推送给NameNode,紧急情况下可辅助恢复NameNode;
  3. DataNode:Slave节点,实际存储数据、执行数据块的读写并汇报存储信息给NameNode;

1.3.1、HDFS原理

HDFS(Hadoop Distributed File System)是一个分布式文件系统,是谷歌的GFS山寨版本。它具有高容错性并提供了高吞吐量的数据访问,非常适合大规模数据集上的应用,它提供了一个高度容错性和高吞吐量的海量数据存储解决方案。

  1. 高吞吐量访问:HDFS的每个Block分布在不同的Rack上,在用户访问时,HDFS会计算使用最近和访问量最小的服务器给用户提供。由于Block在不同的Rack上都有备份,所以不再是单数据访问,所以速度和效率是非常快的。另外HDFS可以并行从服务器集群中读写,增加了文件读写的访问带宽。
  2. 高容错性:系统故障是不可避免的,如何做到故障之后的数据恢复和容错处理是至关重要的。HDFS通过多方面保证数据的可靠性,多份复制并且分布到物理位置的不同服务器上,数据校验功能、后台的连续自检数据一致性功能都为高容错提供了可能。
  3. 线性扩展:因为HDFS的Block信息存放到NameNode上,文件的Block分布到DataNode上,当扩充的时候仅仅添加DataNode数量,系统可以在不停止服务的情况下做扩充,不需要人工干预。

1.3.2、HDFS读操作

  1. 客户端通过调用FileSystem对象的open()方法来打开希望读取的文件,对于HDFS来说,这个对象时分布文件系统的一个实例;

  2. DistributedFileSystem通过使用RPC来调用NameNode以确定文件起始块的位置,同一Block按照重复数会返回多个位置,这些位置按照Hadoop集群拓扑结构排序,距离客户端近的排在前面;

  3. 前两步会返回一个FSDataInputStream对象,该对象会被封装成DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流,客户端对这个输入流调用read()方法;

  4. 存储着文件起始块的DataNode地址的DFSInputStream随即连接距离最近的DataNode,通过对数据流反复调用read()方法,可以将数据从DataNode传输到客户端;

  5. 到达块的末端时,DFSInputStream会关闭与该DataNode的连接,然后寻找下一个块的最佳DataNode,这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流;

  6. 一旦客户端完成读取,就对FSDataInputStream调用close()方法关闭文件读取。

1.3.3、HDFS写操作

  1. 客户端通过调用DistributedFileSystem的create()方法创建新文件;
  2. DistributedFileSystem通过RPC调用NameNode去创建一个没有Blocks关联的新文件,创建前NameNode会做各种校验,比如文件是否存在、客户端有无权限去创建等。如果校验通过,NameNode会为创建新文件记录一条记录,否则就会抛出IO异常;

  3. 前两步结束后会返回FSDataOutputStream的对象,和读文件的时候相似,FSDataOutputStream被封装成DFSOutputStream,DFSOutputStream可以协调NameNode和Datanode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小的数据包,并写入内部队列称为“数据队列”(Data Queue);

  4. DataStreamer会去处理接受Data Queue,它先问询NameNode这个新的Block最适合存储的在哪几个DataNode里,比如重复数是3,那么就找到3个最适合的DataNode,把他们排成一个pipeline.DataStreamer把Packet按队列输出到管道的第一个Datanode中,第一个DataNode又把Packet输出到第二个DataNode中,以此类推;

  5. DFSOutputStream还有一个对列叫Ack Quene,也是有Packet组成,等待DataNode的收到响应,当Pipeline中的所有DataNode都表示已经收到的时候,这时Akc Quene才会把对应的Packet包移除掉;

  6. 客户端完成写数据后调用close()方法关闭写入流;

  7. DataStreamer把剩余的包都刷到Pipeline里然后等待Ack信息,收到最后一个Ack后,通知NameNode把文件标示为已完成。

1.3.4、HDFS中常用到的命令

hadoop fs -ls /
hadoop fs -lsr
hadoop fs -mkdir /user/hadoop
hadoop fs -put a.txt /user/hadoop/
hadoop fs -get /user/hadoop/a.txt /
hadoop fs -cp src dst
hadoop fs -mv src dst
hadoop fs -cat /user/hadoop/a.txt
hadoop fs -rm /user/hadoop/a.txt
hadoop fs -rmr /user/hadoop/a.txt
hadoop fs -text /user/hadoop/a.txt
hadoop fs -copyFromLocal localsrc dst 与hadoop fs -put功能类似。
hadoop fs -moveFromLocal localsrc dst 将本地文件上传到hdfs,同时删除本地文件。
hadoop dfsadmin -report
hadoop dfsadmin -safemode enter | leave | get | wait
hadoop dfsadmin -setBalancerBandwidth 1000

1.4、MapReduce简介

MapReduce 是现今一个非常流行的分布式计算框架,它被设计用于并行计算海量数据。第一个提出该技术框架的是Google 公司,而Google 的灵感则来自于函数式编程语言,如LISP,Scheme,ML 等。MapReduce 框架的核心步骤主要分两部分:Map 和Reduce。当你向MapReduce 框架提交一个计算作业时,它会首先把计算作业拆分成若干个Map 任务,然后分配到不同的节点上去执行,每一个Map 任务处理输入数据中的一部分,当Map 任务完成后,它会生成一些中间文件,这些中间文件将会作为Reduce 任务的输入数据。Reduce 任务的主要目标就是把前面若干个Map 的输出汇总到一起并输出。从高层抽象来看,MapReduce的数据流图如下图所示:

1.4.1、MapReduce流程分析

1.4.2、Map过程

  1. 每个输入分片会让一个map任务来处理,默认情况下,以HDFS的一个块的大小(默认为64M)为一个分片,当然我们也可以设置块的大小。map输出的结果会暂且放在一个环形内存缓冲区中(该缓冲区的大小默认为100M,由io.sort.mb属性控制),当该缓冲区快要溢出时(默认为缓冲区大小的80%,由io.sort.spill.percent属性控制),会在本地文件系统中创建一个溢出文件,将该缓冲区中的数据写入这个文件;
  2. 在写入磁盘之前,线程首先根据reduce任务的数目将数据划分为相同数目的分区,也就是一个reduce任务对应一个分区的数据。这样做是为了避免有些reduce任务分配到大量数据,而有些reduce任务却分到很少数据,甚至没有分到数据的尴尬局面。其实分区就是对数据进行hash的过程。然后对每个分区中的数据进行排序,如果此时设置了Combiner,将排序后的结果进行Combia操作,这样做的目的是让尽可能少的数据写入到磁盘;

  3. 当map任务输出最后一个记录时,可能会有很多的溢出文件,这时需要将这些文件合并。合并的过程中会不断地进行排序和combia操作,目的有两个:

    1. 尽量减少每次写入磁盘的数据量

    2. 尽量减少下一复制阶段网络传输的数据量。最后合并成了一个已分区且已排序的文件。为了减少网络传输的数据量,这里可以将数据压缩,只要将mapred.compress.map.out设置为true就可以了

  4. 将分区中的数据拷贝给相对应的reduce任务。有人可能会问:分区中的数据怎么知道它对应的reduce是哪个呢?其实map任务一直和其父TaskTracker保持联系,而TaskTracker又一直和JobTracker保持心跳。所以JobTracker中保存了整个集群中的宏观信息。只要reduce任务向JobTracker获取对应的map输出位置就可以了。

1.4.3、Reduce过程

  1. Reduce会接收到不同map任务传来的数据,并且每个map传来的数据都是有序的。如果reduce端接受的数据量相当小,则直接存储在内存中(缓冲区大小由mapred.job.shuffle.input.buffer.percent属性控制,表示用作此用途的堆空间的百分比),如果数据量超过了该缓冲区大小的一定比例(由mapred.job.shuffle.merge.percent决定),则对数据合并后溢写到磁盘中;

  2. 随着溢写文件的增多,后台线程会将它们合并成一个更大的有序的文件,这样做是为了给后面的合并节省时间。其实不管在map端还是reduce端,MapReduce都是反复地执行排序,合并操作;

  3. 合并的过程中会产生许多的中间文件(写入磁盘了),但MapReduce会让写入磁盘的数据尽可能地少,并且最后一次合并的结果并没有写入磁盘,而是直接输入到reduce函数。

1.4.4、MapReduce工作机制剖析

  1. 在集群中的任意一个节点提交MapReduce程序;
  2. JobClient收到作业后,JobClient向JobTracker请求获取一个Job ID;

  3. 将运行作业所需要的资源文件复制到HDFS上(包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分信息),这些文件都存放在JobTracker专门为该作业创建的文件夹中,文件夹名为该作业的Job ID;

  4. 获得作业ID后,提交作业;

  5. JobTracker接收到作业后,将其放在一个作业队列里,等待作业调度器对其进行调度,当作业调度器根据自己的调度算法调度到该作业时,会根据输入划分信息为每个划分创建一个map任务,并将map任务分配给TaskTracker执行;

  6. 对于map和reduce任务,TaskTracker根据主机核的数量和内存的大小有固定数量的map槽和reduce槽。这里需要强调的是:map任务不是随随便便地分配给某个TaskTracker的,这里有个概念叫:数据本地化(Data-Local)。意思是:将map任务分配给含有该map处理的数据块的TaskTracker上,同时将程序JAR包复制到该TaskTracker上来运行,这叫“运算移动,数据不移动”;

  7. TaskTracker每隔一段时间会给JobTracker发送一个心跳,告诉JobTracker它依然在运行,同时心跳中还携带着很多的信息,比如当前map任务完成的进度等信息。当JobTracker收到作业的最后一个任务完成信息时,便把该作业设置成“成功”。当JobClient查询状态时,它将得知任务已完成,便显示一条消息给用户;

  8. 运行的TaskTracker从HDFS中获取运行所需要的资源,这些资源包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分等信息;

  9. TaskTracker获取资源后启动新的JVM虚拟机;

  10. 运行每一个任务;

转载于:https://my.oschina.net/blogByRzc/blog/906781

Hadoop之分布式存储HDFS和离线计算MapReduce相关推荐

  1. 2.2.1 hadoop体系之离线计算-mapreduce分布式计算-mapreduce架构概念

    目录 1.写在前面 2.为什么需要MapReduce? 3.MapReduce具体细节 3.1 Hadoop MapReduce构思: 4.block,split,map,reduce关系 5.Shu ...

  2. Hadoop基础【HDFS、Yarn、MapReduce框架概述、框架的搭建】

    1.Hadoop是什么 是一个由Apache基金会所开发的分布式系统基础架构:主要解决海量数据的存储和海量数据的分析计算问题:hadoop通常是指一个更加宽泛的概念,Hadoop生态圈. 最先遇到大数 ...

  3. 分布式离线计算—MapReduce—基本原理

    原文作者:黎先生 原文地址:MapReduce基本原理及应用 目录 一.MapReduce模型简介 1. Map和Reduce函数 2. MapReduce体系结构 3. MapReduce工作流程 ...

  4. 分布式离线计算—MapReduce—基础介绍

    原文作者:哪有天生的学霸,一切都是厚积薄发 原文地址:MapReduce介绍 目录 场景 MapReduce产生背景 MapReduce功能: 总结 场景 比如有海量的文本文件,如订单,页面点击事件的 ...

  5. 分布式离线计算—MapReduce—为什么被淘汰了?

    原文作者:蔡元楠 原文地址:为什么MapReduce会被硅谷一线公司淘汰?​time.geekbang.org 目录 超大规模数据处理的技术发展 为什么MapReduce会被取代 推荐阅读: 每次和来 ...

  6. Hadoop分布式存储和计算MapReduce的使用以及Hive数据仓库等内容精讲

    一,zookeeper环境搭建 ZooKeeper致力于为分布式应用提供一个高性能.高可用,且具有严格顺序访问控制能力的分布式协调服务 服务器IP 主机名 myid的值 192.168.186.133 ...

  7. 【快速入门大数据】hadoop和它的hdfs、yarn、mapreduce

    文章目录 导学 大数据概述 初识Hadoop 概述 核心组件 HDFS分布式文件系统 资源调度系统YARN MapReduce 优势 发展史 生态系统 发行版本选择 企业应用案例 第3章 分布式文件系 ...

  8. Hadoop、分布式文件系统HDFS、YARN、MAPREDUCE

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 1.1 什么是Hadoop Hadoop名字的由来 作者:Do ...

  9. Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解

    编者按:HDFS和MapReduce是Hadoop的两大核心,除此之外Hbase.Hive这两个核心工具也随着Hadoop发展变得越来越重要.本文作者张震的博文<Thinking in BigD ...

最新文章

  1. 李彦宏:简单搜索永远没有广告;安全是自动驾驶第一天条
  2. HTML5 input元素新的特性
  3. R语言观察日志(part12)--关于.Rprofile文件
  4. linux 常用 启动命令 汇总
  5. 编译原理0909的作业
  6. 抓包分析arp攻击Linux,从抓包分析角度分析arp攻击
  7. webbrowser代理c#代码实现
  8. Julia: 如何转换PyPlot的X轴的日期格式?
  9. 一名清华考研者自诉:福昕PDF阅读器APP让我找回希望
  10. 2021-08-02-DJ-015 Django框架之视图函数的request参数到底是什么,有什么
  11. 深入浅出、通俗易懂的讲解CAN bus
  12. QTabWidget 删除tab
  13. sql 恢复刚删除的表
  14. 微分方程3_求解偏微分方程
  15. CANoe如何查看总线负载率?
  16. 如何实现1分钟写一个API接口
  17. C#中XML、JSON、类T数据格式之间的转换
  18. 木子-前端-谷歌页面等调试时总是报No Found 404 错误(编码格式不识别问题导致的)
  19. Java核心技术卷Ⅰ-第四章对象和类
  20. Abaqus 沙漏模式

热门文章

  1. shell中变量的引用(两种方式:$变量名,${变量名})。
  2. 某台机器上IE8抛“Invalid procedure call or argument”异常
  3. QT出现 Cannot create children for a parent that is in a different thread 的解决方法:
  4. 连接MYSQL数据库,报1130错误的解决方法
  5. 如何在移动网页上“禁用”缩放?
  6. Ajax请求返回200 OK,但是会引发错误事件而不是成功
  7. 光盘装系统和U盘装系统有什么区别吗?
  8. linux 内核参数分析,linux 内核参数VM调优 之 参数调节和场景分析
  9. NB-IOT:系列专题1:低功耗能力
  10. MybatisPlus报错: org.apache.velocity.context.Context(已解决)