如何找到Hive提交的SQL相對應的Yarn程式的applicationId

来源:https://www.cnblogs.com/roushi17/archive/2020/05/04/hive_tez.html
-Advertisement-
Play Games

最近的工作是利用Hive做數據倉庫的ETL轉換,大致方式是將ETL轉換邏輯寫在一個hsql文件中,腳本當中都是簡單的SQL語句,不包含判斷、迴圈等存儲過程中才有的寫法,僅僅支持一些簡單的變數替換,比如當前賬期等。然後通過一個通用的shell腳本來執行hsql文件。該腳本是主要是調用了hive -f ...


最近的工作是利用Hive做數據倉庫的ETL轉換,大致方式是將ETL轉換邏輯寫在一個hsql文件中,腳本當中都是簡單的SQL語句,不包含判斷、迴圈等存儲過程中才有的寫法,僅僅支持一些簡單的變數替換,比如當前賬期等。然後通過一個通用的shell腳本來執行hsql文件。該腳本是主要是調用了hive -f <hsql文件>來執行hsql文件中的SQL語句的,當然hive命令會通過--hivevar選項定義變數將當前賬期等數值傳進去供SQL使用。

簡單說下環境信息,目前使用的大數據平臺版本是HDP 3.1.0.0-78,Hive版本是3.1.0,而Tez版本是0.9.1。Hive 3.X系列的新特性主要包括:

1. 執行引擎不再支持mr,取而代之的是tez或者spark(在HDP平臺預設是tez);

2. 不再支持胖客戶端Hive CLI,被beeline取代(目前通過hive命令執行sql實際還是調用的beeline去連接hiveserver2服務);

3. 預設建表支持ACID語義;

4. 支持LLAP,即Live Long and Process,相當於記憶體計算,極大地優化了性能(該特性實際從Hive 2.X開始支持);

言歸正傳,回到本文的主題,比如Hive在運行過程中報錯了,我們需要在Yarn上找到對應的application的日誌以便定位問題,前提是需要知道Yarn程式對應的applicationId,但是beeline的輸出信息中是沒有applicationId的,那麼如何找到Hive提交的SQL相對應的Yarn程式的applicationId呢?主要有以下幾個步驟:

1. 我們通過shell腳本提交hsql文件時實際是通過beeline向hiveserver2服務提交hsql文件中的SQL語句,我們的shell腳本會將beeline的屏幕輸出信息同時重定向到日誌文件中,這個就是我們的第一個步驟的日誌。我們找到這個日誌文件,在其中搜索關鍵字"Completed executing command",可以得到queryId,其中每個SQL語句對應1個queryId,因為我們的hsql腳本中有4個SQL語句,所以搜索出來的信息如下:

INFO : Completed executing command(queryId=hive_20200502095437_1e9bf52d-e590-4519-a6e1-9e2e4ae91158); Time taken: 0.755 seconds
INFO : Completed executing command(queryId=hive_20200502095816_888a7dba-4403-439d-a3a7-f6cdc280c18a); Time taken: 52.929 seconds
INFO : Completed executing command(queryId=hive_20200502100121_5752f019-a6e2-463c-b413-a80bbe518a5c); Time taken: 52.66 seconds
INFO : Completed executing command(queryId=hive_20200502100428_9d4b8955-b84c-40be-a605-9ce19b4b7773); Time taken: 26.463 seconds

2. 找到對應的hiveserver2服務在哪台機器上。由於beeline是通過zookeeper隨機連接一個hiveserver2服務,所以從上一步的日誌中可以看到連接的是哪台機器上的hiveserver2服務。然後登錄到該台主機,通過netstat和ps命令找到對應的hiveserver2進程,從ps命令輸出的進程信息對應的命令行中,我們可以找到下麵的參數。

-Dhive.log.dir=/var/log/hive -Dhive.log.file=hiveserver2.log

上面的參數說明瞭hiveserver2服務對應的日誌名稱和路徑。這樣我們就可以找到hiveserver2服務對應的日誌,這是我們第二個步驟的日誌。從這個日誌里通過搜索關鍵字"callerId=<queryId>",<queryId>用上一步得到的真實的queryId替換(比如搜索"callerId=hive_20200502095816_888a7dba-4403-439d-a3a7-f6cdc280c18a")。我們將上面的4個queryId逐一用前述的關鍵字搜索,得到信息如下:

