国产九九视频一区二区三区_亚洲欧美资源在线_精品国产自在久精品国产_成人午夜黄色影院

雙11家電市場洞察:AI全面滲透,新商業邏輯顯現從“卷”價格、尺寸到“卷”技術、AI,智能電視的競爭進入品質化時代魏少軍:2025年中國IC設計產業銷售額達8357.3億 同比增長29.4%消息稱豐田中國調整“姊妹車”戰略,廣豐多款主銷油車即將停產微信Win/Mac雙端4.1.5正式版超實用升級來了!新增滾動截圖、文件下載指定目錄服裝店會員系統詳盡選型報告:如何挑選會員管理系統vivo S50 Pro mini官宣首批搭載第五代驍龍8:跑分超300萬重回風口的無人物流車華帝換帥,蘇寧重整再延期,董明珠再談玫瑰空調歡聚集團Q3收入5.4億美元 同比增長超三成奇瑞星途星紀元 ES GT 旅行版實車曝光,有望 2025 廣州車展見2025英特爾技術創新與產業生態大會在重慶舉行CounterPoint:全球內存價格年內已上漲 50%,到 2026Q2 預估再漲 50%音質一目了然!LHDC重磅升級,全新「段位」系統讓聽歌選耳機不再糾結鴻蒙商用布局新進展:華為擎云將發布新一代鴻蒙電腦及鴻蒙電腦企業版東風風行星海 S7 800V 超快充版上市,限時置換 10.59 萬元起戴爾科技與Microsoft攜手創新,定義企業IT新未來消息稱理想汽車開展大反思:公司產品節奏變慢,套娃造成車型辨識度低聯想集團第二財季業績再超預期:營收與凈利均實現雙位數增長蔚來智駕芯片神璣NX9031開啟“賺錢”模式 已向一公司提供技術授權
  • 首頁 > 數據存儲頻道 > 數據.存儲頻道 > 存儲資訊

    HiveServer2內存泄漏問題定位與優化方案

    2022年09月16日 15:57:55 來源:EMR團隊驚帆

      前言

      HiveServer2 屬于 Hive 組件的一個服務,主要提供 Hive 訪問接口,例如可通過 JDBC 的方式提交 Hive 作業,HiveServer2 基于 Java 開發,整個服務運行過程中,內存的管理回收均由 JVM 進行控制。在 JVM 語言中的內存泄漏與 C/C++ 語言的內存泄漏會有些差異,JVM 的內存泄漏更多的是業務代碼邏輯錯誤引起大量對象引用被持有,導致多次 GC 均無法被回收,或者部分對象占用內存過大,直接超過 JVM 分配的內存上限,導致 JVM 內存耗盡,引起 JVM 的 OOM。這種情況下該 JVM 服務會停止響應并且退出,但是并不會引起操作系統的崩潰。

      背景

      近期收到反饋,一套開啟高可用的 EMR 集群中的 HiveServer2 一段時間后便會停止服務,此集群的 HiveServer2 一共有3個節點,狀態信息注冊至 Zookeeper 中,提供 HA 的能力,一段時間后幾乎3個節點都會停止服務,通過對 HiveServer2 的日志查看發現是大量的 FULL GC后出現 OOM:

      了解到該集群是一套從線下私有化部署的集群遷移而來,遷移前的集群中 HiveServer2 的 heapsize 為 2G,于是為了對齊業務參數將 heapsize 調整至 2G,間隔一天后,再次收到反饋,OOM 的問題依舊存在,查看日志,問題依舊是 HiveServer2 發生了 OOM,由于參數已經對齊之前的配置,那么問題可能不單純是內存不足,可能會有其他問題。于是首先將 HiveServer2 的 heapsize 調整為 4G,確保可以在一定時間內穩定運行,留下定位時間。

      定位

      定位方向為兩個方向:一個是分析 dump file,查看在內存不足的時候,內存消耗在哪些地方;第二個方向是針對日志進行細粒度分析,確保整個流程執行順序是合理的。

      通過對 JVM 的 dump 文件進行分析,定位到在發生 HiveServer2 的 OOM 的時候,queryIdOperation 這個 ConcurrentHashMap 占據了大量的內存,而此時 HiveServer2 的負載非常低。

      再基于具體的 QueryId 進行跟蹤日志,HiveServer2 對作業處理的邏輯為在建立 Connection 的時候會調用一次 OpenSession,拿到一個HiveConnection 對象,此后便通過 HiveConnection 對象調用 ExecuteStatement 執行 SQL,后臺每接收到一個 SQL 作業便生成一個 Operation 對象用來對 SQL 作業實現隔離。

      每一個 Operation 有自己獨立的 QueryId,每條 SQL 作業會經歷編譯,執行,關閉環節,注意此關閉指的是關閉當前執行的 SQL 作業,而不是關閉整個 HiveServer2 的連接,基于此思路追蹤日志,發現部分 QueryId 沒有執行 Close operation 方法。

      有了這個思路后,再對 Hive 的源碼進行查閱,發現 Close operation 方法被調用的前提是在一個名稱為 queryIdOperation 的 Map 對象中可以找出 QueryId,如果沒有從 queryIdOperation 找到合法的 QueryId,則不會觸發 Close 方法。

      再結合前面的堆棧圖,其中 queryIdOperation 占據了大量的內存,于是基本可以確定定位出問題的原因,為當 SQL 執行結束后,有一個 queryIdOperation 的 Map 對象,沒有成功的移除內部的內容,導致該 Map 越來越大,最后導致 HiveServer2 內存耗盡,出現 OOM,有了這個大概的思路,就需要仔細分析為什么會出現這個問題,從而找到具體的解決方案。

      分析

      在解決這個問題之前,先對 HiveServer2 本身做一個分析,HiveServer2 不同于一般的數據庫服務,HiveServer2 是由一系列的 RPC 接口組成,具體的接口定義在 org.apache.hive.service.rpc.thrift 包下的 TCLIService.Iface 中,部分接口如下:

      更多關于接口和服務器的知識可查看:干貨 | 在字節跳動,一個更好的企業級SparkSQL Server這么做

      每一個 RPC 接口之間相互獨立,一個作業從連接到執行 SQL 再到作業結束,會調用一系列的 RPC 接口組合完成這個動作,中間通過 OperationHandle 中的 THandleIdentifier 作為唯一 session id,由客戶端每次執行的時候進行傳遞,THandleIdentifier 在 OpenSession 的時候被創建。

      HiveServer2 基于此對整個作業的執行進行管理。具體的調用順序,以及調用何種接口,對于使用者是透明的,常用的客戶端例如 Hive JDBC Driver 或者 PyHive 等已經封裝了對應的調用順序,使用者只需要關心正常的打開連接,執行 SQL,關閉連接即可,與標準的數據庫操作邏輯保持一致。

      一個簡單的調用邏輯如上圖所示,當一個 Connection 執行多條 SQL 后,每一條 SQL 都是一個 Operation 進行記錄,并且各自擁有各自的 Query Id,HiveServer 基于此 Query Id 做一些狀態的管理,當連接結束后,調用 CloseOperation 清理所有內容。

      每一條 SQL 執行結束后,都會調用 CloseOperation 進行相關的狀態清除,如果清除失敗,當 connection 被 close 的時候,也會循環調用 CloseOperation 去清理狀態,確保狀態的一致性。這里需要注意的是,既然 HiveServer2 是一系列的獨立 RPC 接口,那么必然會出現萬一用戶不調用某些接口怎么辦,例如不調用 CloseSession,HiveServer2 為了解決這個問題內置了一個超時機制,當 Connection 達到超時的閾值后,會執行 close 動作,清除 Session 和 Operation 的狀態,具體的實現在 SessionManager 中的 startTimeoutChecker 方法中:

      有了這些知識,再來分析前面出現 OOM 的問題,出現 OOM 是一個名叫 queryIdOperation 的 ConcurrentHashMap 對象占據了大量的內存,對這個對象分析會發現這個對象位于:

      一個 Hive Connection 被打開后,可以執行多條 SQL,每一條 SQL 都是一個獨立的 Operation,此 Map 維護一個 queryId 和 Operation 的關系。

      當一個新的 SQL 作業到達的時候,QueryState 對象的 build 方法會構建出一個 queryState,在這里生成此 SQL 的唯一標記,也就是 QueryId:

      并且將該 QueryId 添加至 Connection 對象持有的 Hive Session,同時調用 OperationManager 的 addOperation 方法將此對象添加至 Map 中:

      當作業執行結束后,通過 OperationManager.closeOperation 調用 removeOperation 移除該 Map 中的映射:

      而 Query Id 是通過頂層的 Connection 中的 HiveSession 中去獲取:

      即使這里 removeOperation 失敗了,在 CloseSession,或者 HiveServer2 觸發超時動作后,都會再次回收該 Map 對象中的內容。

      有了這個思路,于是再去對日志進行深度分析,發現:

      很多 SQL 作業在執行后,并沒有調用 removeOperation 的行為,可以看到也就自然沒有觸發移除 queryIdOperation 的內容,那么內存被耗盡自然就可以理解,同時在 SQL 執行后會緊接著產生一個非法 Operation 的堆棧:

      思路理到這里,需要想的問題是:為什么沒有觸發 removeOperation 的行為,或者說 removeOperation 沒有執行成功,基于前面的理解來看,removeOperation 會有3種觸發時機,分別是:

      SQL 作業執行結束調用 CloseOperatipn。

      Connection 斷開調用 CloseSession。

      HiveServer2 自身的狀態判斷 Connection 超時發起 Close。

      所以沒有被調用的可能性不大,那么只剩下調用了,但是沒有執行成功,沒有執行成功也有2種情況:

      執行了,但是失敗了。

      執行成功了,但是沒有移除。

      失敗可能性不大,因為失敗了,那么一定會留下堆棧信息,于是只剩下執行了但是沒有移除,出現這樣的情況基本就是只能是:

      里面查詢出的 QueryId 并不是當前作業的 QueryId,這個 ID 發生了篡改,那么什么樣的情況下會發生篡改?再來理一理 HiveServer 的狀態邏輯:

      一個 Connection 執行 SQL 的時候,會先產生一個 Operation,并且生成一個 Query Id,將這個 Query Id 設置成全局 HiveSession的內容:

      同時把這些信息存儲到這兩個 Map 中:

      在 close 的時候再從 HiveSession 中去查詢出來,由于 HiveServer2 是一系列的獨立 RPC 請求,因此不能保證整個流程的原子性,那么想一種情況,假設 N 個并行線程,同時持有一個 Hive Connection,且同時開始發送 SQL 會怎樣?

      可以看到如果兩個子線程同時使用同一個 Connection 執行 SQL,于是會出現一個線程把另一個線程的 Query Id 進行覆蓋,導致其中一個線程丟失自己的 Query Id,導致無法成功的從 Map 中移除對象,具體的執行思路為:

      t1: 線程 A 將 conf 中的 queryId 設成 A;

      t2: 線程 B 將 conf 中的 queryId 設成 B;

      t3: 線程 A 從 conf 中拿到 queryId 為 B,并 close B;

      t4: 線程 B 從 conf 中拿到 queryId 為 B,并 close B,出現異常。

      于是一直遺留了 queryId A,因為兩個線程同時變成了相同的 Query Id,當其中一個線程執行了 remove 動作后,另一個線程要基于當前 Query Id 再去查詢內容的時候,便會出現緊接著的第二個錯誤,也就是非法的 Session Id。

      由于本次出現問題的使用場景是 Airflow 進行調用,Airflow 具有工作流的能力可同時在一個 Dag 中并發開啟 N 個并行節點,而這些并行節點在同一個 Dag 下,因此共享同一個 Connection,于是觸發了這個問題。

      但是我們要知道,多個線程使用同一個 Connection 是非常常見的現場,特別是在數據庫的連接池的概念中,那么為什么沒有出問題呢?這里也就涉及到 HiveServer2 本身的架構問題,HiveServer2 本身不是一個數據庫,僅僅提供了兼容 JDBC 接口的協議和 Driver 而已,因此相比傳統的數據庫的連接池,它并不能保證串行,也就是不具有排它效果,當然這只是次要問題,主要還是 HiveServer2 實現的缺陷。

      對于此問題的復現,只需要創建一個 HiveConnection,同時并行開啟多個線程同時使用該 Connection 對象執行 SQL,便可復現這個問題。執行過程中觀察 HiveServer2 內存變化,可以發現 HiveServer2 的內存上升后,并沒有發生下降,隨著使用時間的增加,最后直至 OOM。

      解決

      既然找到了問題,那么解決方案就清楚了,那便是將 Query Id 這個值設置成 Operation 級別,而不是 HiveSession 級別,此問題影響 Hive3.x 版本,2.x 暫時沒有這個特性,因此不受影響。再對照官方已知的 issue,此問題是已知 issue,目前 Hive 已經將此問題修復,且合入了4.0的版本,具體可查看:https://issues.apache.org/jira/browse/HIVE-22275

      但是由于該 issue 是針對 4.0.0 的代碼修復的,對于 3.x 系列并沒有 patch,直接 cherry-pick 將會有大量的代碼不兼容,因此需要自行參考進行修復,修復的思路為給 Operation 新增:

      將 Query Id 從 HiveSession 級別移除,存入 Operation 級別,同時更新 Query Id 的獲取和設置:

      對 Hive 進行重新打包,在現有集群上對 hive-service-x.x.x.jar 進行替換,即可修復此問題。

      結尾

      雖然有些問題在官方 issue 上已經有發布,但是實際業務過程中我們依舊需要仔細定位,確保當前的問題,與已知問題是一致的,盡可能少的留下隱患,同時也有助于更加掌握引擎本身的原理和實現邏輯。只有對問題有清晰的認知,且對解決方案的邏輯有足夠的了解,才能保證整個集群在生產環境下的穩定。

      文章內容僅供閱讀,不構成投資建議,請謹慎對待。投資者據此操作,風險自擔。

    海報生成中...

    最新新聞

    熱門新聞

    即時

    全球頂級AI創作社區回歸!海藝AI國內首發“全民娛樂化創作

    海藝AI的模型系統在國際市場上廣受好評,目前站內累計模型數超過80萬個,涵蓋寫實、二次元、插畫、設計、攝影、風格化圖像等多類型應用場景,基本覆蓋所有主流創作風格。

    新聞

    市場占比高達35.8%,阿里云引領中國AI云增長

    9月9日,國際權威市場調研機構英富曼(Omdia)發布了《中國AI云市場,1H25》報告。中國AI云市場阿里云占比8%位列第一。

    企業IT

    華為坤靈發布IdeaHub千行百業體驗官計劃,助力中小企

    9月24日,華為坤靈召開“智能體驗,一屏到位”華為IdeaHub千行百業體驗官計劃發布會。

    3C消費

    雅馬哈推出兩款高端頭戴耳機YH-4000與YH-C3000

    雅馬哈昨日宣布推出兩款頭戴式耳機,分別是平板振膜的YH-4000和動圈原理的YH-C3000。

    研究

    IDC:2025上半年全球智能家居清潔機器人出貨量同比暴

    IDC今日發布的《全球智能家居清潔機器人設備市場季度跟蹤報告,2025年第二季度》顯示,上半年全球智能家居清潔機器人市場出貨1,2萬臺,同比增長33%,顯示出品類強勁的市場需求。

    国产九九视频一区二区三区_亚洲欧美资源在线_精品国产自在久精品国产_成人午夜黄色影院
    亚洲靠逼com| 成人av在线网站| 国产性做久久久久久| 中文字幕亚洲欧美在线不卡| 精品一区二区三区在线播放| 欧美探花视频资源| 国产精品久久久久天堂| 69久久夜色精品国产69蝌蚪网| 麻豆成人av在线| 亚洲精品乱码久久久久久黑人| 一区二区三区在线视频免费 | 亚洲欧洲成人精品av97| 91麻豆成人久久精品二区三区| 亚洲电影在线播放| 91麻豆精品国产91久久久久久久久| 亚洲欧美日韩一区二区 | 亚洲a一区二区| 国产精品传媒视频| 中文字幕巨乱亚洲| 国产午夜精品久久| 国产精品嫩草影院com| 国产亚洲视频系列| 中文字幕一区不卡| 天天综合色天天综合| 日韩黄色一级片| 国产一级精品在线| 色婷婷国产精品综合在线观看| 色综合 综合色| 91精品国产综合久久精品麻豆| 日韩三级高清在线| 67194成人在线观看| 久久久五月婷婷| 国产精品美女久久久久久久久久久 | 午夜精品福利一区二区三区av| 色综合天天综合在线视频| 亚洲人成小说网站色在线| 色综合激情五月| 日韩av一级片| 中文字幕精品综合| 欧美一区二区在线看| 国产福利一区二区三区| 狠狠色综合播放一区二区| 日韩免费高清av| 国精产品一区一区三区mba桃花| 精品国精品自拍自在线| 91伊人久久大香线蕉| 欧美亚洲国产一区二区三区va | 丰满亚洲少妇av| 国产女主播视频一区二区| 免费在线观看成人| 欧美体内she精高潮| 亚洲国产裸拍裸体视频在线观看乱了| 色香蕉成人二区免费| 日韩美女视频一区二区| 男女男精品网站| 国产91综合网| 亚洲视频中文字幕| 成人黄色网址在线观看| 久久久久久久综合| 九九**精品视频免费播放| 91精品国产免费| 中文字幕一区免费在线观看| 男人的j进女人的j一区| 成人午夜视频网站| 亚洲国产精品国自产拍av| 国产欧美日韩久久| 国产资源精品在线观看| 国产女人18水真多18精品一级做| 精品在线一区二区三区| 国产精品久久影院| 国产成人无遮挡在线视频| 欧美视频三区在线播放| 成人国产在线观看| 一本大道久久a久久综合婷婷| 日本欧美在线看| 亚洲欧美日韩一区二区| 日韩色视频在线观看| 日韩毛片视频在线看| 激情综合色综合久久综合| 欧美丰满嫩嫩电影| 五月婷婷综合网| 欧美麻豆精品久久久久久| 亚洲一二三四在线| 欧美日韩精品福利| 天堂蜜桃一区二区三区| 欧美日韩一级二级三级| 午夜视频在线观看一区二区| 欧美日韩亚洲不卡| 日本午夜一区二区| 91精品国产色综合久久久蜜香臀| 午夜视频在线观看一区二区| 欧美丰满嫩嫩电影| 久久精品国产精品青草| 欧美成人aa大片| 激情综合网av| 1024成人网| 91理论电影在线观看| 亚洲图片欧美综合| 日韩天堂在线观看| 国产乱子轮精品视频| 国产精品国产馆在线真实露脸| 色综合夜色一区| 视频一区在线视频| 26uuu成人网一区二区三区| 国产精品资源网| 亚洲黄网站在线观看| 欧美一卡2卡3卡4卡| 东方欧美亚洲色图在线| 中文字幕一区二区三区在线不卡 | 精品福利av导航| 国产sm精品调教视频网站| 久久人人97超碰com| 色综合久久久久综合体桃花网| 亚洲中国最大av网站| 欧美人妇做爰xxxⅹ性高电影 | 欧美在线制服丝袜| 91蜜桃网址入口| 亚洲国产欧美在线| 久久免费午夜影院| 99精品视频在线免费观看| 亚洲精品自拍动漫在线| 欧美伦理视频网站| 成人在线视频一区| 日韩精品亚洲一区| 国产精品毛片大码女人| 欧美人牲a欧美精品| 国产精品 欧美精品| 图片区小说区区亚洲影院| 久久久久久久久蜜桃| 欧美日韩成人激情| av资源网一区| 久久精品av麻豆的观看方式| 一区二区在线观看免费视频播放| 亚洲精品一区二区三区影院| 在线看不卡av| 99久久免费精品高清特色大片| 麻豆精品一区二区三区| 亚洲资源在线观看| |精品福利一区二区三区| 精品国产免费久久| 欧美在线视频全部完| 天天影视色香欲综合网老头| 国产精品私房写真福利视频| 欧美性xxxxxxxx| 99久久er热在这里只有精品66| 黄色成人免费在线| 亚洲精品菠萝久久久久久久| 久久精品在这里| 欧美军同video69gay| 色婷婷久久99综合精品jk白丝| 美女视频免费一区| 日韩影院在线观看| 亚洲电影中文字幕在线观看| 中文字幕在线不卡一区二区三区 | 91香蕉视频在线| 成人听书哪个软件好| 国产乱一区二区| 国产毛片精品一区| 国内精品免费**视频| 久久99国产精品尤物| 精品无码三级在线观看视频| 蜜臀av性久久久久av蜜臀妖精| 亚洲va国产va欧美va观看| 午夜欧美电影在线观看| 一区二区成人在线视频 | 亚洲制服丝袜av| 亚洲欧美日韩国产一区二区三区| 国产精品你懂的在线欣赏| 国产精品欧美一区喷水| 国产精品美女久久久久高潮| 中文无字幕一区二区三区| 国产精品美女视频| 亚洲欧美aⅴ...| 亚洲一卡二卡三卡四卡五卡| 亚洲一区精品在线| 丝袜国产日韩另类美女| 日韩电影在线免费看| 美女网站在线免费欧美精品| 免费在线看一区| 国产精品一区在线| www.亚洲精品| 欧美自拍偷拍一区| 亚洲综合一区在线| 欧美日韩mp4| 欧美人妖巨大在线| 日韩欧美一区电影| 国产亚洲欧美激情| 最近日韩中文字幕| 亚洲在线一区二区三区| 亚洲最快最全在线视频| 国产精品每日更新在线播放网址| 欧美国产综合一区二区| 日韩**一区毛片| 国产在线视频精品一区| 中文字幕在线免费不卡| 国产精品高清亚洲| 日本欧美肥老太交大片| 亚洲视频狠狠干| 亚洲精品福利视频网站| 亚洲国产精品久久久男人的天堂|