天天看點

hive mapjoin導緻的生産問題

背景

前天公司一個hive的一個關鍵任務挂掉,依賴該任務的下遊一共有16000個,可謂真tmd的多

由于公司電腦無法寫csdn部落格,也無法帶出日志,隻能我自己描述了

log日志類似于下面

info 1:35:00  Processing rows: 300w Hashtable size: 1900m Memory usage:1600m percentage: 0.87
           

當時是我值班,我3點40看到的最後一條日志就是上述部分,看到是mapjoin,然後最後的時間戳為1:35,立馬就覺得不太對,畢竟1個多小時了,mapjoin還沒有搞定,大機率是出問題了.聯系運維殺掉該任務,重跑

問題排查

由于我的崗位是數倉,排查這種東西輪不到我這種sql工程師,不過我自己好奇,百度了mapjoin的原理,大緻如下圖:

hive mapjoin導緻的生産問題

通過日志查找源碼:

/**
   * Throws MapJoinMemoryExhaustionException when the JVM has consumed the
   * configured percentage of memory. The arguments are used simply for the error
   * message.
   *
   * @param tableContainerSize currently table container size
   * @param numRows number of rows processed
   * @throws MapJoinMemoryExhaustionException
   */
  public void checkMemoryStatus(long tableContainerSize, long numRows)
  throws MapJoinMemoryExhaustionException {
    long usedMemory = memoryMXBean.getHeapMemoryUsage().getUsed();
    double percentage = (double) usedMemory / (double) maxHeapSize;
    String msg = Utilities.now() + "\tProcessing rows:\t" + numRows + "\tHashtable size:\t"
        + tableContainerSize + "\tMemory usage:\t" + usedMemory + "\tpercentage:\t" + percentageNumberFormat.format(percentage);
    console.printInfo(msg);
    if(percentage > maxMemoryUsage) {
      throw new MapJoinMemoryExhaustionException(msg);
    }
   }
           

确定出現問題的是我圈出來的部分,應該是這部分把資料賽的太慢了,撐爆了jvm

那麼考慮個問題,我們設定的mapjoin檔案大小為150兆,為啥從日志上來看,jvm已經使用了超過1.6g,差距太大了,原因是:數倉的表是orc的,150m也許解壓縮之後就可以到600兆,最後落在jvm,可能就會變成1g起步

解決辦法

方法一

減少mapjoin檔案大小,這個肯定可以的,不過導緻最後性能上不好說,本來可以走mapjoin的,最後涼涼,走mr,本人不建議,不過鑒于該任務特别重要,畢竟下遊16000個任務,各位大佬神仙齊聚會議室(我這種小兵沒資格),最後上司拍的是這個,我也是醉了,更牛逼的是,将這個門檻值直接調成25m,然後所有腳本使用的全局參數調整成25m,生死有命,富貴在天,真是心疼下一任值班同僚了

方法二

提升mr local task對應的jvm堆,應該也可以解決該問題,我一路尋找,最後找到了,啟動該任務的類

MapredLocalTask.java

jarCmd = hiveJar + " " + ExecDriver.class.getName();
      String hiveConfArgs = ExecDriver.generateCmdLine(conf, ctx);
      String cmdLine = hadoopExec + " jar " + jarCmd + " -localtask -plan " + planPath.toString()
          + " " + isSilent + " " + hiveConfArgs;
           

可以考慮去修改hadoop腳本來解決該問題

繼續閱讀