1、Hadoop介绍

Hadoop是Apache软件基金会旗下的一个开源分布式计算平台,为用户提供了一个系统底层细节透明的分布式架构,通过Hadoop,可以将大量的廉价机器的计算资源组织起来,解决单机不能解决的海量数据的处理问题。Hadoop主要有以下几个优点:

高可靠性:提供按位处理的存储和计算能力值得用户信赖。

高扩展性:可以轻松地从小量集群扩展到数以千计的节点中。

高效性:提供并发的分布式计算框架,处理速度非常快。

高容错性:即使在少量节点宕机的情况下,也能自动完成任务。

Hadoop主要的核心内容为MapReduce计算框架和HDFS文件系统,本文先简单介绍一下。

2、MapReduce框架介绍

"Hadoop Map/Reduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集。"[1]
Hadoop将MapReduce高度抽象为两个阶段:Map阶段和Reduce阶段,每个阶段都以Key/Value对作为过程的输入和输出,并可以由程序员自己选择他们的类型。整个Map和Reduce阶段的数据流如图所示:
那么,Hadoop分布式框架为什么要采用MapReduce计算框架呢?我的意思是,为什么不单单一个Map或者Reduce就搞定呢?
很可惜,查了很多文章,都只是在讲什么是MapReduce,MapReduce的步骤是什么,很少有能讲清楚为什么采用MapReduce框架的问题。
偶然情况下,看到一篇很有趣的介绍MapReduce框架的介绍,贴出来共享一下:
下面是一个关于一个程序员是如何个妻子讲解什么是MapReduce?文章很长请耐心的看(如果不想看可以直接看我下面的总结)。
我问妻子:“你真的想要弄懂什么是MapReduce?” 她很坚定的回答说“是的”。 因此我问道:
我: 你是如何准备洋葱辣椒酱的?(以下并非准确食谱,请勿在家尝试)
妻子: 我会取一个洋葱,把它切碎,然后拌入盐和水,最后放进混合研磨机里研磨。这样就能得到洋葱辣椒酱了。
妻子: 但这和MapReduce有什么关系?
我: 你等一下。让我来编一个完整的情节,这样你肯定可以在15分钟内弄懂MapReduce.
妻子: 好吧。
我:现在,假设你想用薄荷、洋葱、番茄、辣椒、大蒜弄一瓶混合辣椒酱。你会怎么做呢?
妻子: 我会取薄荷叶一撮,洋葱一个,番茄一个,辣椒一根,大蒜一根,切碎后加入适量的盐和水,再放入混合研磨机里研磨,这样你就可以得到一瓶混合辣椒酱了。
我: 没错,让我们把MapReduce的概念应用到食谱上。Map和Reduce其实是两种操作,我来给你详细讲解下。Map(映射): 把洋葱、番茄、辣椒和大蒜切碎,是各自作用在这些物体上的一个Map操作。所以你给Map一个洋葱,Map就会把洋葱切碎。 同样的,你把辣椒,大蒜和番茄一一地拿给Map,你也会得到各种碎块。 所以,当你在切像洋葱这样的蔬菜时,你执行就是一个Map操作。 Map操作适用于每一种蔬菜,它会相应地生产出一种或多种碎块,在我们的例子中生产的是蔬菜块。在Map操作中可能会出现有个洋葱坏掉了的情况,你只要把坏洋葱丢了就行了。所以,如果出现坏洋葱了,Map操作就会过滤掉坏洋葱而不会生产出任何的坏洋葱块。
Reduce(化简):在这一阶段,你将各种蔬菜碎都放入研磨机里进行研磨,你就可以得到一瓶辣椒酱了。这意味要制成一瓶辣椒酱,你得研磨所有的原料。因此,研磨机通常将map操作的蔬菜碎聚集在了一起。
妻子: 所以,这就是MapReduce?
我: 你可以说是,也可以说不是。 其实这只是MapReduce的一部分,MapReduce的强大在于分布式计算。
妻子: 分布式计算? 那是什么?请给我解释下吧。
我: 没问题。
我: 假设你参加了一个辣椒酱比赛并且你的食谱赢得了最佳辣椒酱奖。得奖之后,辣椒酱食谱大受欢迎,于是你想要开始出售自制品牌的辣椒酱。假设你每天需要生产10000瓶辣椒酱,你会怎么办呢?
妻子: 我会找一个能为我大量提供原料的供应商。
我:是的..就是那样的。那你能否独自完成制作呢?也就是说,独自将原料都切碎? 仅仅一部研磨机又是否能满足需要?而且现在,我们还需要供应不同种类的辣椒酱,像洋葱辣椒酱、青椒辣椒酱、番茄辣椒酱等等。
妻子: 当然不能了,我会雇佣更多的工人来切蔬菜。我还需要更多的研磨机,这样我就可以更快地生产辣椒酱了。
我:没错,所以现在你就不得不分配工作了,你将需要几个人一起切蔬菜。每个人都要处理满满一袋的蔬菜,而每一个人都相当于在执行一个简单的Map操作。每一个人都将不断的从袋子里拿出蔬菜来,并且每次只对一种蔬菜进行处理,也就是将它们切碎,直到袋子空了为止。这样,当所有的工人都切完以后,工作台(每个人工作的地方)上就有了洋葱块、番茄块、和蒜蓉等等。
妻子:但是我怎么会制造出不同种类的番茄酱呢?
我:现在你会看到MapReduce遗漏的阶段—搅拌阶段。MapReduce将所有输出的蔬菜碎都搅拌在了一起,这些蔬菜碎都是在以key为基础的 map操作下产生的。搅拌将自动完成,你可以假设key是一种原料的名字,就像洋葱一样。 所以全部的洋葱keys都会搅拌在一起,并转移到研磨洋葱的研磨器里。这样,你就能得到洋葱辣椒酱了。同样地,所有的番茄也会被转移到标记着番茄的研磨器里,并制造出番茄辣椒酱。
也就是说,当我们在运行一个大型的程序的时候,肯定会遇到一些没有相互依赖关系的步骤(比如例子中的切洋葱与切番茄等步骤),而这些如果我们采用顺序执行的办法的话就浪费了时间,因为这些完全可以用异步的方式同时执行(就是找几个人同时准备洋葱与番茄等),这样时间就大大缩短了,而这一步骤在MapReduce里面也称为Map阶段,正是由于Map的存在,并行计算才有了可能。
但是我们的程序不可能是永远并行的(这样的话我们完全可以把他们当作多个程序了),在某些步骤完成之后,我们需要把这些计算结果(例子中的准备好的洋葱与番茄等)进行整合计算,虽然这一步可能不是并行的,但是却是必须的,因此这就是为什么必须有Reduce阶段的原因。
当采用单一Reduce任务的时候,整个MapReduce过程大致如下:

