Oozie4.2升级问题排查记

问题Review

因为oozie4.2版本修复了4.1版本的rerun的bug,而且考虑升级成本不大,so在某一天的下午启动了升级,升级步骤参看Oozie4.2安装笔记

重启oozie server,打开oozie webui,一切正常,长舒一口气,没有引发线上任务异常。

但是欢乐的时光注定短暂,一个小时左右生产任务报警,上线后查看oozie历史,报警是一个执行bulkload的java action任务失败触发,这个任务主要是将上一个action生成的hfile导入到hbase表中。

为什么会失败?查看oozie server的oozie.log,其中有如下异常日志:

org.apache.oozie.action.hadoop.JavaMainException: org.apache.hadoop.hbase.io.hfile.CorruptHFileException: Problem reading HFile Trailer from file hdfs://xxxxxxx/user/hadoop/myproject/tmp/import_2_hbase_hfile/0000000-160223221418726-oozie-hado-W/meta/5bd82eb70707448d917ab7e319caec09
at org.apache.oozie.action.hadoop.JavaMain.run(JavaMain.java:58)
at org.apache.oozie.action.hadoop.LauncherMain.run(LauncherMain.java:39)
at org.apache.oozie.action.hadoop.JavaMain.main(JavaMain.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.oozie.action.hadoop.LauncherMapper.map(LauncherMapper.java:226)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:453)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
at org.apache.hadoop.mapred.LocalContainerLauncher$EventHandler.runSubtask(LocalContainerLauncher.java:370)
at org.apache.hadoop.mapred.LocalContainerLauncher$EventHandler.runTask(LocalContainerLauncher.java:295)
at org.apache.hadoop.mapred.LocalContainerLauncher$EventHandler.access$200(LocalContainerLauncher.java:181)
at org.apache.hadoop.mapred.LocalContainerLauncher$EventHandler$1.run(LocalContainerLauncher.java:224)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.AbstractExecutorService$1.run(AbstractExecutorService.java:94)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: org.apache.hadoop.hbase.io.hfile.CorruptHFileException: Problem reading HFile Trailer from file hdfs://xxxxxx/user/hadoop/myproject/tmp/import_2_hbase_hfile/0000000-160223221418726-oozie-hado-W/meta/5bd82eb70707448d917ab7e319caec09
at org.apache.hadoop.hbase.io.hfile.HFile.pickReaderVersion(HFile.java:463)
at org.apache.hadoop.hbase.io.hfile.HFile.createReader(HFile.java:506)
at org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles.groupOrSplit(LoadIncrementalHFiles.java:589)
at org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles$3.call(LoadIncrementalHFiles.java:507)
at org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles$3.call(LoadIncrementalHFiles.java:505)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.AbstractExecutorService$2.run(AbstractExecutorService.java:120)
... 3 more
Caused by: java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z
at org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy(Native Method)
at org.apache.hadoop.io.compress.SnappyCodec.checkNativeCodeLoaded(SnappyCodec.java:63)
at org.apache.hadoop.io.compress.SnappyCodec.getDecompressorType(SnappyCodec.java:192)
at org.apache.hadoop.io.compress.CodecPool.getDecompressor(CodecPool.java:178)
at org.apache.hadoop.hbase.io.compress.Compression$Algorithm.getDecompressor(Compression.java:327)
at org.apache.hadoop.hbase.io.compress.Compression.decompress(Compression.java:422)
at org.apache.hadoop.hbase.io.encoding.HFileBlockDefaultDecodingContext.prepareDecoding(HFileBlockDefaultDecodingContext.java:91)

问题分析

java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z这个异常引发的问题,分析应该是因为通过snappy压缩的hfile,在做bulkload的时候没有找到snappy的链接文件,导致抛出UnsatisfiedLinkError。

但是为什么在oozie4.1版本中没有出现这个问题?肯定是哪里没有将snappy的链接文件路径加入到LD_LIBRARY_PATH中,导致执行的container task找不到加载的链接文件。

因为执行的是java action,action指定的JAVA_MAIN_CLASS直接在launcher的mapper task中执行,所以应该是launcher的LD_LIBRARY_PATH不对导致的。在任务执行期间登陆到container task所在的机器,并在container运行目录下找到了launcher_container.sh的脚本,打开一看,果然LD_LIBRARY_PATH中缺少$HADOOP_INSTALL_ROOT/lib/native,而在oozie4.1中却有这个路径。

于是对比一下container运行目录下的job.xml配置文件,发现一个参数的配置应该是引起此问题的元凶:mapreduce.job.ubertask.enable,oozie4.1中任务配置为false,而oozie4.2中配置为true。