2020-05-02T10:00:30,440 INFO [Thread-536694]: client.TezClient (:()) - Submitting dag to TezSession, sessionName=HIVE-315802e2-f6e4-499d-a707-4d3057180abd, applicationId=application_1588062934554_53656, dagName=create temporary table ngdwt.rpt_to_etc_...t (Stage-1), callerContext={ context=HIVE, callerType=HIVE_QUERY_ID, callerId=hive_20200502095816_888a7dba-4403-439d-a3a7-f6cdc280c18a }

2020-05-02T10:00:57,229 INFO [Thread-536729]: client.TezClient (:()) - Submitting dag to TezSession, sessionName=HIVE-315802e2-f6e4-499d-a707-4d3057180abd, applicationId=application_1588062934554_53656, dagName=create temporary table ngdwt.rpt_to_etc_...t (Stage-4), callerContext={ context=HIVE, callerType=HIVE_QUERY_ID, callerId=hive_20200502095816_888a7dba-4403-439d-a3a7-f6cdc280c18a }

2020-05-02T10:03:22,043 INFO [Thread-537002]: client.TezClient (:()) - Submitting dag to TezSession, sessionName=HIVE-315802e2-f6e4-499d-a707-4d3057180abd, applicationId=application_1588062934554_53656, dagName=create temporary tabl...ov_in,a.statis_date (Stage-1), callerContext={ context=HIVE, callerType=HIVE_QUERY_ID, callerId=hive_20200502100121_5752f019-a6e2-463c-b413-a80bbe518a5c }

