MapReduce任务独立性和任务的推测性执行

2019-03-28 13:29|来源: 网络

MR中一个InputSplit对应着一个map任务,而一个InputSplit可能包含一个或者多个block,block是HDFS对数据的物理划分而InputSplit是MR对文件的逻辑划分,通常来说InputSplit的大小和block的大小相同最适宜。其中单个 block 的操作是本地操作,将更多的时间用于计算,而不是数据传输。也就是说这个map任务在运行的过程中只从本节点上读取所需要的数据,而不会与其他节点进行通信获取数据,map任务之间的独立性,对任意一个map任务,都会在单独的Java进程中被初始化,map之间也不会进行通信。那同样对于reduce任务也是的,其中在reduce中不同key关联的value list 操作也是相互独立的。这种任务独立性就保证了容错性,TaskTracker定时会以心跳的方式向JobTracker通信,超过这个时间JobTracker任务这个任务失败,在其它地方重新执行这个任务,不需要任务的中间状态,而是直接重启,这个节点的选择也要考虑到数据所在的节点位置,尽量保证数据本地性,移动代码而不是移动数据。

独立性也可以扩展到cluster node上面,也就是执行mapper或reducer的过程,(以用户的角度)各node也是不会进行通信的,那各node节点唯一发生的通信的map和reduce中间的shuffle过程,此时通信也是隐式的,由于key的存在,便知道目的节点,所有的数据传送操作都是Hadoop平台去做的,对用户是透明的。

TaskTracker 向 JobTracker  报告任务运行情况

JobTracker 向 TaskTracker 分配任务 监视任务运行情况

DataNode 向 NameNode 请求data meat-data 和 更新自己的data meat-data    change

DataNode 向 DataNode 请求data

那么什么是speculative execution呢?可能由于部分节点 I/O CPU 网络带宽的限制,部分任务运行慢,然而大部分作业已经完成,那么为了不让这些运行节点称为任务的瓶颈,hadoop会在几个空闲的节点上调度执行剩余任务的拷贝,其中某一个任务完成时便向JobTracker报告,首先完成的拷贝称为权威拷贝,其他任务放弃执行,其输出也会被放弃。reducer 则从权威拷贝获取所需数据或者将数据接入到结果文件。mapred.map.tasks.speculative.execution 可以设置禁止任务的推测性执行。

计算资源:

1. 处理器时间

2. 内存

3. 磁盘

4. 网络带宽

对于Hadoop来说, 磁盘,网络带宽可能是个瓶颈。

相关问答

更多
  • 在nativescript-angular软件包的“ ^ 0.1.6 ”版本中支持使用Angular 2 moduleId 。 请注意,该版本使用的是Angular 2的官方“ 2.0.0-rc.1 ”。以下是package.json中应具有的依赖项列表: "dependencies": { "@angular/common": "2.0.0-rc.1", "@angular/compiler": "2.0.0-rc.1", "@angular/core": ...
  • 我的主要问题是我的应用程序中的代码如何执行SQL语句而不依赖于数据库? 嗯,真正实现这一目标的唯一方法是使用比SQL更高级别的查询语言,将其转换为特定于数据库的SQL。 我们已经为此提供了一些(专有的,标准的)DSL:Toplink QL,EJB-QL,JDO QL,HQL,JPQL等。我的建议是选择你的毒药(但请不要推出自己的解决方案) )。 My main question is how does my code in my application execute SQL statements with ...
  • 为什么我必须在Fragments布局中指定Java类,如下面的代码所示? 布局资源中的绝大多数XML元素都指定了Java类名称。 在你的例子中, LinearLayout是一个Java类名。 LayoutInflater逻辑查看元素名称并将其视为Java类名称,除了一些特殊的元素名称(如fragment 。 有时候,Java类名是完全合格的,对于来自库(例如, android.support.constraint.ConstraintLayout )的类或您自己的(例如, com.commonsware.c ...
  • 使用System.getProperty("file.separator") 。 Use System.getProperty("file.separator").
  • hist2d对数据进行分类,但是如果某些分箱总是空的,则没有定义chi平方统计量(因为除以零)。 您可以尝试减少垃圾箱数量,或丢弃空箱。 library(gplots) d <- data.frame( rnorm(100), rnorm(100) ) # Discard empty bins p <- hist2d(d) i <- apply( p$counts, 1, sum ) > 0 j <- apply( p$counts, 2, sum ) > 0 chisq.test( p$counts[i ...
  • 实际上,这两个设备上的矩形宽度都是100px。 你实际测量的是矩形的物理宽度。 困惑? 让我解释: 矩形在两台设备上的绘制精确到100px。 它们具有相同的屏幕分辨率,但其中一个具有较低的密度 ,以dpi (=每英寸点数)或有时ppi(=每英寸像素数)测量。 (在Android中,你可能已经知道mdpi意味着中等dpi (~160dpi)而hdpi意味着高dpi (~240dpi))现在,dpi只不过是一个像素的物理尺寸,而不是说有160像素/英寸你也可以说一个像素是0.something英寸大。 这意味着 ...
  • MIPS上的Linux程序可以编写为pic或不编译。 如果编译为pic,那么他们必须使用“abicalls”,并且它的行为与no-abicalls约定略有不同。 从“系统V应用程序二进制接口 - MIPS处理器补充第3版”的“与位置无关的功能序列”中,我们可以引用: 计算gp后,函数会分配本地堆栈空间并将gp保存在堆栈中,因此可以在后续函数调用后恢复。 换句话说,gp是调用者保存的寄存器。 下图中的代码说明了与位置无关的函数序言。 _gp_disp表示函数开头和全局偏移表之间的偏移量。 name: l ...
  • 是的,你可以尽可能地使用伪随机数。 但抛开pseduo部分,所有数字都来自文档中提到的相同数字生成器 “每次调用rand,randi或randn时,它们都会从共享的随机数生成器中绘制一个新值,并且可以将连续值视为统计独立的。” 因此,如果您说值(X_1,..., X_T)是相互独立的,那么值(X_1,..., X_2T)也是相互独立的。 在您的示例中(X_1,..., X_T)用于x而(X_T+1,..., X_2T)用于w 。 Yes, you can as far as it is possible f ...
  • 要制作副本,您实际上必须copy ! b = A[3,:].copy() (顺便说一下,python不是C:在语句需要之后没有分号。) To make a copy, you must, in fact, make a copy! b = A[3,:].copy() (By the way, python is not C: no semicolons after statements needed.)
  • 也许是这样的? var tcs = new TaskCompletionSource>(); foreach (var task in tasks) { task.ContinueWith((t, state) => { if (t.Result) { ((TaskCompletionSource>)state).TrySetResult(t); } }, ...