这种看来是由oozie的升级引起的,必定也来自于oozie的配置,于是进入oozie安装路径找到oozie的配置(oozie-site和oozie-default),对比发现oozie.action.launcher.mapreduce.job.ubertask.enable这配置项在4.1中默认配置为false,而在4.2中默认配置为true。

好吧,重新看了一下oozie4.2的release-log,果然:OOZIE-1385 Make Uber Mode the default (rkanter)

解决问题

那么问题的原因应该找到了,开始修复并验证。

  • 方案一:
    oozie.action.launcher.mapreduce.job.ubertask.enable配置到oozie4.2版本的oozie-site.xml中并设置为false,重启oozie server
    这种方案对所有的oozie job都关闭了ubertask的功能,不是很友好,毕竟uber mode能够提升launcher执行的效率

  • 方案二:
    在bulkload的java action的confituration中增加配置项:

    <property>
           <name>oozie.launcher.mapreduce.user.classpath.first</name>   
           <value>true</value>  
    </property>
    

    这个方案之所以能够生效,查看Oozie的JavaActionExecutor的代码有如下逻辑,USER CLASSPATH FIRST为true的时候禁用uber mode

     private boolean checkPropertiesToDisableUber(Configuration launcherConf) {
         boolean disable = false;
         if (launcherConf.getBoolean(HADOOP_JOB_CLASSLOADER, false)) {
             disable = true;
         }
         else if (launcherConf.getBoolean(HADOOP_USER_CLASSPATH_FIRST, false)) {
             disable = true;
         }
         return disable;
     }
    
```
  • 方案三:
    显式的在launcher的job env中增加LD_LIBRARY_PATH的配置,配置项如下:
    <property>   
        <name>oozie.launcher.mapred.map.child.env</name>  
        <value>LD_LIBRARY_PATH=${hadoop_install_root}/lib/native</value>
    </property>
    

任一方案修改生效后,rerun失败的任务,All Done!!

问题解释

那这个uber参数到底影响了什么,为什么true和false会引发不同的行为?下面开始跟踪源码

首先看一下网络上对uber job的解释(具体细节可关注参考文档页说明)

当一个job较小时,AM有一种特殊的处理机制,AM可以选择在它自己的同一个JVM中运行该job。这种情况发生在AM为该job重新分配container时需要的开销是大于在AM自己的container上运行该job,那么这样的job是成为uberlized的job,或者称为ubertask job。
这种模式的关键是job的map,reduce过程是与AppMaster共享同一个container。
这种模式需要满足三个条件:
1. 只有一个reducer
2. 少于10个mapper
3. Job输入数据集的大小小于HDFS的数据块大小。
据Arun的说法,启用该功能能够让一些任务的执行效率提高2到3倍(“we've observed 2x-3x speedup for some jobs”)

通过launcher任务查看到的确launcher启动的command不同:

  • uber模式为org.apache.hadoop.mapreduce.v2.app.MRAppMaster
  • 非uber模式为org.apache.hadoop.mapred.YarnChild 111.111.111.111 47209 attempt_1454657264436_3326_m_000000_0 2

看来引发问题的原因就是因为任务符合uber的小application的定义,所以按照uber的方式执行。而对于uber方式因为复用master的JVM,而启动master的JVM的LD_LIBRARY_PATH没有设置${hadoop_install_root}/lib/natvie造成map task的container找不到snappy相关的链接库。

参考文档

uber task介绍1
uber task介绍2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 首先,我们在使用前先看看HDFS是什麽?这将有助于我们是以后的运维使用和故障排除思路的获得。 HDFS采用mast...
    W_Bousquet阅读 4,167评论 0 2
  • 1、运行环境 主机IP 主机名 2、配置主机名(分别在五台机器上执行) hostname +主机名例如: h...
    献给记性不好的自己阅读 3,541评论 0 6
  • 1 目的将hadoop 2.7.1 安装到 166、167、168 三台机器上2 提供环境练习环境192.168....
    灼灼2015阅读 3,383评论 4 40
  • 走在回家道路上,怀里抱着一束野花芊草。 有谁留意了呢?一个人走在暮色里,左拿书右拥自然。 有谁留意了呢?暮色晚了才...
    蓝_格阅读 152评论 0 3
  • 所有的微商,都离不开精准客户,只是靠朋友圈的熟人,往往是不够的,而且成交也很难。只有通过网上引流的方式,吸引大量的...
    pnibvbipaiang阅读 575评论 0 0