摘要:Hive數(shù)據(jù)倉庫技術(shù)是高職院校中大數(shù)據(jù)技術(shù)相關(guān)專業(yè)的核心課程之一。為了更好地幫助學(xué)生學(xué)習(xí)、理解課程內(nèi)容,在教學(xué)實踐過程中匯總積累了學(xué)生在各個階段的實操過程中存在的典型問題案例,從學(xué)生角度出發(fā),追溯問題案例根源,為課程設(shè)計的更新優(yōu)化提供參考。
關(guān)鍵詞:Hive;數(shù)據(jù)倉庫技術(shù);高職學(xué)生;案例分析;大數(shù)據(jù)技術(shù)
中圖分類號:G642 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2024)32-0156-03 開放科學(xué)(資源服務(wù))標(biāo)識碼(OSID) :
0 引言
隨著大數(shù)據(jù)時代的到來,數(shù)據(jù)倉庫技術(shù)已成為企業(yè)數(shù)據(jù)存儲、分析、預(yù)測的重要工具之一[1]。Hive作為一種基于Hadoop分布式系統(tǒng)的數(shù)據(jù)倉庫工具,因其強(qiáng)大的海量數(shù)據(jù)處理和數(shù)據(jù)分析能力,在大數(shù)據(jù)分析領(lǐng)域中的熱度一直居高不下,也備受企業(yè)青睞[2]。為了適應(yīng)大數(shù)據(jù)技術(shù)的發(fā)展趨勢,高職院校紛紛開設(shè)Hive數(shù)據(jù)倉庫技術(shù)這門課程,旨在讓學(xué)生理解并掌握Hive的基本原理、核心操作及其應(yīng)用方法,為學(xué)生未來從事大數(shù)據(jù)相關(guān)工作打下堅實基礎(chǔ)。相比于MySQL、SQL Server等常用數(shù)據(jù)庫工具在高職院校中多年的使用基礎(chǔ),Hive在高職院校的引入和教學(xué)面臨一些特殊的挑戰(zhàn)和差異,尤其是Hive的教學(xué)需要包含Hadoop分布式生態(tài)的基礎(chǔ)原理、Hive的架構(gòu)、海量數(shù)據(jù)清洗、數(shù)據(jù)分析等多個方面的內(nèi)容,相對于傳統(tǒng)關(guān)系型數(shù)據(jù)庫更加復(fù)雜和深入。本文基于高職學(xué)生的學(xué)習(xí)特點,針對Hive數(shù)據(jù)倉庫技術(shù)在實際教學(xué)實踐過程中出現(xiàn)的典型問題案例,進(jìn)行分析討論,幫助學(xué)生更好地理解和掌握Hive 數(shù)據(jù)倉庫技術(shù),提升專業(yè)水平。
1 問題案例分析
在高等職業(yè)教育中,Hive數(shù)據(jù)倉庫技術(shù)課程應(yīng)基于高職學(xué)生的實際需求、未來職業(yè)發(fā)展的導(dǎo)向以及教學(xué)過程中的有效性。在教學(xué)過程中,需緊密貼合實際應(yīng)用,強(qiáng)調(diào)Hive在實際項目開發(fā)中的應(yīng)用和操作[3],避免過于理論化或脫離實際的教學(xué)內(nèi)容,確保學(xué)生能夠?qū)W以致用。以下分別從Hive的環(huán)境配置、Hive的部署、數(shù)據(jù)庫與數(shù)據(jù)表的定義、查詢、自定義函數(shù)、優(yōu)化等6個教學(xué)內(nèi)容進(jìn)行典型問題案例展示,通過分析學(xué)生在實踐中所出現(xiàn)的共性問題,動態(tài)優(yōu)化課程設(shè)計、更新教學(xué)方法。
1.1 Hive 環(huán)境配置問題案例
Hive是建立在Hadoop之上的數(shù)據(jù)倉庫工具,利用Hadoop 的分布式存儲和計算能力來處理海量數(shù)據(jù)。因此,Hive的環(huán)境配置需要嚴(yán)格遵守Hadoop生態(tài)模型[4]。對于初學(xué)者來說,Hadoop的安裝和配置具有一定挑戰(zhàn)性,需要提前學(xué)習(xí)實踐,夯實基礎(chǔ)。下面列舉Hive在安裝配置中的常見問題。
(1) 虛擬機(jī)的網(wǎng)絡(luò)配置。Hadoop 的部署需要在Linux系統(tǒng)運行,因此需要提前準(zhǔn)備虛擬機(jī),課程中采用VMware軟件作為虛擬機(jī)的載體。部分學(xué)生在配置虛擬機(jī)的過程中,無法在虛擬機(jī)中聯(lián)網(wǎng),這是虛擬機(jī)的網(wǎng)絡(luò)配置錯誤導(dǎo)致。正確的做法應(yīng)該是網(wǎng)絡(luò)適配器設(shè)置中選擇NAT模式,依次填寫子網(wǎng)IP、子網(wǎng)掩碼和網(wǎng)關(guān)IP,保存設(shè)置后即可聯(lián)網(wǎng),在虛擬機(jī)中輸入“ping www.baidu.com”,若顯示如圖1中的結(jié)果,則表示聯(lián)網(wǎng)成功。
(2) 虛擬機(jī)的克隆與時間同步。Hadoop完全分布式集群至少需要三臺虛擬機(jī),因此,需要對虛擬機(jī)進(jìn)行底層克隆操作,構(gòu)建三臺虛擬機(jī)。很多學(xué)生在克隆虛擬機(jī)的過程中,沒有同步時間,導(dǎo)致集群存在數(shù)據(jù)不一致、任務(wù)調(diào)度等問題。可分別在三臺虛擬機(jī)中執(zhí)行“ntpdate ntp4.aliyun.com”命令,同步集群時間,保持集群中節(jié)點的一致性。
(3) JDK的安裝。Hadoop集群需要Java環(huán)境來運行,若沒有在Liunx中安裝Java環(huán)境,則無法部署Ha?doop集群。少部分學(xué)生因忘記安裝JDK,導(dǎo)致Hadoop 集群啟動失敗。正確做法是從Java官網(wǎng)中下載JDK 安裝包,在Linux環(huán)境中完成安裝,并配置環(huán)境變量。
在三臺虛擬機(jī)中輸入代碼“java -version”,若出現(xiàn)如圖2中的Java版本,則JDK配置成功。
(4) HDFS的初始化。在第一次使用Hadoop集群之前,需要對Hadoop中的HDFS組件進(jìn)行初始化,以創(chuàng)建Hadoop集群中必要的目錄結(jié)構(gòu)和配置信息。有學(xué)生沒有進(jìn)行初始化就開啟Hadoop,終端中提示系統(tǒng)錯誤,無法開啟集群。還有學(xué)生在HDFS集群開啟的情況下進(jìn)行初始化操作,導(dǎo)致數(shù)據(jù)丟失或損壞。正確做法應(yīng)該如下所示:
① 找到Hadoop 安裝路徑中的bin 目錄,并進(jìn)行定位。
② 確保當(dāng)前Hadoop集群處于關(guān)閉的基礎(chǔ)上,在bin目錄下,執(zhí)行命令“HDFS namenode -format”,此命令會格式化HDFS的名稱節(jié)點(NameNode) ,清空已存在的HDFS數(shù)據(jù)。
③ 在HDFS 名稱節(jié)點格式化完成后,執(zhí)行命令“start-all.sh”,啟動Hadoop進(jìn)程。
需要注意的是,少部分學(xué)生對Hadoop分布式技術(shù)使用不熟練,導(dǎo)致Hive環(huán)境配置任務(wù)進(jìn)程緩慢,對于此類學(xué)生,需要積極關(guān)注,引導(dǎo)其“笨鳥先飛”,打好良好的學(xué)習(xí)基礎(chǔ)。Hive的執(zhí)行過程需要在Hadoop生態(tài)的基礎(chǔ)上進(jìn)行,若學(xué)生沒有吃透Hadoop的基本原理,后續(xù)的實踐學(xué)習(xí)將舉步維艱。
1.2 Hive 部署問題案例
(1) Hive啟動失敗。有許多學(xué)生在嚴(yán)格執(zhí)行Hive 環(huán)境配置流程后仍無法啟動Hive,檢查其虛擬機(jī)后,發(fā)現(xiàn)Hadoop集群尚未啟動。因Hive的運行必須基于Hadoop生態(tài),因此需要在執(zhí)行Hive之前部署Hadoop 集群。在虛擬機(jī)中輸入“start-all.sh”命令開啟Hadoop 集群中的HDFS組件與yarn組件。以主節(jié)點為例,若出現(xiàn)如圖3中的組件信息,則此時可順利啟動Hive。
(2) 防火墻影響Hive正常啟動。少數(shù)學(xué)生在啟動Hive時,明明之前能夠成功使用,突然啟動失敗。究其原因,發(fā)現(xiàn)是虛擬機(jī)防火墻的攔截所致。在啟動Hive之前,要確保Hive所在的服務(wù)器或Hadoop集群的防火墻允許設(shè)置Hive運行所需通信,可以通過打開特定的端口(如HiveServer2的端口)以允許遠(yuǎn)程連接。同時,也需要保證Hive能夠與其他系統(tǒng)進(jìn)行通信,如Hadoop集群、MySQL數(shù)據(jù)庫等,防止因連接受阻導(dǎo)致Hive無法正常啟動。
(3) 元數(shù)據(jù)問題。Hive使用元數(shù)據(jù)服務(wù)(metastore) 來存儲數(shù)據(jù)庫、數(shù)據(jù)表等元數(shù)據(jù)信息。若metastore服務(wù)未正確配置或啟動,可能導(dǎo)致Hive無法正常工作。目前hive中自帶的metastore為derby,但derby并不穩(wěn)定,因此許多學(xué)生在使用過程中,常常出現(xiàn)hive崩潰的情況。通常的解決方法是,將Hive自帶的derby數(shù)據(jù)庫,更換為更加穩(wěn)定的MySQL,利用MySQL的高可用性與高拓展性,可以確保數(shù)據(jù)的完整性和一致性。
1.3 Hive 數(shù)據(jù)庫與數(shù)據(jù)表的定義問題案例
Hive 中定義了簡單的類SQL 查詢語言,稱為HQL,它允許熟悉SQL的用戶查詢Hive中的數(shù)據(jù)。因HQL語句與SQL語句在語法上較為類似,因此學(xué)生在MySQL的學(xué)習(xí)基礎(chǔ)上,能夠較快上手。但Hive的執(zhí)行需要在Hadoop集群上將任務(wù)轉(zhuǎn)化為mapreduce作業(yè),和傳統(tǒng)關(guān)系型數(shù)據(jù)庫存在較大差異,因此在Hive中構(gòu)建數(shù)據(jù)庫、數(shù)據(jù)表也存在著一些新的問題,下面進(jìn)行列舉。
(1) 語法差異問題。HQL和SQL在語法上存在一些區(qū)別,許多學(xué)生習(xí)慣使用SQL語句查詢數(shù)據(jù)庫,將其硬套入HQL中,運行代碼提示報錯。在課程實踐過程中,整理學(xué)生所出現(xiàn)的此類問題,主要有以下幾個方面:
① 查詢對象不同。在SQL語句中,查詢的是數(shù)據(jù)庫中的表和表中的列;而在HQL語句中,所查詢的是對象與對象中的屬性。
② 關(guān)鍵詞大小寫敏感性。SQL語句對大小寫不敏感,因此在書寫過程中表名、字段名、關(guān)鍵詞可以自由組合;而HQL語句雖然對關(guān)鍵詞不敏感,但類名、屬性名需要區(qū)分大小寫。
③ 語法結(jié)構(gòu)差異。在SQL語句中,F(xiàn)ROM后面跟著的是表名,WHERE后面接的是表中的條件查詢;而在HQL語句中,F(xiàn)ROM 后跟的是類名+類的對象,而WHERE后面用對象的屬性作為條件。
根據(jù)上述典型問題,需要反復(fù)做針對性的實踐練習(xí),讓學(xué)生在編碼中理解SQL和HQL的語法差異內(nèi)容,減少類似錯誤的發(fā)生。
(2) 注釋亂碼問題。注釋屬于Hive元數(shù)據(jù)的一部分,存放在Hive的metastore庫(一般是MySQL) 中,如果metastore庫中的字符集不支持中文,就會導(dǎo)致Hive 的中文顯示亂碼。解決此問題,需要確保修改metas?tore庫的字符集為UTF-8,同時確保URL所連接的編碼也指定為UTF-8。
1.4 Hive 查詢操作問題案例
(1) 查詢語法錯誤。語法錯誤是學(xué)生在Hive學(xué)習(xí)過程中最常見的問題。如圖4所示,一位學(xué)生在使用select語句查詢多個字段時,在最后一個字段后多寫了一個逗號,造成代碼運行提示報錯。如圖5所示,一位學(xué)生在使用SUM()聚合函數(shù)時,沒有在GROUP BY 子句中指定此列,造成代碼運行提示報錯,正確做法是在字段后加上GROUP BY字句,并選擇需要聚合指定的列。
(2) 查詢速度緩慢。有多位學(xué)生在查詢過程中產(chǎn)生疑問,Hive作為海量數(shù)據(jù)的處理分析工具,其查詢速度并不快,甚至部分語句查詢效率低于MySQL。要搞清楚這個問題的解決方案,首先需要熟悉Hive查詢的基本原理。Hive查詢的基本原理是將HQL查詢轉(zhuǎn)換為mapreduce任務(wù),并在Hadoop集群上并行執(zhí)行。mapreduce在執(zhí)行過程中存在map切片和reduce合并兩個階段,需要花費一定時間,因此Hive主要用于海量數(shù)據(jù)的離線分析,在線查詢分析速度偏慢。如果要改善Hive查詢的速度,可以采用DISTRIBUTE BY和CLUSTER BY分組查詢語句,通過將數(shù)據(jù)均勻分布到不同的Reducer中,以減少因數(shù)據(jù)傾斜帶來的影響。
1.5 Hive 自定義函數(shù)問題案例
Hive 自定義函數(shù)(UDF, User-Defined Functions) 允許用戶獨立擴(kuò)展 Hive 的 SQL 功能,通過編寫具有指向性作用的函數(shù)來處理數(shù)據(jù)。UDF 可以用于數(shù)據(jù)格式轉(zhuǎn)換、字符串操作、數(shù)理計算等場景。由于MySQL中并沒有直接內(nèi)置UDF的概念,對于學(xué)生來說UDF是一個全新的知識點,因此許多學(xué)生在UDF的實際操作過程中出現(xiàn)較多問題,下面進(jìn)行典型問題案例的分析:
(1) 函數(shù)定義錯誤。許多學(xué)生在進(jìn)行UDF的定義時,所起函數(shù)名稱與已有的函數(shù)沖突,或者函數(shù)參數(shù)的類型定義發(fā)生錯誤,如有學(xué)生定義一個具有計算功能的UDF,起名為SUM(),因SUM()函數(shù)已經(jīng)是Hive當(dāng)中的內(nèi)置函數(shù),因此在定義時發(fā)生錯誤,如圖6所示。正確做法是在定義UDF時,選擇一個與已有函數(shù)不沖突的名稱。需要注意的是,在Hive中,函數(shù)的名稱是不區(qū)分大小寫的,所以禁止通過更改大小寫的方式規(guī)避已有的內(nèi)置函數(shù)名。
(2) JAR包管理問題。UDF的定義在Java中進(jìn)行,完成定義后,需要將 Java 代碼編譯成一個 JAR 文件,可以通過使用Maven、Gradle 等其他構(gòu)建工具來完成打包任務(wù),以確保 在JAR 文件中包含必要的依賴項。許多學(xué)生在操作過程中省略了此步驟,導(dǎo)致函數(shù)無法被定義及調(diào)用。因此,在Hive中使用UDF之前,必須確保所有依賴的庫或JAR包都已成功添加至Hive的類路徑中。
(3) 版本兼容性問題。如果UDF與當(dāng)前Hive版本的API或行為不兼容,也無法使用UDF。如果是UDF 依賴的庫版本與當(dāng)前系統(tǒng)安裝的庫版本發(fā)生沖突,導(dǎo)致UDF無法正常運行,解決方法是使用pip、conda或相應(yīng)的包管理工具更新或降級依賴庫到與UDF所兼容的版本,或在UDF的代碼中去指定一個依賴庫的版本,確保在不同環(huán)境中都能使用正確版本的庫。如果是Hive 運行環(huán)境不兼容,特別是在定義UDF時指定了某一個Hive的版本,需要升級或降級運行環(huán)境到與UDF兼容的版本。若無法更改當(dāng)前的運行環(huán)境版本,則嘗試修改UDF代碼以適應(yīng)當(dāng)前Hive版本的運行環(huán)境。
1.6 Hive 優(yōu)化問題案例
相比于傳統(tǒng)MySQL對于CPU、內(nèi)存和磁盤I/O的利用特點的優(yōu)化,Hive的優(yōu)化既包含Hive在建表的設(shè)計過程,對HQL語句自身的優(yōu)化,同時也包含Hive的配置參數(shù)和Hadoop生態(tài)中底層引擎mapReduce方面的調(diào)整[5]。這通常涉及mapReduce作業(yè)的初始化、數(shù)據(jù)傾斜問題的解決以及合理的分區(qū)與分桶策略等。這一塊內(nèi)容是Hive學(xué)習(xí)的難點,也是大部分學(xué)生在學(xué)習(xí)過程中的共性問題,下面對學(xué)生在實操過程中的普遍問題進(jìn)行講解。
(1) 數(shù)據(jù)傾斜問題。數(shù)據(jù)傾斜是Hive執(zhí)行中最常見的性能問題,它指的是某個Reduce任務(wù)處理的數(shù)據(jù)量遠(yuǎn)遠(yuǎn)超過其他任務(wù),導(dǎo)致在作業(yè)執(zhí)行過程中其他任務(wù)必須等待最大數(shù)據(jù)量任務(wù)結(jié)束后,才能順利完成作業(yè)。學(xué)生在執(zhí)行真實項目時,因數(shù)據(jù)樣本過多,加上對數(shù)據(jù)內(nèi)容不敏感,常常會導(dǎo)致數(shù)據(jù)傾斜問題,浪費大量運行時間。數(shù)據(jù)傾斜可能由key分布不均勻、null 值過多等原因?qū)е?。針對Hive中產(chǎn)生的數(shù)據(jù)傾斜問題,可以采取如下優(yōu)化策略:
① 數(shù)據(jù)預(yù)分區(qū)。根據(jù)key的分布情況對整個數(shù)據(jù)進(jìn)行預(yù)分區(qū),使得相同key的數(shù)據(jù)盡可能分布在同一節(jié)點上,從而減少跨節(jié)點數(shù)據(jù)的開銷。
② 空值處理。對于null值過多引起的數(shù)據(jù)傾斜問題,可以通過在查詢數(shù)據(jù)之前,對數(shù)據(jù)進(jìn)行預(yù)處理工作。通過將null值替換為某個特定值(如統(tǒng)一定義一個不存在的值),或者在查詢過程中就將包含空值的記錄過濾掉。
③ Salting技術(shù)。對于傾斜比較嚴(yán)重的key,可以在數(shù)據(jù)中添加上隨機(jī)數(shù)前綴(也稱為salting) ,讓原本傾斜的key分散到不同的reduce任務(wù)當(dāng)中。在reduce 階段中再刪除這些隨機(jī)數(shù)前綴,保持各任務(wù)中數(shù)據(jù)的分散性。
(2) 處理小文件問題。Hive在處理大量小文件數(shù)據(jù)時,由于每個小文件都需要一個Map任務(wù),因此會消耗大量mapreduce的資源。許多學(xué)生在操作過程中忽略了小文件數(shù)據(jù),直接調(diào)用mapreduce任務(wù),造成任務(wù)效率低下。此問題的優(yōu)化策略是當(dāng)目標(biāo)數(shù)據(jù)寫入Hive 之前,通過Hadoop 集群中的CombineFileInput?Format或者Hive中的merge()函數(shù)將小文件合并成大文件。
(3) Map和Reduce的任務(wù)數(shù)量問題。因Hive的任務(wù)執(zhí)行是依靠maprecude引擎,map和Reduce任務(wù)數(shù)的設(shè)置會直接影響Hive作業(yè)的執(zhí)行效率。如果任務(wù)數(shù)設(shè)置不合理,會導(dǎo)致系統(tǒng)資源浪費或性能下降。大部分學(xué)生在運行任務(wù)時,忽略此問題,常常導(dǎo)致在Map階段花費大量的時間進(jìn)行任務(wù)劃分,影響整體效率。正確的優(yōu)化策略是根據(jù)待處理數(shù)據(jù)的量合理設(shè)定任務(wù)數(shù),確保每個Map任務(wù)處理的數(shù)據(jù)量適中(每一個Map中的數(shù)據(jù)盡量不超過128M) 。
以上只是授課過程中常見的一些問題案例及其優(yōu)化策略,實際上Hive的優(yōu)化是一個復(fù)雜的過程,需要具體問題具體分析,根據(jù)具體的業(yè)務(wù)場景和目標(biāo)數(shù)據(jù)的特點進(jìn)行優(yōu)化和調(diào)整。
2 結(jié)論
Hive數(shù)據(jù)倉庫技術(shù)是實踐性、創(chuàng)新性很強(qiáng)的一門課程,課程內(nèi)容較為新穎,融合liunx系統(tǒng)、Hadoop集群等多門課程,需要教師合理地安排教學(xué)內(nèi)容、聚焦重難知識點。高職學(xué)生的基礎(chǔ)較為薄弱,但學(xué)習(xí)熱情較高,能夠以飽滿的熱情投入項目的開發(fā)過程中。然而,一旦遇到如上述問題,部分學(xué)生會產(chǎn)生挫敗感,知難而退,降低學(xué)習(xí)的熱情。還有少部分學(xué)生會鉆牛角尖,卡在某一個子任務(wù)中停滯不前,效率低下。因此對于Hive數(shù)據(jù)倉庫技術(shù)的教學(xué),需要及時跟進(jìn)學(xué)生在實踐過程中出現(xiàn)的各類問題,及時分析總結(jié)學(xué)生的共性問題案例,優(yōu)化課程設(shè)計與教學(xué)方法。本文分別從Hive的環(huán)境配置、Hive的部署、數(shù)據(jù)庫與數(shù)據(jù)表的定義、查詢、自定義函數(shù)、優(yōu)化等6個教學(xué)部分中出現(xiàn)的典型問題進(jìn)行了總結(jié),為Hive數(shù)據(jù)倉庫技術(shù)這門課的教學(xué)內(nèi)容、教學(xué)方法的有效改進(jìn)提供思路。
參考文獻(xiàn):
[1] 劉強(qiáng). 試論數(shù)據(jù)倉庫與大數(shù)據(jù)融合[J]. 電腦知識與技術(shù),2020,16(10):7-9.
[2] 王科《. 實戰(zhàn)HADOOP》課程教學(xué)改革與探索[J].電腦知識與技術(shù),2020,16(16):147-148.
[3] 云桂桂,杜彬,劉淑梅.三全育人背景下師生數(shù)據(jù)倉庫建設(shè)研究與實踐[J].中國管理信息化,2023,26(1):180-184.
[4] 張黎平,段淑萍,俞占倉.基于Hadoop的大數(shù)據(jù)處理平臺設(shè)計與實現(xiàn)[J].電子測試,2022(20):74-75,83.
[5] 荊忠航,張偉,王佳慧,等.面向Hive查詢的存儲優(yōu)化技術(shù)[J]. 北京信息科技大學(xué)學(xué)報(自然科學(xué)版),2021,36(6):93-100.
【通聯(lián)編輯:王力】
基金項目:2023 年度江蘇省教育科學(xué)規(guī)劃課題(重點課題)“高職院校SPOC 教學(xué)評價體系構(gòu)建研究”(課題編號:B/2023/02/114)