如何找到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
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...