3、HDFS介绍

HDFS,既Hadoop Distributed File System(分布式文件系统),是一种跨多台计算机存储的文件系统,由于系统简历在网络只上,因此既需要考虑文件的存储,还要考虑到网络的复杂性问题。
然而,HDFS的好处也是不言而喻的,由于HDFS具有跨多台计算机存储的能力,因此系统的存储容量也被无限扩大了,更重要的是,在Hadoop平台中,这些分布式存储的文件可以被并行执行,大大缩短了程序运行时间。并且HDFS可以不对计算机的可靠性做太多要求,可以设计在任何普通硬件之上,并提供容错性。HDFS的优点有:容错性、扩展性、支持大文件存储等。
然而由于网络的不可靠与高延迟性,HDFS也有一些不合适使用的场景:
低时间延迟的数据访问不适合:如果对于实时性要求较高,比如在几十毫秒时间实现访问,则不适合用HDFS。
大量小文件存储不合适:HDFS是对大文件存储应用优化的,对文件元数据均存储在内存中,因此对于大量小文件容易造成元数据维护节点(NameNode)内存超支,因此不适合。
那么Hadoop为什么要采用HDFS系统呢?

HDFS在Hadoop平台之所以适用主要就是源于他的block的概念,由于分布式存储和文件分块使得不同计算机可以存储不同的文件,这样在Map阶段的时候就对并发处理提供了很大的方便,我们可以对不同的block采用不同的或者相同的map任务,从而实现并行处理,再对结果进行合并Reduce处理。鉴于数据本地化原则,一般情况下每个block与Map任务一一对应并且运行Map的节点就是存储该Map任务对应的block的节点。

HDFS采用了主从结构模型、一个HDFS集群是由一个NameNode和若干个DataNode组成的,其中NameNode为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的DataNode管理存储的数据。
NameNode执行文件系统的命名空间操作,比如打开、关闭、重命名文件或目录等,它也负责数据块到具体DataNode的映射。DatNode负责处理文件

HDFS执行的结构如图所示:

4、参考文献

[1]Hadoop Map/Reduce教程:https://hadoop.apache.org/docs/r1.0.4/cn/mapred_tutorial.html
[2]Hadoop Definitive Guide 4th Edition

