- 博客(178)
- 收藏
- 关注
原创 MapReduce源码分析之Task中关于对应TaskAttempt存储Map方案的一些思考
MapReduce源码分析之Task中关于对应TaskAttempt存储Map方案在性能和业务逻辑方面的考虑,您或许不以为然,可能觉得性能提升不大,但是如果在大规模集群中,当作业数量庞大、任务数目数量庞大时,这种优势就愈发明显,而它带来的好处,于已,于别的作业来说,都会是一种福音!这种设计上的细节,值得我们学习、借鉴与反思!
2016-05-07 09:42:57 8918
原创 Yarn源码分析之MapReduce作业中任务Task调度整体流程(一)
v2版本的MapReduce作业中,作业JOB_SETUP_COMPLETED事件的发生,会触发作业由SETUP状态转换到RUNNING状态,而作业状态转换中涉及作业信息的处理,是由SetupCompletedTransition来完成的,它主要做了四件事:1、通过设置作业Job的成员变量setupProgress为1,标记作业setup已完成;2、调度作业Job的Map Task;3、调度作业的JobReduce Task;4、如果没有task了,则生成JOB_COMPLETED事件并交由作业的事件处理器
2016-05-06 14:25:41 11962
原创 MapReduce源码分析之作业Job状态机解析(一)简介与正常流程浅析
Job状态机维护了MapReduce作业的整个生命周期,即从提交到运行结束的整个过程。Job状态机被封装在JobImpl中,其主要包括14种状态和19种导致状态发生的事件。
2016-05-05 10:38:12 7906
原创 Yarn源码分析之如何确定作业运行方式Uber or Non-Uber?
作业运行方式Uber or Non-Uber是通过Job的makeUberDecision()方法,传入作业大小inputLength来确定的,本文,我们将研究这一话题,即如何确定作业运行方式Uber or Non-Uber?
2016-05-03 18:35:18 15554
原创 Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(二)
我们知道,如果想要在Yarn上运行MapReduce作业,仅需实现一个ApplicationMaster组件即可,而MRAppMaster正是MapReduce在Yarn上ApplicationMaster的实现,由其控制MR作业在Yarn上的执行。如此,随之而来的一个问题就是,MRAppMaster是如何控制MapReduce作业在Yarn上运行的,换句话说,MRAppMaster上MapReduce作业处理总流程是什么?这就是本文要研究的重点。
2016-05-01 03:49:14 10891
原创 Yarn源码分析之MRAppMaster上MapReduce作业处理总流程(一)
我们知道,如果想要在Yarn上运行MapReduce作业,仅需实现一个ApplicationMaster组件即可,而MRAppMaster正是MapReduce在Yarn上ApplicationMaster的实现,由其控制MR作业在Yarn上的执行。如此,随之而来的一个问题就是,MRAppMaster是如何控制MapReduce作业在Yarn上运行的,换句话说,MRAppMaster上MapReduce作业处理总流程是什么?这就是本文要研究的重点。
2016-05-01 01:15:17 21742
原创 Yarn源码分析之参数mapreduce.job.reduce.slowstart.completedmaps介绍
mapreduce.job.reduce.slowstart.completedmaps是MapReduce编程模型中的一个参数,这个参数的含义是,当Map Task完成的比例达到该值后才会为Reduce Task申请资源,默认是0.05。
2016-04-30 10:54:42 17110
原创 Yarn源码分析之MRAppMaster:作业运行方式Local、Uber、Non-Uber
基于作业大小因素,MRAppMaster提供了三种作业运行方式:本地Local模式、Uber模式、Non-Uber模式。其中,1、本地Local模式:通常用于调试;2、Uber模式:为降低小作业延迟而设计的一种模式,所有任务,不管是Map Task,还是Reduce Task,均在同一个Container中顺序执行,这个Container其实也是MRAppMaster所在Container;3、Non-Uber模式:对于运行时间较长的大作业,先为Map Task申请资源,当Map Task运行完成数目达到一
2016-04-30 10:38:24 10214
原创 HDFS源码分析之FSImage文件内容(一)总体格式
FSImage文件是HDFS中名字节点NameNode上文件/目录元数据在特定某一时刻的持久化存储文件。它的作用不言而喻,在HA出现之前,NameNode因为各种原因宕机后,若要恢复或在其他机器上重启NameNode,重新组织元数据,就需要加载对应的FSImage文件、FSEditLog文件,并在内存中重做FSEditLog文件中的事务条目。本节,我们先来看下FSImage文件格式,及其内部数据是如何组织的。
2016-04-29 10:03:46 14041
原创 HDFS源码分析数据块校验之DataBlockScanner
DataBlockScanner是运行在数据节点DataNode上的一个后台进程,它负责管理所有块池的数据块扫描工作。当数据节点DataNode发送心跳给名字节点NameNode进行数据块汇报并执行完返回的命令时,会在DataBlockScanner的内部集合blockPoolScannerMap中注册块池ID与为此新创建的BlockPoolSliceScanner对象的关系,然后DataBlockScanner内部线程blockScannerThread周期性的挑选块池currentBpId,并获取块池切
2016-04-27 10:43:38 12739
原创 ThreadPoolExecutor源码分析(二):任务提交主逻辑execute()
作为一个执行服务ExecutorService的实例,ThreadPoolExecutor的首要任务当然是提交任务进行处理,那么,在任务提交时,ThreadPoolExecutor的处理流程是怎样的?它是一味的开启线程进行处理,还是有一套完整的逻辑来处理呢?本文,我们将继续分析ThreadPoolExecutor,看下它在任务提交时的主逻辑。
2016-04-25 17:16:22 3584
原创 Yarn源码分析之事件异步分发器AsyncDispatcher
AsyncDispatcher是Yarn中事件异步分发器,它是ResourceManager中的一个基于阻塞队列的分发或者调度事件的组件,其在一个特定的单线程中分派事件,交给AsyncDispatcher中之前注册的针对该事件所属事件类型的事件处理器EventHandler来处理。每个事件类型类可能会有多个处理渠道,即多个事件处理器,可以使用一个线程池调度事件。
2016-04-25 14:13:39 10012
原创 ThreadPoolExecutor源码分析(一):重要成员变量
ThreadPoolExecutor是一个通过使用可能几个池线程之一来执行每个提交任务的ExecutorService,这些线程池通常通过Executors工厂方法进行配置。 ThreadPoolExecutor中的线程池处理了两个不同的问题: 1、由于减少了每个任务调用的开销,在执行大量的异步任务时它们通常提供改进的性能; 2、它们提供了边界和管理资源的一种手段,包括多线程,在执行任务集合时的消耗。 每个ThreadPoolExecutor还
2016-04-24 14:51:24 8572 7
原创 MapReduce源码分析之JobSubmitter(一)
JobSubmitter,顾名思义,它是MapReduce中作业提交者,而实际上JobSubmitter除了构造方法外,对外提供的唯一一个非private成员变量或方法就是submitJobInternal()方法,它是提交Job的内部方法,实现了提交Job的所有业务逻辑。本文,我们将深入研究MapReduce中用于提交Job的组件JobSubmitter。
2016-04-22 17:50:26 10451
原创 MapReduce源码分析之新API作业提交(二):连接集群
MapReduce作业提交时连接集群是通过Job的connect()方法实现的,它实际上是构造集群Cluster实例cluster。Cluster为连接MapReduce集群的一种工具,提供了一种获取MapReduce集群信息的方法。在Cluster内部,有一个与集群进行通信的客户端通信协议ClientProtocol实例client,它由ClientProtocolProvider的静态create()方法构造,而Hadoop2.6.0中提供了两种模式的ClientProtocol,分别为Yarn模式的Y
2016-04-22 13:42:17 2102
原创 Hadoop Common源码分析之服务Service
Service是定义Hadoop中服务生命周期的一个接口。Service内部定义了服务的状态及生命周期,在服务被构造后,其一个生命周期内的状态为NOTINITED未初始化--INITED已初始化--已启动STARTED--已停止STOPPED,而这一生命周期内服务状态的变化,是随着如下方法链的调用而变化的:init()--start()--stop()
2016-04-21 14:54:17 1603
原创 MapReduce源码分析之JobSplitWriter
JobSplitWriter被作业客户端用于写分片相关文件,包括分片数据文件job.split和分片元数据信息文件job.splitmetainfo。分片数据文件job.split存储的主要是每个分片对应的HDFS文件路径,和其在HDFS文件中的起始位置、长度等信息,而分片元数据信息文件job.splitmetainfo存储的则是每个分片在分片数据文件job.split中的起始位置、长度等信息。
2016-04-21 09:23:49 10038
原创 Hadoop Common源码分析之SerializationFactory、Serialization
SerializationFactory是Hadoop中的一个序列化器工厂,它除了用来存储序列化器种类、更新序列化器相关配置信息,还提供了根据指定待序列化类获取相匹配的序列化器和反序列化器的功能。
2016-04-20 18:07:15 957
原创 Hadoop2.6.0版本MapReudce示例之WordCount(二)
继《Hadoop2.6.0版本MapReudce示例之WordCount(一)》之后,我们继续看MapReduce的WordCount示例,看看如何监控作业运行或查看历史记录,以及作业运行时的文件目录及列表。
2016-04-19 21:58:02 7158
原创 MapReduce源码分析之InputFormat
InputFormat描述了一个Map-Reduce作业中的输入规范。Map-Reduce框架依靠作业的InputFormat实现以下内容: 1、校验作业的输入规范; 2、分割输入文件(可能为多个),生成逻辑输入分片InputSplit(往往为多个),每个输入分片InputSplit接着被分配给单独的Mapper; 3、提供记录读取器RecordReader的实现,RecordReader被用于从逻辑输入分片InputSplit收集输入记录,这些输入记录会被交
2016-04-19 19:41:36 993
原创 MapReudce源码分析之Mapper
Mapper是MapReduce编程模型中一个将输入的key/value对映射成一组中间key/value对的组件。Map是将输入记录转换成中间记录的单个任务。被转换的中间记录不需要与输入记录一样的类型。一个给定的输入对可能被映射成0个货多个输出对。Hadoop的MapReduce框架为作业中输入格式InputFormat产生的每个输入分片InputSplit产生一个Map任务。通过JobContext的getConfiguration()方法,Mapper的实现者可以获得任务的配置信息。MapReduce
2016-04-18 21:16:10 1594
原创 Hadoop2.6.0版本MapReudce示例之WordCount(一)
本文详细讲解了Hadoop2.6.0版本MapReudce示例之WordCount的测试数据准备、运行命令、运行过程展示、运行结果查看等过程,并展示了WordCount的代码。
2016-04-18 16:03:19 9241
原创 HDFS源码分析数据块复制选取复制源节点
数据块的复制当然需要一个源数据节点,从其上拷贝数据块至目标数据节点。那么数据块复制是如何选取复制源节点的呢?本文我们将针对这一问题进行研究。在BlockManager中,chooseSourceDatanode()方法就是用来选取数据块复制时的源节点的,它负责解析数据块所属数据节点列表,并选择一个,用它作为数据块的复制源。其核心逻辑如下:根据block从blocksMap中取数据块所在数据节点存储实例集合并遍历,统计数据块副本情况,包括损坏副本、多余副本、退役副本、活跃副本等,然后损坏副本、多余副本、退役节
2016-04-17 22:13:06 2558
原创 HDFS源码分析数据块复制监控线程ReplicationMonitor(二)
HDFS源码分析数据块复制监控线程ReplicationMonitor(二)
2016-04-17 16:04:06 759
原创 HDFS源码分析数据块复制监控线程ReplicationMonitor(一)
ReplicationMonitor是HDFS中关于数据块复制的监控线程,它的主要作用就是计算DataNode工作,并将复制请求超时的块重新加入到待调度队列。
2016-04-15 23:06:06 2103
原创 HDFS源码分析之UnderReplicatedBlocks(二)
UnderReplicatedBlocks还提供了一个数据块迭代器BlockIterator,用于遍历其中的数据块。它是UnderReplicatedBlocks的内部类。
2016-04-15 17:07:25 2692
原创 HDFS源码分析之UnderReplicatedBlocks(一)
UnderReplicatedBlocks是HDFS中关于块复制的一个重要数据结构。在HDFS的高性能、高容错性体系中,总有一些原因促使HDFS系统内进行块复制工作,比如基于高性能的负载均衡、基于容错性的数据块副本数恢复等。那么,任何工作都会有一个优先级的问题,特别是这里的数据块复制,不可能简单的按照先入先出或者其他简单策略,比方说,基于容错性的数据块副本数恢复,特别是数据块副本仅有一个的数据块副本数恢复,其优先级肯定要比基于高性能的负载均衡高,所以数据块复制要有个优先级的概念,那么,数据块复制的优先级怎么
2016-04-15 14:18:38 10581
原创 HDFS源码分析数据块汇报之损坏数据块检测checkReplicaCorrupt()
无论是第一次,还是之后的每次数据块汇报,名字名字节点都会对汇报上来的数据块进行检测,看看其是否为损坏的数据块。那么,损坏数据块是如何被检测的呢?本文,我们将研究下损坏数据块检测的checkReplicaCorrupt()方法。
2016-04-14 09:23:39 3122
原创 HDFS源码分析之数据块及副本状态BlockUCState、ReplicaState
HDFS源码分析之数据块及副本状态BlockUCState、ReplicaState,名字节点NameNode内存中文件系统树中的数据块一共有四种状态,数据节点DataNode内存中数据块副本一共有五种状态。
2016-04-13 18:20:36 3622
原创 HDFS源码分析之数据块Block、副本Replica
我们知道,HDFS中的文件是由数据块Block组成的,并且为了提高容错性,每个数据块Block都会在不同数据节点DataNode上有若干副本Replica。那么,什么是Block?什么又是Replica?
2016-04-13 17:02:47 3982
原创 HDFS源码分析数据块之CorruptReplicasMap
CorruptReplicasMap用于存储文件系统中所有损坏数据块的信息。仅当它的所有副本损坏时一个数据块才被认定为损坏。当汇报数据块的副本时,我们隐藏所有损坏副本。一旦一个数据块被发现完好副本达到预期,它将从CorruptReplicasMap中被移除。
2016-04-13 13:47:14 1196
原创 HDFS源码分析数据块复制之PendingReplicationBlocks
PendingReplicationBlocks实现了所有正在复制的数据块的记账工作。它实现以下三个主要功能: 1、记录此时正在复制的块; 2、一种对复制请求进行跟踪的粗粒度计时器; 3、一个定期识别未执行复制请求的线程。
2016-04-13 11:20:13 2036
原创 HDFS源码分析之编辑日志编辑相关双缓冲区EditsDoubleBuffer
DataOutputBuffer是为edits准备的双缓冲区。新的编辑被写入第一个缓冲区,同时第二个缓冲区可以被flush。为edits准备的双缓冲区。新的编辑被写入第一个缓冲区,同时第二个缓冲区可以被flush。
2016-04-12 17:25:47 1278
原创 HDFS源码分析EditLog之读取操作符
在《HDFS源码分析EditLog之获取编辑日志输入流》一文中,我们详细了解了如何获取编辑日志输入流EditLogInputStream。在我们得到编辑日志输入流后,是不是就该从输入流中获取数据来处理呢?答案是显而易见的!在《》一文中,我们在讲编辑日志追踪同步时,也讲到了如下两个连续的处理流程: 4、从编辑日志editLog中获取编辑日志输入流集合streams,获取的输入流为最新事务ID加1之后的数据 5、调用文件系统镜像FSImage实例image的loadEdits()
2016-04-12 15:44:14 5211
原创 HDFS源码分析EditLog之获取编辑日志输入流
在《HDFS源码分析之EditLogTailer》一文中,我们详细了解了编辑日志跟踪器EditLogTailer的实现,介绍了其内部编辑日志追踪线程EditLogTailerThread的实现,及其线程完成编辑日志跟踪所依赖的最重要的方法,执行日志追踪的doTailEdits()方法。在该方法的处理流程中,首先需要从编辑日志editLog中获取编辑日志输入流集合streams,获取的输入流为最新事务ID加1之后的数据。那么这个编辑日志输入流集合streams是如何获取的呢?本文我们将进行详细研究。
2016-04-12 11:01:16 5320
原创 HDFS源码分析之EditLogTailer
EditLogTailer是一个编辑日志edit log的追踪器,它的主要作用就是当NameNode处于standby状态时用于从共享的edit log读取数据。
2016-04-11 22:41:37 2731
原创 Kafka源码分析之KafkaProducer
KafkaProducer是一个Kafka客户端实现,可以发布记录records至Kafka集群。KafkaProducer是线程安全的,多线程之间共享单独一个producer实例通常会比多个producer实例要快。KafkaProducer包含一组缓存池空间,存储尚未传输到集群的记录records,同时,一个后台的I/O线程负责将这些记录转换成请求,并发送至集群。使用之后关闭producer失败将会导致这些资源泄露。
2016-04-11 16:45:13 3309
原创 Kafka源码分析之InFlightRequests
InFlightRequests是对已经被发送或正在被发送但是均未接收到响应的客户端请求集合的一个封装。
2016-04-11 15:47:55 2072
原创 Kafka源码分析之Sender
Sender为处理发送produce请求至Kafka集群的后台线程。这个线程更新集群元数据,然后发送produce请求至适当的节点。
2016-04-10 17:41:04 1942 3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人