YARN源码分析之MRAppMaster启动
由YARN源码分析之ApplicationMaster启动流程中得知MR的AppMaster是由MRAppMaster启动的,在脚本中调用了AppMaster的main方法。
本文就顺着代码来对MRAppMaster进行解析下。
先来看下该类的main方法,
12345678910111213141516171819202122232425public static void main(String[] args) { try { // Environment中的环境变量是在launch_container.sh中export的 String containerIdStr = System.getenv(Environment.CONTAINER_ID.name()); String nodeHostString = System.getenv(Environment.NM_HOST.name()); String nodePortString = System.getenv(Environment.NM_PORT.name ...
HDFS之Cannot obtain block length for LocatedBlock异常
昨天公司集群升级,采集平台的flume agent没有停,导致一些文件异常,无法读,也无法使用cp或者get命令,报Cannot obtain block length for LocatedBlock。
首先使用fsck来检查下该文件,命令hdfs fsck file_path -files -blocks -locations,提示如下:
12Status: HEALTHY Total size: 0 B (Total open files size: 18935B)
现实文件依然是打开的,使用命令hadoop fsck file_path -openforwrite查看目录下打开的文件,显示:
1234517/08/03 15:21:50 WARN ssl.FileBasedKeyStoresFactory: The property 'ssl.client.truststore.location' has not been set, no TrustStore will be loadedConnecting to namenode via http: ...
利用canal同步mysql到HDFS
之前有一篇介绍性的文章简单介绍了实时同步mysql到hdfs的几种方案,本篇主要记录下利用canal同步mysql到hdfs的具体方案。
canal server 部署在canal中一个mysql实例对应一个配置文件,配置文件放在conf目录下的一个文件夹中,该文件夹的名字就代表了mysql实例。结构如下
12345-rwxr-xr-x 1 dc user 2645 Jul 18 14:25 canal.properties-rwxr-xr-x 1 dc user 2521 Jul 17 18:31 canal.properties.bak-rwxr-xr-x 1 dc user 3045 Jul 17 18:31 logback.xmldrwxr-xr-x 2 dc user 4096 Jul 17 18:38 springdrwxr-xr-x 2 dc user 4096 Jul 19 11:55 trans1
trans1代表一个mysql实例,该文件夹中有个instance.properties文件,在里面配置mysql数据库的信息
12345678## mysql ser ...
Java虚拟机及GC基础介绍
作为一个hadoop开发,工作中难免会遇到gc的问题,以前总是一头雾水,这次抽时间系统的整理下,只是入门,更加深入的知识在工作中用到了再整理。
要理解gc先要搞清楚JVM,JVM是一个抽象的计算机结构。Java程序根据JVM的特性编写。JVM针对特定于操作系统并且可以将Java指令翻译成底层系统的指令并执行。JVM确保了Java的平台无关性。
JVM架构下图是JVM的架构(此架构图是HotSpot JVM)下面简单介绍下各个组件:
class files文件是通过.java文件编译而来的。
ClassLoader的作用是装载能被JVM识别的指令,也就是加载.class文件到堆中,形成一个该类的对象(也就是说ClassLoader将class文件翻译为对象存放在堆内存中。)。其加载流程为加载 –> 验证 –> 准备 –> 解析 –> 初始化。ClassLoader,这个东西还是非常重要的,在JVM中是通过ClassLoader和类本身共同去判断两个Class是否相同。换句话说就是:不同的ClassLoader加载同一个Class文件,那么JVM认为他们生 ...
unclean.leader.election.enable引起的outOfRanger
前段时间采集平台的数据量发生异常,对数据进行排查发现hdfs上存在历史数据重复消费的问题。
采集平台是由TailDirSource+KafkaChannel将数据写入kafka,然后通过kafkaChannel+HDFSSink将数据写入hdfs
整个采集平台可能出现的故障的地方如下:
taildir重复采集了log
taildir调用kafkachannel向kafka写数据时进行了回滚
hdfsSink调用kafkachannel消费数据时,进行了重复消费
hdfsSink写入hdfs时发生了回滚
故障分析
首先检查了下hdfs上的数据量异常的现象,是多余的数据是最新的数据还是历史数据,经数据校验确认数据量暴增是由于历史数据造成的。
查看业务方服务器上历史log是否发生变化,查证后log的历史文件没有发生变化。
采集端的flume log无异常,在kafka到hdfs的环节中的flume log中发现info级别的offset重置信息。初步怀疑是offset发生了out of ranger,然后被重置了offset,而这个offset又是比较早的一个offset,导 ...
YARN源码分析之ApplicationMaster启动流程
任何一个计算框架或者说一个服务要运行在yarn上,都需要一个master来对job进行管理,这个master就是ApplicationMaster。
ApplicationMaster是一个job的大脑,下面就以MapReduce为例,介绍下ApplicationMaster的启动流程。
首先client向RM提交一个application请求,RM创建一个application,然后再创建一个appattempt,后期的调度和任务的拆解都是对这个appattempt进行的,当appattempt的状态从ALLOCATED_SAVING变成ALLOCATED时,由AttemptStoredTransition.transition调用appAttempt.launchAttempt()进行启动,下面来看下具体代码:
1234567// RMAppAttemptImpl.javaprivate void launchAttempt(){ // Send event to launch the AM Container // 通过异步调度器得到该事件注册的handle ( ...
YARN源码分析之ApplicationMaster分配策略
一次和朋友的谈话中涉及到ApplicationMaster的container分配策略是什么,我映像中是随机分配的,但他说是根据各节点空闲资源来分配的。之前看代码的时候也没注意这块的逻辑,既然现在有了疑惑那就去代码里瞅瞅。
从MR的运行log中可以找到AM的container是在什么时候分配的,见log
122017-04-09 03:26:17,113 INFO org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptImpl: appattempt_1491729774382_0001_000001 State change from SUBMITTED to SCHEDULED2017-04-09 03:26:17,415 INFO org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainerImpl: container_1491729774382_0001_01_000001 Container Transi ...
Intellij idea中依赖模块间的test代码
为了方便平时看代码和debug代码,我在hadoop的源码中新建了个模块hadoop-hunhun,此模块依赖其余hadoop模块,这样就可以直接在src中debug代码了。
在使用MiniMRClientCluster进行mr测试时,发现需要依赖一些模块的test代码,下面就来记录下载intellij idea中模块怎么依赖其余模块的test代码。
首先找到所依赖的test代码在哪个模块,这里会依赖jobclient、yarn-server-test和common模块中的test代码,操作步骤为:
File -> Project Structure点击新建的hadoop-hunhun模块,选择Dependencies选项卡,这里我已经添加了对其它模块的依赖,如图:
在添加test依赖之前,要在test所在模块中找到test代码的输出路径,以jobclient中test为例,在Project Structure中点击hadoop-mapreduce-client-jobclient模块,然后选择Paths,将其Test Output path的内容进行复制,如下:
然后再次回 ...
flume事务解析
在flume中事务是一个重要的概念,事务保证了数据的可用性。这里的事务有别于数据库中的事务,比事务在回滚时,可能会造成数据重复,所以flume保证的是每条数据最少发送一次,以此来保证数据不丢失。
此篇从具体的数据流中分析事务,配置的数据流是taildir+kafkachannel,然后kafkachannel+hdfsSink。
kafkachannel中维护了两个事务,分别是put事务和take事务。
put事务kafkachannel的put事务是由taildir触发的,我们从代码中跟下put事务的流程。
taildir的入口是TaildirSource.process,代码如下:
1234567891011121314151617181920public Status process() { Status status = Status.READY; try { existingInodes.clear(); existingInodes.addAll(reader.updateTailFiles()); for (long inod ...
kafka channel写入kafka报RecordTooLargeException异常
flume通过kafka channel直接将数据写入kafka时,如果producer一次写入kafka的数据比较大时,会报异常,异常如下:
12345678910111215 五月 2017 17:17:09,814 WARN [PollableSourceRunner-TaildirSource-r-op_hiveserver] (org.apache.flume.channel.kafka.KafkaChannel$KafkaTransaction.doCommit:560) - Sending events to Kafka failedjava.util.concurrent.ExecutionException: org.apache.kafka.common.errors.RecordTooLargeException: The message is 1730741 bytes when serialized which is larger than the maximum request size you have configured with the max. ...