Hadoop学习总结(2)——Hadoop入门详解相关推荐

  1. Hadoop学习之Mapreduce执行过程详解

    一.MapReduce执行过程 MapReduce运行时,首先通过Map读取HDFS中的数据,然后经过拆分,将每个文件中的每行数据分拆成键值对,最后输出作为Reduce的输入,大体执行流程如下图所示: ...

  2. Hadoop学习笔记:MapReduce框架详解

    原文:http://blog.jobbole.com/84089/ 原文出处: 夏天的森林 开始聊mapreduce,mapreduce是hadoop的计算框架,我学hadoop是从hive开始入手, ...

  3. hadoop 学习笔记:mapreduce框架详解

    开始聊mapreduce,mapreduce是hadoop的计算框架,我学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能 ...

  4. Hadoop HA集群部署 - A - 详解

    理论简介:  HA 概念以及作用     HA(High Available), 高可用性群集,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点.通常把正在执行业务 ...

  5. Hadoop学习笔记(1) ——菜鸟入门

     Hadoop学习笔记(1) --菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户能够在不了解分布式底层细节的情况下.开发分布式 ...

  6. 生成对抗网络入门详解及TensorFlow源码实现--深度学习笔记

    生成对抗网络入门详解及TensorFlow源码实现–深度学习笔记 一.生成对抗网络(GANs) 生成对抗网络是一种生成模型(Generative Model),其背后最基本的思想就是从训练库里获取很多 ...

  7. CNN入门详解及TensorFlow源码实现--深度学习笔记

    CNN入门详解及TensorFlow源码实现–深度学习笔记 ##一.卷积神经网络 ###1.简介 卷积神经网络是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出 ...

  8. 委托(C#入门详解学习笔记)

    委托(C#入门详解学习笔记) 几个概念 什么是委托 委托的声明(自定义委托) 委托的常规使用 通用泛型委托类型的简单使用(Func和Action) 委托的高级使用 多播委托 委托的异步调用 使用接口取 ...

  9. FFmpeg入门详解之92:Live555学习之(一)-------Live555的基本介绍

    Live555学习之(一)-------Live555的基本介绍 前一阵子,因为项目需要,研究了一下Live555开源框架,研究的不是很深入,基本上把Live555当做API用了一下,但是毕竟也是本人 ...

  10. Hadoop学习系列之Hadoop、Spark学习路线(很值得推荐)

    Hadoop学习系列之Hadoop.Spark学习路线(很值得推荐) 文章出自:http://www.cnblogs.com/zlslch/p/5448857.html 1 Java基础: 视频方面: ...

最新文章

  1. 抓取网页的脚本 【修复】
  2. CSDN湘苗培优,打造高素质技术人才
  3. datacamp自然语言处理免费教程
  4. nginx 开启ssi
  5. 学习区块链的十大理由
  6. oracle编程艺术在线,oracle编程艺术笔记-1
  7. 跟无闻学习GO Web 编程(一) -- go 开发环境搭配(win7 64bit)
  8. 【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )
  9. 编码互换变量c语言,【剑仙教程】TC。字符 和字符编码 互换。
  10. C++11中值得关注的几大变化
  11. c#基类 常用数据验证的封装,数字,字符,邮箱的验证
  12. dart系列之:手写Library,Library编写实践
  13. vue插槽面试题_VUE面试题解析,半年出一篇,建议收藏!
  14. LeetCode MySQL 1070. 产品销售分析 III(group by 陷阱)
  15. AI让边缘更智能 边缘让AI无处不在
  16. 【报告分享】2021中国智能驾驶核心软件产业研究报告:软件定义,数据驱动.pdf(附下载链接)...
  17. 安卓 notification2
  18. php 2个时间查询差几天,PHP怎么计算2个日期差
  19. mysql加begin报错,MySQL存储过程例子,不能在if else里面用begin end否则会报错Error Code:1064解决...
  20. C语言链表详解(通俗易懂)

热门文章

  1. python 堆栈溢出_内存 - 如何发生“堆栈溢出”,如何防止它?
  2. 推箱子如何实现悔步_推箱子时代又来临,表里世界会发生什么?
  3. os系统配置php环境,mac OS环境下的PHP环境配置
  4. mac学python_新手小白学Python必备编程利器Pycharm快捷键大全(Win+Mac)
  5. geojson 河流_GeoJSON 数据类型 | JShare
  6. python qt信号在qml 的使用_Python和C++混合使用QML开发GUI
  7. printf 函数实现的深入剖析
  8. windows编译libevent
  9. 帝国cms怎么搭建python环境_Python 库/模块的pip安装和IPython的使用
  10. python的实例属性_python 实例属性和类属性