flink get_json_object OOM 定位

环境版本

  • flink 1.3.5
  • hive 2.1.1

问题现象

  • 任务运行一段时间出现 oom
  • GC 信息来自于 arthas dashboard
 heap                                    7839M        7912M        7912M         99.08%       gc.g1_young_generation.count                  3103                                          
 g1_eden_space                           266M         338M         -1            78.70%       gc.g1_young_generation.time(ms)               149029                                        
 g1_survivor_space                       2M           2M           -1            100.00%      gc.g1_old_generation.count                    84                                            
 g1_old_gen                              7571M        7572M        7912M         95.70%       gc.g1_old_generation.time(ms)                 1728307                                       
 nonheap                                 201M         213M         1520M         13.29%                                                                                                   
 code_cache                              75M          77M          240M          31.47%                                                                                                   
 metaspace                               113M         120M         256M          44.24%                                                                                                   
 compressed_class_space                  13M          14M          1024M         1.29%                                                                                                    
 direct                                  1030M        1030M        -             100.00%                                                                                                  
 mapped                                  0K           0K           -             0.00%  

g1_old_gen 7571M 7572M 7912M 95.70% 老年代被占满

  • jmap -histo:live 13176 | head -n 10
 num     #instances         #bytes  class name
----------------------------------------------
   1:      29038550     4765922152  [C
   2:      78950689     3158027560  java.util.LinkedHashMap$Entry
   3:      29037950      696910800  java.lang.String
   4:       3039863      660059128  [Ljava.util.HashMap$Node;
   5:       3037192      170082752  java.util.LinkedHashMap
   6:          7459       48344936  [B
   7:            98        3212832  [Lakka.dispatch.forkjoin.ForkJoinTask;
   8:         32815        2100160  java.nio.DirectByteBuffer
   9:         18195        2023848  java.lang.Class
  10:         33261        1862616  org.apache.flink.core.memory.MemorySegment
  11:         48302        1545664  java.util.concurrent.ConcurrentHashMap$Node
  12:         14347        1328040  [Ljava.lang.Object;
  13:         32817        1312680  sun.misc.Cleaner
  14:         32810        1049920  java.nio.DirectByteBuffer$Deallocator

问题定位

  • 1、查找 java.util.LinkedHashMap 是由哪些类加载加载
    • [arthas@510008]$ sc -d java.util.LinkedHashMap 结果如下:

       class-info        org.apache.hadoop.hive.ql.udf.UDFJson$HashCache                                                                                                                        
       code-source       /HDATA/8/yarn/local1/usercache/mario/appcache/application_1572953124045_54575/filecache/37/flink-hudi090-20211215-1.0-SNAPSHOT-jar-with-dependencies.jar               
       name              org.apache.hadoop.hive.ql.udf.UDFJson$HashCache                                                                                                                        
       isInterface       false                                                                                                                                                                  
       isAnnotation      false                                                                                                                                                                  
       isEnum            false                                                                                                                                                                  
       isAnonymousClass  false                                                                                                                                                                  
       isArray           false                                                                                                                                                                  
       isLocalClass      false                                                                                                                                                                  
       isMemberClass     true                                                                                                                                                                   
       isPrimitive       false                                                                                                                                                                  
       isSynthetic       false                                                                                                                                                                  
       simple-name       HashCache                                                                                                                                                              
       modifier          static                                                                                                                                                                 
       annotation                                                                                                                                                                               
       interfaces                                                                                                                                                                               
       super-class       +-java.util.LinkedHashMap                                                                                                                                              
                           +-java.util.HashMap                                                                                                                                                  
                             +-java.util.AbstractMap                                                                                                                                            
                               +-java.lang.Object                                                                                                                                               
       class-loader      +-sun.misc.Launcher$AppClassLoader@6e0be858                                                                                                                            
                           +-sun.misc.Launcher$ExtClassLoader@e73f9ac                                                                                                                           
       classLoaderHash   6e0be858                                                                                                                                                               
      
       class-info        org.apache.hadoop.hive.ql.udf.generic.GenericUDTFJSONTuple$HashCache                                                                                                   
       code-source       /HDATA/8/yarn/local1/usercache/mario/appcache/application_1572953124045_54575/filecache/37/flink-hudi090-20211215-1.0-SNAPSHOT-jar-with-dependencies.jar               
       name              org.apache.hadoop.hive.ql.udf.generic.GenericUDTFJSONTuple$HashCache                                                                                                   
       isInterface       false                                                                                                                                                                  
       isAnnotation      false                                                                                                                                                                  
       isEnum            false                                                                                                                                                                  
       isAnonymousClass  false                                                                                                                                                                  
       isArray           false                                                                                                                                                                  
       isLocalClass      false                                                                                                                                                                  
       isMemberClass     true                                                                                                                                                                   
       isPrimitive       false                                                                                                                                                                  
       isSynthetic       false                                                                                                                                                                  
       simple-name       HashCache                                                                                                                                                              
       modifier          static                                                                                                                                                                 
       annotation                                                                                                                                                                               
       interfaces                                                                                                                                                                               
       super-class       +-java.util.LinkedHashMap                                                                                                                                              
                           +-java.util.HashMap                                                                                                                                                  
                             +-java.util.AbstractMap                                                                                                                                            
                               +-java.lang.Object                                                                                                                                               
       class-loader      +-sun.misc.Launcher$AppClassLoader@6e0be858                                                                                                                            
                           +-sun.misc.Launcher$ExtClassLoader@e73f9ac                                                                                                                           
       classLoaderHash   6e0be858                                                                                                                                                               
      
      
       class-info        org.apache.hudi.org.apache.avro.Schema$Names                                                                                                                           
       code-source       /HDATA/8/yarn/local1/usercache/mario/appcache/application_1572953124045_54575/filecache/37/flink-hudi090-20211215-1.0-SNAPSHOT-jar-with-dependencies.jar               
       name              org.apache.hudi.org.apache.avro.Schema$Names                                                                                                                           
       isInterface       false                                                                                                                                                                  
       isAnnotation      false                                                                                                                                                                  
       isEnum            false                                                                                                                                                                  
       isAnonymousClass  false                                                                                                                                                                  
       isArray           false                                                                                                                                                                  
       isLocalClass      false                                                                                                                                                                  
       isMemberClass     true                                                                                                                                                                   
       isPrimitive       false                                                                                                                                                                  
       isSynthetic       false                                                                                                                                                                  
       simple-name       Names                                                                                                                                                                  
       modifier          static                                                                                                                                                                 
       annotation                                                                                                                                                                               
       interfaces                                                                                                                                                                               
       super-class       +-java.util.LinkedHashMap                                                                                                                                              
                           +-java.util.HashMap                                                                                                                                                  
                             +-java.util.AbstractMap                                                                                                                                            
                               +-java.lang.Object                                                                                                                                               
       class-loader      +-sun.misc.Launcher$AppClassLoader@6e0be858                                                                                                                            
                           +-sun.misc.Launcher$ExtClassLoader@e73f9ac                                                                                                                           
       classLoaderHash   6e0be858                                                                                                                                                               
      
       class-info        org.codehaus.jackson.util.InternCache                                                                                                                                  
       code-source       /HDATA/8/yarn/local1/usercache/mario/appcache/application_1572953124045_54575/filecache/37/flink-hudi090-20211215-1.0-SNAPSHOT-jar-with-dependencies.jar               
       name              org.codehaus.jackson.util.InternCache                                                                                                                                  
       isInterface       false                                                                                                                                                                  
       isAnnotation      false                                                                                                                                                                  
       isEnum            false                                                                                                                                                                  
       isAnonymousClass  false                                                                                                                                                                  
       isArray           false                                                                                                                                                                  
       isLocalClass      false                                                                                                                                                                  
       isMemberClass     false                                                                                                                                                                  
       isPrimitive       false                                                                                                                                                                  
       isSynthetic       false                                                                                                                                                                  
       simple-name       InternCache                                                                                                                                                            
       modifier          final,public                                                                                                                                                           
       annotation                                                                                                                                                                               
       interfaces                                                                                                                                                                               
       super-class       +-java.util.LinkedHashMap                                                                                                                                              
                           +-java.util.HashMap                                                                                                                                                  
                             +-java.util.AbstractMap                                                                                                                                            
                               +-java.lang.Object                                                                                                                                               
       class-loader      +-sun.misc.Launcher$AppClassLoader@6e0be858                                                                                                                            
                           +-sun.misc.Launcher$ExtClassLoader@e73f9ac                                                                                                                           
       classLoaderHash   6e0be858   
      
    • 上面结果表明 LinkedHashmap 来自于:

      • org.apache.hadoop.hive.ql.udf.UDFJson$HashCache classLoaderHash 6e0be858
      • org.apache.hadoop.hive.ql.udf.generic.GenericUDTFJSONTuple$HashCache classLoaderHash 6e0be858
      • org.apache.hudi.org.apache.avro.Schema$Names classLoaderHash 6e0be858
      • org.codehaus.jackson.util.InternCache classLoaderHash 6e0be858
  • 2、感觉 org.apache.hadoop.hive.ql.udf.UDFJson 可疑于是查看下 org.apache.hadoop.hive.ql.udf.UDFJson 实例的个数
    [arthas@350606]$ vmtool --action getInstances --className org.apache.hadoop.hive.ql.udf.UDFJson  --limit 100
    @UDFJson[][
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@277ec174],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@2a46f1fe],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@67cd8d87],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@3fafc749],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@6e0bc4a9],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@735f0197],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@1b8fc53e],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@78f50bce],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@39a10e16],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@9bfab07],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@2e7401e],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@521c90f7],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@63fcf51c],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@17ef8df7],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@2f30c8a4],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@191d6e9d],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@14304fa2],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@1dcd2cb7],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@76a68acc],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@5ffa1954],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@2d61fdb0],
       @UDFJson[org.apache.hadoop.hive.ql.udf.UDFJson@593dd43f],
    ]
    
    • 实例个数并不多同样的方法再看下 org.apache.hadoop.hive.ql.udf.UDFJson$HashCache
    arthas@350606]$  vmtool --action getInstances --className org.apache.hadoop.hive.ql.udf.UDFJson$HashCache  --limit 20
    @HashCache[][
       @HashCache[isEmpty=false;size=11],
       @HashCache[isEmpty=false;size=11],
       @HashCache[isEmpty=false;size=11],
       @HashCache[isEmpty=false;size=11],
       @HashCache[isEmpty=false;size=1653617],
    ]
    
    • 发现第 5 个 HashCache size 有点异常, 并且隔一段时间执行发现 size 一致在增加, 基本定位到内存泄漏的点
      还可以执行如下语句看下 hashCache 里面的属性,遗憾的是第 5 个 hashCache 可能 size 太大执行不出来,其他四个的执行结果如下
    [arthas@350606]$ vmtool --action getInstances -c 6e0be858 --className org.apache.hadoop.hive.ql.udf.UDFJson$HashCache -x 2
    @HashCache[][
        @HashCache[
            @String[sws]:@Boolean[true],
            @String[pickup]:@Boolean[true],
            @String[elecSign]:@Boolean[true],
            @String[addresseeBuildingId]:@Boolean[true],
            @String[addresseeAoiDeptCode]:@Boolean[true],
            @String[consignorAoiDeptCode]:@Boolean[true],
            @String[consignorAoiId]:@Boolean[true],
            @String[wemWaybill]:@Boolean[true],
            @String[wemAckBill]:@Boolean[true],
            @String[uploadWaybill]:@Boolean[true],
            @String[wbepWaybill]:@Boolean[true],
        ],
        @HashCache[
            @String[sws]:@String[sws],
            @String[pickup]:@String[pickup],
            @String[elecSign]:@String[elecSign],
            @String[addresseeBuildingId]:@String[addresseeBuildingId],
            @String[addresseeAoiDeptCode]:@String[addresseeAoiDeptCode],
            @String[consignorAoiDeptCode]:@String[consignorAoiDeptCode],
            @String[consignorAoiId]:@String[consignorAoiId],
            @String[wemWaybill]:@String[wemWaybill],
            @String[wemAckBill]:@String[wemAckBill],
            @String[uploadWaybill]:@String[uploadWaybill],
            @String[wbepWaybill]:@String[wbepWaybill],
        ],
        @HashCache[
            @String[sws]:@ArrayList[isEmpty=true;size=0],
            @String[pickup]:@ArrayList[isEmpty=true;size=0],
            @String[elecSign]:@ArrayList[isEmpty=true;size=0],
            @String[addresseeBuildingId]:@ArrayList[isEmpty=true;size=0],
            @String[addresseeAoiDeptCode]:@ArrayList[isEmpty=true;size=0],
            @String[consignorAoiDeptCode]:@ArrayList[isEmpty=true;size=0],
            @String[consignorAoiId]:@ArrayList[isEmpty=true;size=0],
            @String[wemWaybill]:@ArrayList[isEmpty=true;size=0],
            @String[wemAckBill]:@ArrayList[isEmpty=true;size=0],
            @String[uploadWaybill]:@ArrayList[isEmpty=true;size=0],
            @String[wbepWaybill]:@ArrayList[isEmpty=true;size=0],
        ],
        @HashCache[
            @String[$.sws]:@String[][isEmpty=false;size=2],
            @String[$.pickup]:@String[][isEmpty=false;size=2],
            @String[$.elecSign]:@String[][isEmpty=false;size=2],
            @String[$.addresseeBuildingId]:@String[][isEmpty=false;size=2],
            @String[$.addresseeAoiDeptCode]:@String[][isEmpty=false;size=2],
            @String[$.consignorAoiDeptCode]:@String[][isEmpty=false;size=2],
            @String[$.consignorAoiId]:@String[][isEmpty=false;size=2],
            @String[$.wemWaybill]:@String[][isEmpty=false;size=2],
            @String[$.wemAckBill]:@String[][isEmpty=false;size=2],
            @String[$.uploadWaybill]:@String[][isEmpty=false;size=2],
            @String[$.wbepWaybill]:@String[][isEmpty=false;size=2],
        ],
        @HashCache[
        ],
    ]
    
    • 还可以调用如下命令查看第5个实例的方法结果
    [arthas@350606]$ vmtool --action getInstances -c 6e0be858 --className org.apache.hadoop.hive.ql.udf.UDFJson$HashCache --express 'instances[4].size()'
    @Integer[1864440]
    
  • 3、 到此内存泄漏的点基本找到了,过程还执行了其他一些语句
    profiler start --event alloc
    profiler getSamples
    profiler stop --format html --file /tmp/dw/output2.html
    watch 等
    
  • 4、问题根因定位 LinkedHashmap 在线程不安全的情况下未能及时清理
import lombok.SneakyThrows;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.UUID;

public class TEST {

    static class HashCache<K, V> extends LinkedHashMap<K, V> {

        private static final int CACHE_SIZE = 16;
        private static final int INIT_SIZE = 32;
        private static final float LOAD_FACTOR = 0.6f;

        HashCache() {
            super(INIT_SIZE, LOAD_FACTOR);
        }

        private static final long serialVersionUID = 1;

        @Override
        protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
            return size() > CACHE_SIZE;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        final  HashCache<Object, Object> objectObjectHashCache = new HashCache<>();
        for(int i =0; i < 20 ; i ++){
            new Thread(new Runnable() {
                @SneakyThrows
                @Override
                public void run() {
                    while (true){
                            objectObjectHashCache.put(UUID.randomUUID(),"");
                        Thread.sleep(1);
                    }
                }
            }).start();
        }

        while (true){
            System.out.println(objectObjectHashCache.size());
            Thread.sleep(3);
        }
    }
}

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

推荐阅读更多精彩内容