2020-05-02T10:07:39,627 INFO [Thread-537495]: client.TezClient (:()) - Submitting dag to TezSession, sessionName=HIVE-315802e2-f6e4-499d-a707-4d3057180abd, applicationId=application_1588062934554_53656, dagName=insert into ngdwt.rpt_to_etc_rece_d(re...t (Stage-1), callerContext={ context=HIVE, callerType=HIVE_QUERY_ID, callerId=hive_20200502100428_9d4b8955-b84c-40be-a605-9ce19b4b7773 }

可以看到第1個queryId用關鍵字"callerId=<queryId>"去搜索沒有搜到信息,因為對應的第一個sql語句是ddl語句,不會向yarn提交程式(但是僅用"<queryId>"去搜索還是能搜到信息),後面第二個queryId搜索出來有2行,其他queryId只有1行。

可以看到這些queryId(hive命令輸出信息)或者callerId(hiveserver2.log日誌信息)對應的hive session和yarn application是同一個:
sessionName=HIVE-315802e2-f6e4-499d-a707-4d3057180abd
applicationId=application_1588062934554_53656

也就是說,同一個hsql文件中的不同SQL語句對應的是同一個hive session以及同一個yarn application.

來看下yarn web管理頁面中該application的截圖。

 

 

可以看到上面頁面中的Name跟hiveserver2.log中的sessionName一致,Application Tags跟hiveserver2.log中的callerId(或者hive命令屏幕輸出信息中的queryId)一致。

而yarn ui2中的程式信息如下:

  

3. 找到了applicationId就比較好辦了,可以通過下麵的命令將yarn日誌從hdfs下載到本地(待yarn程式執行完畢)
yarn logs -applicationId application_1588062934554_53656 > application_1588062934554_53656.log

然後可以對application_1588062934554_53656.log做進一步的分析。
比如用關鍵字"Container: container_"搜索並去重排序後得到9個container的信息:
Container: container_e46_1588062934554_53656_01_000001 on hadoop19_45454_1588385301489
Container: container_e46_1588062934554_53656_01_000002 on hadoop31_45454_1588385300882
Container: container_e46_1588062934554_53656_01_000003 on hadoop40_45454_1588385301059
Container: container_e46_1588062934554_53656_01_000004 on hadoop27_45454_1588385300739
Container: container_e46_1588062934554_53656_01_000006 on hadoop36_45454_1588385301268
Container: container_e46_1588062934554_53656_01_000007 on hadoop57_45454_1588385301076
Container: container_e46_1588062934554_53656_01_000008 on hadoop22_45454_1588385301501
Container: container_e46_1588062934554_53656_01_000009 on hadoop31_45454_1588385300882
Container: container_e46_1588062934554_53656_01_000010 on hadoop21_45454_1588385301473

上面是該application對用的所有container.

 

或者用關鍵字"Assigning container to task:"搜索得到任務分配信息,其中container_e46_1588062934554_53656_01_000001因為是applicationmaster沒有任務分配信息,其他8個container都有任務分配信息,其中container_e46_1588062934554_53656_01_000008和container_e46_1588062934554_53656_01_000009有2條記錄,但attempt不同,表示這2個container里的任務之前有失敗的,分別進行了2次嘗試。為了簡潔起見,這裡僅列出搜索出來的第一條記錄:

2020-05-01 22:00:40,603 [INFO] [DelayedContainerManager] |rm.YarnTaskSchedulerService|: Assigning container to task: containerId=container_e46_1588062934554_53656_01_000002, task=attempt_1588062934554_53656_1_00_000000_0, containerHost=hadoop31:45454, containerPriority= 11, containerResources=<memory:12288, vCores:1>, localityMatchType=RackLocal, matchedLocation=/default-rack, honorLocalityFlags=false, reusedContainer=false, delayedContainers=3

因為現在的Hive的執行引擎不再是mr,而是改成了tez,目前我對tez並不太熟悉,只是理解它為mr的升級版,在原來的map/reduce操作上增加了DAG,不同job之間的數據傳遞不必寫到HDFS,而是類似數據流的方式,減少了中間環節,提升了效率。對於一個Tez程式,類似於MR程式的MRAppMaster和YarnChild進程,它會產生DAGAppMaster和TezChild進程,前者是master負責管理整個程式以及申請資源,後者是slave,負責執行具體的計算任務。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先我們需要準備好我們將會用到的東西:VMware12、RHEL7.0 網址我就不放了,大家自行百度喲。 一、安裝VMware 我們需要安裝VMware Workstation虛擬軟體包進行模擬電腦硬體,我們以VMware12Pro為例安裝,這是學習新知識的第一步。 等待它讀完進度條完成軟體安裝的準 ...
  • 我們在日常使用 UbuntuServer 伺服器時,經常會直接使用基於 ssh 的 sftp 連接伺服器直接進行文件上傳和下載,不過這個方式其實有一定的安全隱患,當一個團隊有多個人員,需要連接伺服器去發佈時,如果使用 ssh 則意味著需要將系統的 賬戶和密碼 告知對方,別人就不僅擁有了 sftp 的 ...
  • 【目錄】 一、存儲引擎 二、數據類型 1、整型 2、點型 3、字元類型 4、日期類型 5、枚舉與集合類型 三、約束條件 參考資料: https://zhuanlan.zhihu.com/p/113334455 ...
  • 【目錄】 1、將MySQL服務 製作成windows服務 2、設置密碼 3、忘記密碼(破解密碼) 【Windows系統】 1、將MySQL服務 製作成windows服務(即 可以開機自啟動) 補充:cmd 1 如何查看當前具體進程tasklisttasklist |findstr mysqld 2 ...
  • 多年開發實踐中遇到的DB相關的話題研究和整理,不介紹DB的基本概念,也不過於深入DB原理,以滿足日常應用、知其然知其所以然為準。 包含十幾個子話題,含事務傳播性、索引優化、拆分、FailOver等。 ...
  • MySQL學習筆記 2020/5/4 一、 資料庫的相關概念 資料庫的好處 1.1 能夠永久性的保存數據,實現數據持久化 1.2 可以實現結構化查詢,方便管理 2.資料庫相關概念 2.1資料庫(DB->database):存儲一組有組織的數據的容器 2.2 資料庫管理系統(DBMS->databas ...
  • 二、mysql安裝及啟動 1、mysql安裝方式介紹 2、mysql安裝 3、客戶端程式連接到MySQL方式 4、mysql 的SQL層處理: 5、mysql常用命令 6、清理不常用的資料庫 ...
  • 一、資料庫介紹 1、關係型資料庫的特點 ​ 二維表 典型產品Oracle傳統企業,MySQL是互聯網企業 數據存取是通過SQL 最大特點,數據安全性方面強(ACID) 2、NoSQL:非關係型資料庫(Not only SQL) ​ 不是否定關係型資料庫,做關係型資料庫的的補充。 3、web1.0時代 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...