1. 程式人生 > 其它 >CDH升級到CDP大資料叢集碰到的問題解析

CDH升級到CDP大資料叢集碰到的問題解析

一、背景

  2019 年,Cloudera 與 Hortonworks 合併後,徹底完成了轉型。Cloudera 果斷宣佈,對 CDH 和 HDP 兩條產品線將僅支援到 2022 年。對於兩個產品高度重合的部分會做刪減和融合,結果就是推出新的資料平臺 CDP (Cloudera Data Platform)。2022 年後,原 CDH 和 HDP 使用者會被轉移到 CDP 上 。與CDH不同,CDP也將大資料相關的元件提生到了3.x版本。而改動最大的要數Hive元件了,而效能也比之前CDH引入的2.x的版本提升了很多。因此,現在資料量比較大的基金公司都已經將CDH升級到CDP列入了本年度計劃之內,下面針對使用CDP的hive過程中碰到的問題進行深度解析並給出解決方法。

二、使用Hive的3.x版本碰到的問題

2.1 Hive支援引擎的異同

  問題描述:CDP平臺設定mr或者spark引擎執行作業會失敗。

  引起原因:不同於CDH支援hive on mr 和hive on spark執行引擎,通過手動配置並引入tez元件也可以支援hive on tez執行引擎。CDP對hive的執行引擎進行了限制,預設只支援hive on tez執行引擎。設定mr引擎會報錯不支援。截圖如下:

 

圖2-1 設定mr引擎失敗

  設定hive on spark執行引擎,雖然可以設定,但是執行作業會報錯,並執行失敗

 

圖2-2 設定spark引擎執行作業失敗

  解決方法

:在向cdp大資料中平臺提交作業時,只使用hive on Tez執行引擎。

2.2 連線HiveServer2例項的異同

  問題描述:連線Hive的hiveserver2例項可以訪問全表,但是執行復雜sql,涉及到shuffle操作時,任務執行失敗。

引起原因:不同於CDH直接使用Hive的hiveserver2例項便可以操作hive。CDP需要安裝Hive、TEZ和Hive on Tez三個元件。Hive on Tez就像一座橋樑一樣,把Hive和TEZ兩個元件連線起來。

其中Hive和Hive on Tez有各自不同的hiveserver2例項和埠,比較坑的是Hive的hiveserver2和Hive on Tez的埠在CDP上預設都是一樣的,如果僅僅使用CDP預設的方式安裝,安裝沒有問題,使用起來的時候就會報埠衝突,需要修改Hive on Tez的hiveserver2的預設埠。並且連線Hive的hiveserver2例項時,並不能使用Tez引擎,如果執行的sql是全表掃描,沒以後shuffle操作,作業不會報錯;當涉及shuffle操作時就需要使用執行引擎進行資料處理了,此時會報錯沒有可用的執行引擎或者沒有處理許可權。

報錯截圖示例如下:

 

圖2-3直接使用Hive的示例報錯示意圖

因此,需要使用Hive on Tez的hivesever2例項才可以正常操作和處理Hive中的資料。而CDH中官方不支援Hive on Tez執行引擎,沒有這個問題。Hive的hiveserver2例項和Hive on Tez的hiveserver2埠對比如下:

 

圖2-4 hive和hive on tez的hiveserver2例項埠比較示意圖

  解決方法:連線hiveserver2例項時,使用Hive on Tez元件,不要使用Hive元件的例項。

2.3 設定Hive事物表引數的異同

  問題描述:不支援修改CDP的Hive的事物表引數hive.support.concurrency和hive.txn.manager。

  引起原因:不同於CDH,CDP大資料平臺使用的是Hive3.x的版本,hive從3.0版本以後,預設建立的表格都是事務表並支援修改和刪除功能,並且預設將事物表引數設定為固定預設值hive.support.concurrency=true;

和hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;使用Java程式連線hiveserver2,在執行sql時修改這兩個引數會直接報錯,不支援在sql執行時修改該引數。報錯檢視如下:

 

圖2-5 修改事物表引數報錯

  解決方法:不要修改事物表的相關引數,直接使用預設值即可。

2.4 Hive建立表型別的異同

  問題描述:Spark執行引擎不能直接操作Hive的內部事物表,通過Sparksql建立的都是外部表。

引起原因:不同於CDH,CDP大資料平臺hive預設建立的是內部事物表。Sparksql是沒有事物的概念,因此不能直接操作Hive的事物表。需要藉助第三方工具Quoble,通過Hive的acid方式讀寫Hive的事務表。CDP官方提供的Quoble有缺陷,直接整合到sparksql使用,可以讀寫表格資料,但是無法刪除表格。究其原因是因為Quoble在讀寫hive資料的時候通過hive的metastore開通的read鎖,但是操作表格結束後,沒有關閉該鎖,導致表格無法刪除。截圖如下:

 

圖2-6 sparksql讀寫表未關閉的hive讀鎖示意圖

  解決方法:在sparksql讀寫Hive的內部事物表時,需要整合Cloudera的jar包,同時設定spark.acid.start.local.txn=true;設定該引數相當於開啟了本地事務,sparksql會在作業執行完畢之後,關閉Hive的事務鎖。Spark-acid的原始碼截圖如下:

圖2-7 sparksql預設未使用local事務截圖

2.5 Hive設定任務執行佇列的異同

問題描述:使用mapred.job.queue.name引數設定cdp的任務執行佇列,不生效,yarn還是使用預設的default。

引起原因:不同於CDH使用mapred.job.queue.name引數可以設定mr或者spark的yarn任務執行佇列。CDP中預設使用的TEZ執行引擎有自己獨立的引數tez.queue.name來設定任務執行佇列。離線計算執行任務設定佇列示意圖如下:

 

圖2-8 設定tez的yarn任務執行佇列示意圖

  觀察CDP的yarn元件,任務佇列設定生效示意圖如下:

 

圖2-9 設定tez的yarn任務執行佇列示意圖

  解決方法:當使用hive on tez執行引擎時,使用tez特有的引數tez.queue.name來設定任務執行佇列。

2.6 Hive的count函式的異同

 問題描述:使用Sparksql寫入的資料,Sparksql使用count函式與Hive on Tez使用count函式統計的值不一致。

 引起原因:在CDP平臺中使用Hive on Tez執行引擎插入的資料,該引擎會統計資料量總數的變化並實時更新記錄。而通過其他引擎寫入的資料則沒有這個功能。Hive on Tez在執行count函式的時候沒有走shuffle過程,直接從統計的結果中獲取過來了統計結果。因此通過就會造成Sparksql寫入的資料通過select  count(*) from tableName;查出來的結果和Hive on tez查出的結果就不一樣。

解決方法:根據業務場景,如果有其他作業使用了非Hive on Tez執行引擎插入了資料;在使用“select count(*) from tableName;”語法時,可以先使用“analyze table tableName compute statistics;”語法對錶重新更新統計資訊,這樣重新統計後結果就是正確的了。

三、總結

  相對CDH而言,CDP的大資料元件都有很大的改動,各個大資料元件基本上都升級到了3.0以上的版本,需要具體瞭解各個元件比如Hive、Hadoop、Spark等新增的新特性才能更好的使用CDP。