摘要: 基于作业大小因素,MRAppMaster提供了三种作业运行方式:本地Local模式、Uber模式、Non-Uber模式。其中, 1、本地Local模式:通常用于调试; 2、Uber模式:为降低小作业延迟而设计的一种模式,所有任务,不管是Map Task,还是Reduce Task,均在同一个Cont 阅读全文
posted @ 2016-06-03 15:20 吉日木图 阅读(339) 评论(0) 推荐(0)
摘要: AsyncDispatcher是Yarn中事件异步分发器,它是ResourceManager中的一个基于阻塞队列的分发或者调度事件的组件,其在一个特定的单线程中分派事件,交给AsyncDispatcher中之前注册的针对该事件所属事件类型的事件处理器EventHandler来处理。每个事件类型类可能 阅读全文
posted @ 2016-06-03 15:19 吉日木图 阅读(379) 评论(0) 推荐(0)
摘要: 我们知道,MapReduce有三层调度模型,即Job——>Task——>TaskAttempt,并且: 1、通常一个Job存在多个Task,这些Task总共有Map Task和Redcue Task两种大的类型(为简化描述,Map-Only作业、JobSetup Task等复杂的情况这里不做考虑); 阅读全文
posted @ 2016-06-03 15:18 吉日木图 阅读(301) 评论(0) 推荐(0)
摘要: v2版本的MapReduce作业中,作业JOB_SETUP_COMPLETED事件的发生,即作业SETUP阶段完成事件,会触发作业由SETUP状态转换到RUNNING状态,而作业状态转换中涉及作业信息的处理,是由SetupCompletedTransition来完成的,它主要做了四件事: 1、通过设 阅读全文
posted @ 2016-06-03 15:17 吉日木图 阅读(371) 评论(0) 推荐(0)
摘要: 作业Job状态机维护了MapReduce作业的整个生命周期,即从提交到运行结束的整个过程。Job状态机被封装在JobImpl中,其主要包括14种状态和19种导致状态发生的事件。 作业Job的全部状态维护在类JobStateInternal中,如下所示: [java] view plain copy 阅读全文
posted @ 2016-06-03 15:16 吉日木图 阅读(290) 评论(0) 推荐(0)
摘要: 在MRAppMaster中,当MapReduce作业初始化时,它会通过作业状态机JobImpl中InitTransition的transition()方法,进行MapReduce作业初始化相关操作,而这其中就包括: 1、调用createSplits()方法,创建分片,并获取任务分片元数据信息Task 阅读全文
posted @ 2016-06-03 15:15 吉日木图 阅读(374) 评论(0) 推荐(1)
摘要: 本文继《Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(一)》,接着讲述MapReduce作业在MRAppMaster上处理总流程,继上篇讲到作业初始化之后的作业启动,关于作业初始化主体流程的详细介绍,请参见《Yarn源码分析之MRAppMaster上MapReduce作 阅读全文
posted @ 2016-06-03 15:12 吉日木图 阅读(302) 评论(0) 推荐(0)
摘要: 我们知道,如果想要在Yarn上运行MapReduce作业,仅需实现一个ApplicationMaster组件即可,而MRAppMaster正是MapReduce在Yarn上ApplicationMaster的实现,由其控制MR作业在Yarn上的执行。如此,随之而来的一个问题就是,MRAppMaste 阅读全文
posted @ 2016-06-03 15:11 吉日木图 阅读(414) 评论(0) 推荐(0)
摘要: mapreduce.job.reduce.slowstart.completedmaps是MapReduce编程模型中的一个参数,这个参数的含义是,当Map Task完成的比例达到该值后才会为Reduce Task申请资源,默认是0.05,其在接口MRJobConfig中表示如下: [java] v 阅读全文
posted @ 2016-06-03 15:11 吉日木图 阅读(1108) 评论(0) 推荐(0)
摘要: JobSubmitter,顾名思义,它是MapReduce中作业提交者,而实际上JobSubmitter除了构造方法外,对外提供的唯一一个非private成员变量或方法就是submitJobInternal()方法,它是提交Job的内部方法,实现了提交Job的所有业务逻辑。本文,我们将深入研究Map 阅读全文
posted @ 2016-06-03 15:10 吉日木图 阅读(281) 评论(0) 推荐(0)
摘要: JobSplitWriter被作业客户端用于写分片相关文件,包括分片数据文件job.split和分片元数据信息文件job.splitmetainfo。它有两个静态成员变量,如下: [java] view plain copy // 分片版本,当前默认为1 private static final i 阅读全文
posted @ 2016-06-03 15:09 吉日木图 阅读(473) 评论(0) 推荐(0)
摘要: MapReduce作业提交时连接集群是通过Job的connect()方法实现的,它实际上是构造集群Cluster实例cluster,代码如下: [java] view plain copy private synchronized void connect() throws IOException, 阅读全文
posted @ 2016-06-03 15:09 吉日木图 阅读(250) 评论(0) 推荐(0)
摘要: LocatedFileStatusFetcher是MapReduce中一个针对给定输入路径数组,使用配置的线程数目来获取数据块位置的实用类。它的主要作用就是利用多线程技术,每个线程对应一个任务,每个任务针对给定输入路径数组Path[],解析出文件状态列表队列BlockingQueue<List<Fi 阅读全文
posted @ 2016-06-03 15:08 吉日木图 阅读(331) 评论(0) 推荐(0)
摘要: 继《Hadoop2.6.0版本MapReudce示例之WordCount(一)》之后,我们继续看MapReduce的WordCount示例,看看如何监控作业运行或查看历史记录,以及作业运行时的文件目录及列表。 1、监控作业运行或查看历史记录 在WordCount的输出内容中,有这么一句:The ur 阅读全文
posted @ 2016-06-03 15:07 吉日木图 阅读(204) 评论(0) 推荐(0)
摘要: InputFormat描述了一个Map-Reduce作业中的输入规范。Map-Reduce框架依靠作业的InputFormat实现以下内容: 1、校验作业的输入规范; 2、分割输入文件(可能为多个),生成逻辑输入分片InputSplit(往往为多个),每个输入分片InputSplit接着被分配给单独 阅读全文
posted @ 2016-06-03 15:06 吉日木图 阅读(144) 评论(0) 推荐(0)
摘要: Mapper是MapReduce编程模型中一个将输入的key/value对映射成一组中间key/value对的组件。Map是将输入记录转换成中间记录的单个任务。被转换的中间记录不需要与输入记录一样的类型。一个给定的输入对可能被映射成0个货多个输出对。Hadoop的MapReduce框架为作业中输入格 阅读全文
posted @ 2016-06-03 15:05 吉日木图 阅读(244) 评论(0) 推荐(0)
摘要: 一、准备测试数据 1、在本地Linux系统/var/lib/Hadoop-hdfs/file/路径下准备两个文件file1.txt和file2.txt,文件列表及各自内容如下图所示: 2、在hdfs中,准备/input路径,并上传两个文件file1.txt和file2.txt,如下图所示: 二、编写 阅读全文
posted @ 2016-06-03 15:05 吉日木图 阅读(264) 评论(0) 推荐(0)
摘要: FSImage文件是HDFS中名字节点NameNode上文件/目录元数据在特定某一时刻的持久化存储文件。它的作用不言而喻,在HA出现之前,NameNode因为各种原因宕机后,若要恢复或在其他机器上重启NameNode,重新组织元数据,就需要加载对应的FSImage文件、FSEditLog文件,并在内 阅读全文
posted @ 2016-06-03 14:55 吉日木图 阅读(766) 评论(0) 推荐(0)
摘要: DataBlockScanner是运行在数据节点DataNode上的一个后台线程。它为所有的块池管理块扫描。针对每个块池,一个BlockPoolSliceScanner对象将会被创建,其运行在一个单独的线程中,为该块池扫描、校验数据块。当一个BPOfferService服务变成活跃或死亡状态,该类中 阅读全文
posted @ 2016-06-03 14:54 吉日木图 阅读(450) 评论(0) 推荐(0)
摘要: HDFS源码分析数据块复制监控线程ReplicationMonitor(二) 阅读全文
posted @ 2016-06-03 14:53 吉日木图 阅读(145) 评论(0) 推荐(0)
摘要: 数据块的复制当然需要一个源数据节点,从其上拷贝数据块至目标数据节点。那么数据块复制是如何选取复制源节点的呢?本文我们将针对这一问题进行研究。 在BlockManager中,chooseSourceDatanode()方法就是用来选取数据块复制时的源节点的,它负责解析数据块所属数据节点列表,并选择一个 阅读全文
posted @ 2016-06-03 14:53 吉日木图 阅读(577) 评论(0) 推荐(0)
摘要: ReplicationMonitor是HDFS中关于数据块复制的监控线程,它的主要作用就是计算DataNode工作,并将复制请求超时的块重新加入到待调度队列。其定义及作为线程核心的run()方法如下: [java] view plain copy /** * Periodically calls c 阅读全文
posted @ 2016-06-03 14:52 吉日木图 阅读(381) 评论(0) 推荐(0)
摘要: UnderReplicatedBlocks还提供了一个数据块迭代器BlockIterator,用于遍历其中的数据块。它是UnderReplicatedBlocks的内部类,有三个成员变量,如下: [java] view plain copy // 当前迭代级别 private int level; 阅读全文
posted @ 2016-06-03 14:51 吉日木图 阅读(240) 评论(0) 推荐(0)
摘要: UnderReplicatedBlocks是HDFS中关于块复制的一个重要数据结构。在HDFS的高性能、高容错性体系中,总有一些原因促使HDFS系统内进行块复制工作,比如基于高性能的负载均衡、基于容错性的数据块副本数恢复等。普遍的,任何工作都会有一个优先级的问题,特别是这里的数据块复制,不可能简单的 阅读全文
posted @ 2016-06-03 14:50 吉日木图 阅读(433) 评论(0) 推荐(0)
摘要: LightWeightGSet是名字节点NameNode在内存中存储全部数据块信息的类BlocksMap需要的一个重要数据结构,它是一个占用较低内存的集合的实现,它使用一个数组array存储元素,使用linked lists来解决冲突。它没有实现重新哈希分区,所以,内部的array不会改变大小。这个 阅读全文
posted @ 2016-06-03 14:49 吉日木图 阅读(365) 评论(0) 推荐(0)
摘要: 无论是第一次,还是之后的每次数据块汇报,名字名字节点都会对汇报上来的数据块进行检测,看看其是否为损坏的数据块。那么,损坏数据块是如何被检测的呢?本文,我们将研究下损坏数据块检测的checkReplicaCorrupt()方法。 关于数据块及其副本的状态,请阅读《HDFS源码分析之数据块及副本状态Bl 阅读全文
posted @ 2016-06-03 14:48 吉日木图 阅读(757) 评论(0) 推荐(0)
摘要: 关于数据块、副本的介绍,请参考文章《HDFS源码分析之数据块Block、副本Replica》。 一、数据块状态BlockUCState 数据块状态用枚举类BlockUCState来表示,代码如下: [java] view plain copy /** * States, which a block  阅读全文
posted @ 2016-06-03 14:47 吉日木图 阅读(353) 评论(0) 推荐(0)
摘要: 数据块在数据节点上是按照如下方式存储的。 首先是一个存储的根目录/Hadoop/data/dfs/dn,如下图所示: 接着进入current目录,如下图所示: 再进入后续的BP-433072574-192.168.1.224-1440568979639下current目录,如下图所示: 在它下面,有 阅读全文
posted @ 2016-06-03 14:46 吉日木图 阅读(704) 评论(0) 推荐(0)
摘要: CorruptReplicasMap用于存储文件系统中所有损坏数据块的信息。仅当它的所有副本损坏时一个数据块才被认定为损坏。当汇报数据块的副本时,我们隐藏所有损坏副本。一旦一个数据块被发现完好副本达到预期,它将从CorruptReplicasMap中被移除。 我们先看下CorruptReplicas 阅读全文
posted @ 2016-06-03 14:45 吉日木图 阅读(334) 评论(0) 推荐(0)
摘要: 我们知道,HDFS中的文件是由数据块Block组成的,并且为了提高容错性,每个数据块Block都会在不同数据节点DataNode上有若干副本Replica。那么,什么是Block?什么又是Replica? 首先,我们看下Block的定义,如下: [java] view plain copy /*** 阅读全文
posted @ 2016-06-03 14:45 吉日木图 阅读(318) 评论(0) 推荐(0)
摘要: PendingReplicationBlocks实现了所有正在复制的数据块的记账工作。它实现以下三个主要功能: 1、记录此时正在复制的块; 2、一种对复制请求进行跟踪的粗粒度计时器; 3、一个定期识别未执行复制请求的线程。 我们先看下它内部有哪些成员变量,如下: [java] view plain  阅读全文
posted @ 2016-06-03 14:44 吉日木图 阅读(485) 评论(0) 推荐(0)
摘要: EditsDoubleBuffer是为edits准备的双缓冲区。新的编辑被写入第一个缓冲区,同时第二个缓冲区可以被flush。为edits准备的双缓冲区。新的编辑被写入第一个缓冲区,同时第二个缓冲区可以被flush。在其内部,有两个重要的缓冲区成员变量,如下: [java] view plain c 阅读全文
posted @ 2016-06-03 14:43 吉日木图 阅读(326) 评论(0) 推荐(0)
摘要: 在《HDFS源码分析之EditLogTailer》一文中,我们详细了解了编辑日志跟踪器EditLogTailer的实现,介绍了其内部编辑日志追踪线程EditLogTailerThread的实现,及其线程完成编辑日志跟踪所依赖的最重要的方法,执行日志追踪的doTailEdits()方法。在该方法的处理 阅读全文
posted @ 2016-06-03 14:41 吉日木图 阅读(499) 评论(0) 推荐(0)
摘要: 在《HDFS源码分析EditLog之获取编辑日志输入流》一文中,我们详细了解了如何获取编辑日志输入流EditLogInputStream。在我们得到编辑日志输入流后,是不是就该从输入流中获取数据来处理呢?答案是显而易见的!在《HDFS源码分析之EditLogTailer》一文中,我们在讲编辑日志追踪 阅读全文
posted @ 2016-06-03 14:41 吉日木图 阅读(649) 评论(0) 推荐(0)
摘要: 在FSNamesystem中,有这么一个成员变量,定义如下: [java] view plain copy /** * Used when this NN is in standby state to read from the shared edit log. * 当NameNode处于stand 阅读全文
posted @ 2016-06-03 14:40 吉日木图 阅读(780) 评论(0) 推荐(0)
摘要: HDFS源码分析心跳汇报之周期性心跳,近期推出! 阅读全文
posted @ 2016-06-03 14:39 吉日木图 阅读(193) 评论(0) 推荐(0)
摘要: HDFS源码分析心跳汇报之DataNode注册,近期推出! 阅读全文
posted @ 2016-06-03 14:38 吉日木图 阅读(206) 评论(0) 推荐(0)
摘要: 在《HDFS源码分析心跳汇报之数据块增量汇报》一文中,我们详细介绍了数据块增量汇报的内容,了解到它是时间间隔更长的正常数据块汇报周期内一个smaller的数据块汇报,它负责将DataNode上数据块的变化情况及时汇报给NameNode。那么,时间间隔更长的正常数据块汇报都做了些什么呢?本文,我们将开 阅读全文
posted @ 2016-06-03 14:37 吉日木图 阅读(454) 评论(0) 推荐(0)
摘要: 在《HDFS源码分析心跳汇报之数据结构初始化》一文中,我们了解到HDFS心跳相关的BlockPoolManager、BPOfferService、BPServiceActor三者之间的关系,并且知道最终HDFS的心跳是通过BPServiceActor线程实现的。那么,这个BPServiceActor 阅读全文
posted @ 2016-06-03 14:36 吉日木图 阅读(245) 评论(0) 推荐(0)
摘要: 在《HDFS源码分析心跳汇报之BPServiceActor工作线程运行流程》一文中,我们详细了解了数据节点DataNode周期性发送心跳给名字节点NameNode的BPServiceActor工作线程,了解了它实现心跳的大体流程: 1、与NameNode握手: 1.1、第一阶段:获取命名空间信息并验 阅读全文
posted @ 2016-06-03 14:35 吉日木图 阅读(621) 评论(0) 推荐(0)
摘要: 在《HDFS源码分析心跳汇报之整体结构》一文中,我们详细了解了HDFS中关于心跳的整体结构,知道了BlockPoolManager、BPOfferService和BPServiceActor三者之间的关系。那么,HDFS心跳相关的这些数据结构,都是如何被初始化的呢?本文,我们就开始研究HDFS心跳汇 阅读全文
posted @ 2016-06-03 14:34 吉日木图 阅读(474) 评论(0) 推荐(1)
摘要: 我们知道,HDFS全称是Hadoop Distribute FileSystem,即Hadoop分布式文件系统。既然它是一个分布式文件系统,那么肯定存在很多物理节点,而这其中,就会有主从节点之分。在HDFS中,主节点是名字节点NameNode,它负责存储整个HDFS中文件元数据信息,保存了名字节点第 阅读全文
posted @ 2016-06-03 14:33 吉日木图 阅读(354) 评论(0) 推荐(0)
摘要: 在《HDFS源码分析之DataXceiverServer》一文中,我们了解到在DataNode中,有一个后台工作的线程DataXceiverServer。它被用于接收来自客户端或其他数据节点的数据读写请求,为每个数据读写请求创建一个单独的线程去处理。而处理每次读写请求时所创建的线程,就是本文要讲的D 阅读全文
posted @ 2016-06-03 14:32 吉日木图 阅读(701) 评论(0) 推荐(0)
摘要: DataXceiverServer是Hadoop分布式文件系统HDFS的从节点--数据节点DataNode上的一个后台工作线程,它类似于一个小型的服务器,被用来接收数据读写请求,并为每个请求创建一个工作线程以进行请求的响应。那么,有以下几个问题: 1、DataXceiverServer是什么? 2、 阅读全文
posted @ 2016-06-03 14:30 吉日木图 阅读(474) 评论(0) 推荐(0)