您好,登錄后才能下訂單哦!
HIVE作業(yè)管理分析及解決方案是什么,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
對于hive任務(wù)展示的時候需要把id和mr id關(guān)聯(lián), 殺死任務(wù)的時候需要把所有屬于這個hive語句的任務(wù)都?xì)⑺馈?/p>
Hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供類SQL查詢功能。 本質(zhì)是將SQL轉(zhuǎn)換為MapReduce程序
thrift是facebook開發(fā)的一個軟件框架,它用來進行可擴展且跨語言的服務(wù)的開發(fā),hive集成了該服務(wù),能讓不同的編程語言調(diào)用hive的接口。
兩者都允許遠(yuǎn)程客戶端使用多種編程語言,通過HiveServer或者HiveServer2,客戶端可以在不啟動CLI的情況下對Hive中的數(shù)據(jù)進行操作, 允許遠(yuǎn)程客戶端使用多種編程語言如java,python等向hive提交請求,取回結(jié)果(從hive0.15起就不再支持hiveserver了)。
HiveServer或者HiveServer2都是基于Thrift的,但HiveSever有時被稱為Thrift server,而HiveServer2卻不會。
既然已經(jīng)存在HiveServer,為什么還需要HiveServer2呢?
這是因為==HiveServer不能處理多于一個客戶端的并發(fā)請求==,這是由于HiveServer使用的Thrift接口所導(dǎo)致的限制,不能通過修改HiveServer的代碼修正。因此在Hive-0.11.0版本中重寫了HiveServer代碼得到了HiveServer2,進而解決了該問題。
HiveServer2支持多客戶端的并發(fā)和認(rèn)證,為開放API客戶端如JDBC、ODBC提供更好的支持。
命令行接口,CLI可以以兩種模式運行,一種是單純的客戶端,直接連接driver;還有一種是連接hiveserver1;hiveserver1已經(jīng)被hiveserver2取代,并在1.0.0版本去掉。因為安全性等原因,官方希望用beeline替代cli;或者直接修改cli的底層實現(xiàn)來達到無縫修改。 https://issues.apache.org/jira/browse/HIVE-10511 https://cwiki.apache.org/confluence/display/Hive/Replacing+the+Implementation+of+Hive+CLI+Using+Beeline
hive客戶端提供了一種通過網(wǎng)頁的方式訪問hive所提供的服務(wù)。這個接口對應(yīng)hive的hwi組件(hive web interface),使用前要啟動hwi服務(wù)。 ==hwi因為使用較少,2.2版本后被移除。==
通過Thrift協(xié)議與某個單獨的HiveServer2進程進行連接通信。
HiveServer2提供了一個新的命令行工具Beeline,它是基于SQLLine CLI的JDBC客戶端。
Beeline工作模式有兩種,即本地嵌入模式和遠(yuǎn)程模式。嵌入模式情況下,它返回一個嵌入式的Hive(類似于Hive CLI)。而遠(yuǎn)程模式則是通過Thrift協(xié)議與某個單獨的HiveServer2進程進行連接通信。
在開發(fā)工作當(dāng)中,提交 Hadoop 任務(wù),任務(wù)的運行詳情,這是我們所關(guān)心的,當(dāng)業(yè)務(wù)并不復(fù)雜的時候,我們可以使用 Hadoop 提供的命令工具去管理 YARN 中的任務(wù)。在編寫 Hive SQL 的時候,需要在 Hive 終端,編寫 SQL 語句,來觀察 MapReduce 的運行情況,長此以往,感覺非常的不便。另外隨著業(yè)務(wù)的復(fù)雜化,任務(wù)的數(shù)量增加,此時我們在使用這套流程,已預(yù)感到力不從心,這時候 Hive 的監(jiān)控系統(tǒng)此刻便尤為顯得重要,我們需要觀察 Hive SQL 的 MapReduce 運行詳情以及在 YARN 中的相關(guān)狀態(tài)。
Hive Falcon 用于監(jiān)控 Hadoop 集群中被提交的任務(wù),以及其運行的狀態(tài)詳情。其中 Yarn 中任務(wù)詳情包含任務(wù) ID,提交者,任務(wù)類型,完成狀態(tài)等信息。另外,還可以編寫 Hive SQL,并運 SQL,查看 SQL 運行詳情。也可以查看 Hive 倉庫中所存在的表及其表結(jié)構(gòu)等信息。
==不能將HIVE的查詢和yarn任務(wù)關(guān)聯(lián)在一起,不滿足需求。==
待確認(rèn)
待確認(rèn)
采用thrift方式實現(xiàn)。具體可以下載hue源代碼,apps/beeswax, 使用python實現(xiàn)。
此實現(xiàn)方式只能管理通過hue界面執(zhí)行的查詢,其他客戶端的查詢無法管理。 查詢和mapreduce的關(guān)聯(lián)關(guān)系是通過分析日志實現(xiàn)的,thrift沒有對應(yīng)的接口。 https://groups.google.com/a/cloudera.org/forum/#!topic/hue-user/wSDcTnZJqTg
日志
2017-04-26 13:54:24,068 INFO ql.Driver (Driver.java:compile(411)) - Compiling command(queryId=hadoop_20170426135454_41352e71-5685-48e5-9e4d-c25819669666): select count(*) from t_function 2017-04-26 13:54:26,891 INFO HiveMetaStore.audit (HiveMetaStore.java:logAuditEvent(388)) - ugi=hadoop ip=unknown-ip-addr cmd=get_table : db=default tbl=t_function 2017-04-26 13:54:37,444 INFO ql.Driver (Driver.java:compile(463)) - Semantic Analysis Completed 2017-04-26 13:54:37,677 INFO ql.Driver (Driver.java:getSchema(245)) - Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:_c0, type:bigint, comment:null)], properties:null) 2017-04-26 13:54:38,331 INFO ql.Driver (Driver.java:compile(541)) - Completed compiling command(queryId=hadoop_20170426135454_41352e71-5685-48e5-9e4d-c25819669666); Time taken: 14.712 second s 2017-04-26 13:54:38,332 INFO ql.Driver (Driver.java:execute(1448)) - Executing command(queryId=hadoop_20170426135454_41352e71-5685-48e5-9e4d-c25819669666): select count(*) from t_function 2017-04-26 13:54:38,334 INFO ql.Driver (SessionState.java:printInfo(927)) - Query ID = hadoop_20170426135454_41352e71-5685-48e5-9e4d-c25819669666 2017-04-26 13:54:38,335 INFO ql.Driver (SessionState.java:printInfo(927)) - Total jobs = 1 2017-04-26 13:54:38,516 INFO ql.Driver (SessionState.java:printInfo(927)) - Launching Job 1 out of 1 2017-04-26 13:55:24,615 INFO exec.Task (SessionState.java:printInfo(927)) - Starting Job = job_1493083994846_0010, Tracking URL = http://T-163:23188/proxy/application_1493083994846_0010/ 2017-04-26 13:55:24,860 INFO exec.Task (SessionState.java:printInfo(927)) - Kill Command = /opt/beh/core/hadoop/bin/hadoop job -kill job_1493083994846_0010
未發(fā)現(xiàn)完全實現(xiàn)該功能的開源方案,接下來需要看看有沒有其他人干過類似的事,并發(fā)了相關(guān)文章。
目前數(shù)據(jù)平臺使用Hadoop構(gòu)建,為了方便數(shù)據(jù)分析師的工作,使用Hive對Hadoop MapReduce任務(wù)進行封裝,我們面對的不再是一個個的MR任務(wù),而是一條條的SQL語句。數(shù)據(jù)平臺內(nèi)部通過類似JDBC的接口與HiveServer進行交互,僅僅能夠感知到一條SQL的開始與結(jié)束,而中間的這個過程通常是漫長的(兩個因素:數(shù)據(jù)量、SQL復(fù)雜度),某些場景下用戶需要了解這條SQL語句的執(zhí)行進度,從而為我們引入以下幾個問題:
(1)通過JDBC接口執(zhí)行一條SQL語句時,這條SQL語句被轉(zhuǎn)換成幾個MR任務(wù),每個MR任務(wù)的JobId是多少,如何維護這條SQL語句與MR任務(wù)的對應(yīng)關(guān)系?
(2)如何獲取MR任務(wù)的運行狀態(tài),通過JobClient?
(3)通過HiveServer是否可以獲取到上述信息?
http://www.cnblogs.com/yurunmiao/p/4224137.html
通過之前的調(diào)研發(fā)現(xiàn),不管是開源項目還是其他網(wǎng)絡(luò)資料,大多數(shù)需求只實現(xiàn)了特定情況下的hive查詢與yarn任務(wù)之間的對應(yīng), 多數(shù)還是在log上做文章,通過分析hive產(chǎn)生的日志來獲得查詢和yarn任務(wù)的關(guān)系。
種種跡象表明,情況不太樂觀,遇到硬茬了;想做一種兼容所有執(zhí)行方式的查詢管理工具,有比較大的難度,需要深入到源代碼去了解。
所有查詢方式
graph LR Hue-->Thrift Thrift-->Driver CLI-->Driver HWI-->Driver Beeline-->Driver Beeline-->Thrift
HWI方式官方將在2.2版本后去掉,且使用率不高,暫不支持。
Thrift方式支持多客戶端的并發(fā)和認(rèn)證,官方建議采用這種方式,故Beeline只支持Thrift使用方式。
CLI雖然不通過Thrift,但因為現(xiàn)在的項目用的比較多,考慮支持。
通過以上分析,我們要支持的訪問方式如下。
支持查詢方式
graph LR Hue-->Thrift Thrift-->Driver CLI-->Driver Beeline-->Thrift
通過上述分析,我們得出我們的研究方向,并確定了研究方案。 主要分兩部分,CLI模式任務(wù)管理和Thrift模式任務(wù)管理。
我們知道,cli模式下,我們一次只能執(zhí)行一條查詢,查詢執(zhí)行過程中,我們可以通過ctrl+c來終止查詢。 ctrl+c是給進程發(fā)送sig_int中斷信號。
通過閱讀源碼我們發(fā)現(xiàn),中斷信號的處理在processLine函數(shù)中觸發(fā),該函數(shù)為處理單條命令。 http://blog.csdn.net/lpxuan151009/article/details/7956518 注: 源碼為hive1.1分支,其中hive-cli工程即為CLI的對應(yīng)工程。 入口類為org.apache.hadoop.hive.cli.CliDriver。
if (allowInterrupting) { // Remember all threads that were running at the time we started line processing. // Hook up the custom Ctrl+C handler while processing this line interruptSignal = new Signal("INT"); oldSignal = Signal.handle(interruptSignal, new SignalHandler() { private final Thread cliThread = Thread.currentThread(); private boolean interruptRequested; @Override public void handle(Signal signal) { boolean initialRequest = !interruptRequested; interruptRequested = true; // Kill the VM on second ctrl+c if (!initialRequest) { console.printInfo("Exiting the JVM"); System.exit(127); } // Interrupt the CLI thread to stop the current statement and return // to prompt console.printInfo("Interrupting... Be patient, this might take some time."); console.printInfo("Press Ctrl+C again to kill JVM"); // First, kill any running MR jobs HadoopJobExecHelper.killRunningJobs(); TezJobExecHelper.killRunningJobs(); HiveInterruptUtils.interrupt(); } }); }
至此,CLI查詢的終止操作我們已經(jīng)通過進程和源代碼兩種方式獲取到, 此種任務(wù)管理的任務(wù)解決方案見六。
執(zhí)行流程
graph LR processCmd-->processLocalCmd processLine-->processCmd executeDriver-->processLine run-->executeDriver main-->run
processLocalCmd
Driver qp = (Driver) proc; PrintStream out = ss.out; long start = System.currentTimeMillis(); if (ss.getIsVerbose()) { out.println(cmd); } qp.setTryCount(tryCount); ret = qp.run(cmd).getResponseCode(); if (ret != 0) { qp.close(); return ret; }
查詢實際執(zhí)行的地方,可以在此處將執(zhí)行相關(guān)信息輸出,輸出方式可選擇log方式或者數(shù)據(jù)庫,也可選擇rpc(rpc方式)
相比較而言,CLI的任務(wù)管理相對簡單,因為每個CLI只能執(zhí)行一個查詢; 而Thrift模式則支持并發(fā),這里的Thrift模式我們指的是hiveserver2的實現(xiàn)方式。 通過Thrift模式,Hue,Beeline,Ambari等等客戶端均可以連接到hive執(zhí)行查詢?nèi)蝿?wù), 需要把這些查詢?nèi)蝿?wù)都統(tǒng)一管理起來。
Thrift連接
graph LR Hue-->hiveserver2 Beeline-->hiveserver2 Ambari-->hiveserver2 other-->hiveserver2
我們發(fā)現(xiàn),官方提供的thrift包主要實現(xiàn)的是一個連接所對應(yīng)的各種操作, 但并不包括連接間的信息;即連接間的信息并未提供外部接口。
下面為一段Thrift示例代碼,主要功能為建立一個連接后查詢hive的數(shù)據(jù)數(shù)據(jù)。
thrift示例代碼
TSocket tSocket = new TSocket("T-162", 10000); tSocket.setTimeout(20000); TTransport transport = tSocket; TBinaryProtocol protocol = new TBinaryProtocol(transport); TCLIService.Client client = new TCLIService.Client(protocol); transport.open(); TOpenSessionReq openReq = new TOpenSessionReq(); TOpenSessionResp openResp = client.OpenSession(openReq); TSessionHandle sessHandle = openResp.getSessionHandle(); TExecuteStatementReq execReq = new TExecuteStatementReq(sessHandle, "show databases"); TExecuteStatementResp execResp = client.ExecuteStatement(execReq); TOperationHandle stmtHandle = execResp.getOperationHandle(); TFetchResultsReq fetchReq = new TFetchResultsReq(stmtHandle, TFetchOrientation.FETCH_FIRST, 100); TFetchResultsResp resultsResp = client.FetchResults(fetchReq); List<TColumn> res=resultsResp.getResults().getColumns(); for(TColumn tCol: res){ Iterator<String> it = tCol.getStringVal().getValuesIterator(); while (it.hasNext()){ System.out.println(it.next()); } } TCloseOperationReq closeReq = new TCloseOperationReq(); closeReq.setOperationHandle(stmtHandle); client.CloseOperation(closeReq); TCloseSessionReq closeConnectionReq = new TCloseSessionReq(sessHandle); client.CloseSession(closeConnectionReq); transport.close();
通過查看源代碼我們發(fā)現(xiàn), 注: 源碼為hive1.1分支,其中hive-service工程即為hiveserver2的對應(yīng)工程。 Thrift類主要在org.apache.hive.service.cli.thrift包下。
session&operation管理
graph LR HiveServer2-->CLIService CLIService-->SessionManager SessionManager-->handleToSession SessionManager-->OperationManager OperationManager-->handleToOperation
SessionManager
private final Map<SessionHandle, HiveSession> handleToSession = new ConcurrentHashMap<SessionHandle, HiveSession>(); private final OperationManager operationManager = new OperationManager();
OperationManager
private final Map<OperationHandle, Operation> handleToOperation = new HashMap<OperationHandle, Operation>();
CLIService.cancelOperation
@Override public void cancelOperation(OperationHandle opHandle) throws HiveSQLException { sessionManager.getOperationManager().getOperation(opHandle) .getParentSession().cancelOperation(opHandle); LOG.debug(opHandle + ": cancelOperation()"); }
通過上述接口可知,只需要找到對應(yīng)操作的OperationHandle, 然后調(diào)用CLIService.cancelOperation即可。
operation&handler
graph LR SQLOperation-->ExecuteStatementOperation ExecuteStatementOperation-->Operation OperationHandle-->Handle
public abstract class Handle { private final HandleIdentifier handleId; public Handle() { handleId = new HandleIdentifier(); } public Handle(HandleIdentifier handleId) { this.handleId = handleId; } public Handle(THandleIdentifier tHandleIdentifier) { this.handleId = new HandleIdentifier(tHandleIdentifier); } public HandleIdentifier getHandleIdentifier() { return handleId; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((handleId == null) ? 0 : handleId.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (!(obj instanceof Handle)) { return false; } Handle other = (Handle) obj; if (handleId == null) { if (other.handleId != null) { return false; } } else if (!handleId.equals(other.handleId)) { return false; } return true; } @Override public abstract String toString(); }
可以通過handle id 進行查找。 需要通過thrift接口放出根據(jù)handle id停止operation的接口。
// CancelOperation() // // Cancels processing on the specified operation handle and // frees any resources which were allocated. struct TCancelOperationReq { // Operation to cancel 1: required TOperationHandle op_handle }
thrift cancle接口已有; 現(xiàn)在需要thrift的獲取所有operation的接口;用于展示 現(xiàn)在需要thrift的獲取所有session的接口;用于展示
cli程序沒有通信模塊,如果增加通信模塊修改較大,選擇定位進程并對進程發(fā)送中斷信號的方式取消查詢。
通過修改配置,將查詢log根據(jù)進程號進行細(xì)分,這樣就可以獲得查詢和進程號的關(guān)系。
當(dāng)想要殺死一個進程是,通過ssh給對應(yīng)主機的指定進程發(fā)送中斷信息即可。不能通過發(fā)送中斷信號來執(zhí)行,因為執(zhí)行查詢的用戶可能有很多,==只有root才能保證中斷發(fā)送成功==, 但是使用root權(quán)限會有安全問題,所有此處只能采用rpc方式進行。
具體rpc方案目前可選的為hadoop rpc形式或者thrift方式,輪詢心跳方式或者cs合集模式。
暫定輪詢心跳方式,IPC定時查詢命令,心跳間隔1分鐘。
工作量: 4-8工作日
因為cli方案的問題,所以最佳方案可能還是修改driver層。
日志格式
hive-hadoop-hive-T-162.log.2621@T-162 hive-hadoop-hive-T-162.log.28632@T-162 hive-hadoop-hive-T-162.log.362@T-162 hive-hadoop-hive-T-162.log.5762@T-162
增加thrift的獲取所有operation的接口,展示所有查詢;調(diào)用取消查詢接口殺死查詢。
工作量:4-8工作日
因為不管cli還是thrift方式,最終都要經(jīng)過driver層,所以在driver層修改,可以一站式解決所有問題。 但和上面兩種不同的是,上面兩種都只是在原有代碼上加了一層殼,基本沒有動核心代碼; 而driver層,則需要改動一定程度邏輯的代碼,難度有所增加。
看完上述內(nèi)容,你們掌握HIVE作業(yè)管理分析及解決方案是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。