Hadoop基础概念介绍
基于YARN的配置信息, 参见: http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/
hadoop入门 - 基础概念
HDFS (Hadoop Distributed File System)
HDFS
是Hadoop框架的子模块, 采用master-slave结构, 一个HDFS Cluster由一个NameNode(管理系统元数据), 和多个DataNode(存放数据文件)组成. 文件将被分割成多块, 存储在一组DataNode中.
NameNode用来操作文件命名空间的文件或目录操作. 如打开, 关闭, 重命名等等. 同时它需要确定文件块与DataNode的映射.
DataNode负责来自文件系统Client的读写请求. 同时还要执行文件块的创建, 删除, 和来自NameNode的块复制指令.
Client读写文件的工作模式: Clients先和NameNode联系, 取得文件原数据(metadata)或者文件修改数据, 然后直接和DataNodes进行文件读写操作.
JobTracker
Hadoop用于分发MapReduce任务到特定节点的一个服务. 分发的优先级是先把任务给数据所在的节点, 其次给数据所在rack中的节点.
rack: 一份数据, 分割后分布存放在不同节点中, 这些节点组成一个rack.
工作流程:
1. Client提交jobs到JobTracker
2. JobTracker和NameNode联系, 确定数据所在位置.
3. JobTracker按分发的优先级顺序, 找到数据所在位置附近的TaskTracker.
4. JobTracker把作业提交到选中的TaskTracker节点.
5. 若任务失败, TaskTracker会通知JobTracker, JobTracker决定如何处理. 重新分发给其他节点, 对该TaskTracker做一定的标记以避免再次出现问题.
6. 各个节点计算完毕, JobTracker会更新自己的状态, Client app可以对其询问相关结果.
潜在问题, JobTracker是MapReduce的关键点, 如果它出现问题, 会导致所以jobs挂起.
TaskTracker
接收MapReduce任务的节点. 主要功能是
1 .资源管理
每个TaskTracker都有一组slot, 用于表明可接收的任务数量. 当JobTracker试图分发任务时, 首先会检查数据文件所在的节点上是否有空的slot, 如果没有, 则考虑分发给数据文件所在的rack中的某个节点.
TaskTracker会每隔几分钟给JobTracker发送一次状态更新, 包括可用的slot数量.
2. 作业调度, 监控:
对任务进行Map, Reduce和Shuffle操作.
TaskTracker会为每个任务启动一个独立的JVM进程, 然后监控各个任务进程, 捕捉输出结果和返回代码, 并将执行结果告知JobTracker.
MapReduce
是Hadoop MapReduce Engine 用来在集群中分发作业的关键算法.
由Map(映射)和Reduce(规约)两个函数式编程的概念组成.
Map
将input data(单个key-value对)转换成一组key-value对: map(key1,value) -> list<key2,value2>
注意: output的key可以和input的不同; output的多个entries可以使用同一个key.
Reduce
对特定的某个key对应的所以value值取出来, 生成一个新的list, 称为reduced output. reduce(key2, list<value2>) -> list<value3>
MapReduce引擎的核心概念
每个Map和Reduce都是独立的. 分布式系统对每份数据都会做多个拷贝, 并分发到不同的机器, 这样任何一个机器出问题都不容易导致整个计算被拖延.
不足之处
1. JobTracker是MapReduce的关键点, 可能引发单点故障. 并且JobTracker负责的任务过多, 导致资源消耗大, 当Job数量非常多的时候, 会造成很大的内存开销, 增加JobTracker出问题的风险. 一般认为MapReduce V1最多只能支持4000个左右的节点.
2. TaskTracker以Map/Reduce的Task数目作为资源的表示, 不考虑cpu/内存的占用情况, 如果两个大内存消耗的Task被调度到了一起, 很容易出现OOM.
3. TaskTracker把资源强制划分为Map Task Slot和Reduce Task Slot, 如果系统中只有Map Task或者只有Reduce Task时, 就会导致集群资源利用率很低.
4. 强制升级更新导致用户体验差.
5. 如果没有新的数据加入, 那么我们可以把计算结果做index, 这样下次同样的操作, 比如查询,就能很快从数据库得到答案. 但是如果数据持续被更新, 我们必须重新运行MR作业来确保index也得到更新, 当数据更新频率达到一定程度, MapReduce的工作原理迟早会导致资源不足.
6. 所有的Map操作没有完成之前, 任何一个Reduce操作都是无法开始的.
7. 通常我们会发现Reduce的输出总是小于Map的输入, 意味着我们用很大的datasource来生成很小的values.
8. 为了做到最大化并发, 作业中的Map和Reduce必须是无序的: 任何一个Map和Reduce都不能依赖于它们的MapReduce作业所生成的数据. 因此计算顺序无法控制.
YARN (aka MapReduce NextGen, aka MRv2)
Apache Hadoop YARN (Yet Another Resource Negotiator)
YARN是对MapReduce框架的重构(API和Interface兼容MRv1), 主要包括:
把JobTracker的两个主要功能(资源管理和作业调度/监控)分成了两个独立的部分 - RM和AM.
1. ResourceManager (RM) - 资源管理
从全局来对应用进行基础计算资源(内存, 带宽等等)管理, 这里说的应用要么是传统意义上的MapReduce作业, 要么是作业的有向无环图(DAG).
它又有两个主要部分:
Scheduler(S):
让RM根据所选的Policy(capacity guarantees, fairness, etc), 将资源分配给各个应用. 它让RM成为一个纯粹的调度器, 它在执行过程中, 不会去做Monitoring和tracking status等工作. 此外, 它也不会去重启因应用失败或者硬件错误而运行失败的任务. 调度工作是基于每个应用的资源需求来合理安排的, 包括CPU, 内存, 带宽, 磁盘空间等等.
调度器的插件可以将集群资源分配给多个队列和应用程序. 这些插件有:Capacity Scheduler(能力调度), Fair Scheduler(公平调度), 等等. 其中, 能力调度支持队列继承/层级支持, 为子队列之间共享集群资源提供更好的可控性和可预测性.
ApplicationsManager(ASM):
RM使用该组件来接受作业提交, 并为每个应用分配合适的容器来运行对应的AM, 同时管理AM, 在AM运行失败时提供service来重启AM所在的容器或者去其他机器重启一个AM.
2. ApplicationMaster(AM/AppMst) - 作业调度/监控
管理应用的调度和协调. 它会跟调度器索要运行应用所需的资源容器, 跟踪容器状态, 监控进程.
3. NodeManager
它是框架在每台机器上的代理, 负责容器的状态维护. 监视容器的资源状况, 并告知RM/Scheduler.
总结
RM是一个中心服务, 它调度并启动每个Job所对应的AM, 监控AM的存在状况. 它接受JobSubmitter提交的作业, 根据作业的上下文信息, 和NodeManager提供的容器状态信息, 为AM提供一个容器.
AM则负责一个Job生命周期内的所有工作, 包括对task的监控, 重启等等, 类似以前的JobTracker. 不同的是每个Job都有一个AM, 它们分散在RM以外的机器上, 也即, JobTracker也被分布式化了, 它们由RM中的ASM来统一监控, 一旦任何一个机器的AM出问题, ASM可以重启这个AM, 或者在其他机器上重启一个AM. 从而防止了单点故障的可能.
YARN相比MRv1, 配置和全局变量, 启停脚本都有变化, 详细参见:
http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/
hadoop入门 - 案例
统计词频编辑
如果想统计下过去10年计算机论文出现最多的几个单词,看看大家都在研究些什么,那收集好论文后,该怎么办呢?
方法一:我可以写一个小程序,把所有论文按顺序遍历一遍,统计每一个遇到的单词的出现次数,最后就可以知道哪几个单词最热门了.这种方法在数据集比较耗时,是非常有效的,而且实现最简单,用来解决这个问题很合适.
方法二:写一个多线程程序,并发遍历论文.
这个问题理论上是可以高度并发的,因为统计一个文件时不会影响统计另一个文件.当我们的机器是多核或者多处理器,方法二肯定比方法一高效.但是写一个多线程程序要比方法一困难多了,我们必须自己同步共享数据,比如要防止两个线程重复统计文件.
方法三:把作业交给多个计算机去完成.
我们可以使用方法一的程序,部署到N台机器上去,然后把论文集分成N份,一台机器跑一个作业.这个方法跑得足够快,但是部署起来很麻烦,我们要人工把程序copy到别的机器,要人工把论文集分开,最痛苦的是还要把N个运行结果进行整合(当然我们也可以再写一个程序).
方法四:让MapReduce来帮帮我们吧!
MapReduce本质上就是方法三,但是如何拆分文件集,如何copy程序,如何整合结果这些都是框架定义好的.我们只要定义好这个任务(用户程序),其它都交给MapReduce.
Hadoop基础概念介绍的更多相关文章
- 【miscellaneous】 GStreamer应用开发手册学习笔记之基础概念介绍
第3章. 基础概念介绍 本章将介绍GStreamer的基本概念. 理解这些概念对于你后续的学习非常重要,因为后续深入的讲解我们都假定你已经完全理解了这些概念. 3.1. 元件(Elements) 元件 ...
- 大数据 - hadoop基础概念 - HDFS
Hadoop之HDFS的概念及用法 1.概念介绍 Hadoop是Apache旗下的一个项目.他由HDFS.MapReduce.Hive.HBase和ZooKeeper等成员组成. HDFS是一个高度容 ...
- 计算机系统4-> 计组与体系结构1 | 基础概念介绍
在大二上学期学习数字逻辑的过程中,我对计算机如何运作产生了兴趣,因此开了这个系列来记录自己在这方面的学习过程,此前三篇分别是: 计算机系统->Hello World的一生 | 程序如何运行,从大 ...
- hadoop分布式存储(1)-hadoop基础概念(毕业设计)
hadoop是一种用于海量数据存储.管理.分析的分布式系统.需要hadoop需要储备一定的基础知识:1.掌握一定的linux操作命令 2.会java编程.因此hadoop必须安装在有jdk的linux ...
- hadoop分布式存储(1)-hadoop基础概念
hadoop是一种用于海量数据存储.管理.分析的分布式系统.需要hadoop需要储备一定的基础知识:1.掌握一定的linux操作命令 2.会java编程.因此hadoop必须安装在有jdk的linux ...
- NAND FLash基础概念介绍
一.引脚介绍 引脚名称 引脚功能 CLE 命令锁存功能 ALE 地址锁存功能 /CE 芯片使能 /RE 读使能 /WE 写使能 /WP 写保护 R/B 就绪/忙输出信号 Vcc 电源 Vss 地 N. ...
- Hadoop基础概念
Apache Hadoop有2个核心的组件,他们分别是: HDFS: HDFS是一个分布式文件系统集群,它可以将大的文件分裂成块并将他们冗余地分布在多个节点上,HDFS是运行在用户空间的文件系统 Ma ...
- Hadoop 新生报道(三) hadoop基础概念
一.NameNode,SeconderyNamenode,DataNode NameNode,DataNode,SeconderyNamenode都是进程,运行在节点上. 1.NameNode:had ...
- Hadoop 基础概念
Hadoop就是一个实现了Google云计算系统的开源系统,包括并行计算模型Map/Reduce,分布式文件系统HDFS,以及分布式数据库Hbase,同时Hadoop的相关项目也很丰富,包括ZooKe ...
随机推荐
- sharepoint 2013 reporting services 远程server返回错误: (500) 内部server错误。
在sharepoint 2013部署reporting services过程中,点击管理中心,server上的服务.系统配置.提示了一个错误: 远程server返回错误: (500) 内部server ...
- javascript动态改变iframe的src
页面中需要动态的改变iframe的地址,方法有: 1. window.frames["chartFrame"].document.location = "<%=ba ...
- CentOS6.4中安装Python-Pip 以及Phyton gevent
一.安装Phyton-pip 首先要安装 Setuptools wget --no-check-certificate https://pypi.python.org/packages/2.6/s/s ...
- c#接口和new关键字和属性访问器基础收获
1.interface 对于接口,一把我在项目中会这样使用: interface IStudent { string Name(); string GoSchool(); } 但是呢,这样有个不好的地 ...
- leetcode Binary Tree Inorder Traversal python
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = ...
- 使用fastcgi_cache加速网站
为了提高网站的性能缓存是一把利器,nginx中可以配置fastcig_cache来缓存不需要实时获取的数据实现动静分离,nginx.conf配置如下: http { - fastcgi ...
- 简单的表单验证(js、jquery)
//javascript代码 function valForm(){ var username=document.getElementById("username"); var p ...
- 正选反选JS
JS <script> window.onload=function(){ var oTher=document.getElementById('other'); var oCheck=d ...
- iMac Termanel命令まとめ
1.mac环境下命令的使用ls -l -a 列出指定目录下文件 -l 显示文件的详细信息 -a 显示目录下所有文件(包括隐藏文件) -d ...
- OpenCV学习 7:图像形态学:腐蚀、膨胀
原创文章,欢迎转载,转载请注明出处 首先什么是图像形态学?额,这个抄下百度到的答案.基本思想: 用具有一定形态的结构元素去度量和提取图像中的对应形状已达到对图像分析和识别的目的,形态学图像处理表 ...