溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hadoop測試方法有哪些

發(fā)布時間:2021-12-09 15:46:10 來源:億速云 閱讀:219 作者:iii 欄目:大數據

這篇文章主要介紹“Hadoop測試方法有哪些”,在日常操作中,相信很多人在Hadoop測試方法有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Hadoop測試方法有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、測試常見問題

1、reduce輸出文件,上傳文件,下載文件等操作的目的文件的刪除。

【現象】程序第一次運行還是成功的,數據和程序都沒有修改,同樣的命令,運行第二次的時候,怎么就失敗了呢?

【問題說明】由于hdfs文件系統沒有覆蓋寫的特性。對于reduce的輸出,本地上傳文件到hdfs上,下載hdfs文件到本地等操作,當目的文件已經存在,這些操作均會失敗。

【測試方法】對于具有上述操作的程序,一定要在程序運行前把對應的目的文件刪除,特別是具有多輪迭代程序的臨時目錄需要清楚。

2、HADOOP_HOME環(huán)境變量的設置

【現象】在自己獨自使用的測試機上,利用hadoop命令新建了一個目錄,并利用hadoop dfs –ls path命令能夠查看到該目錄存在,換到一個公用的機器上就找不到該目錄?

【問題說明】同一臺測試機器可能會有多個hadoop客戶端連接到多個不同的hadoop平臺。而當在shell命令行直接輸入hadoop命令時,系統默認是使用HADOOP_HOME下的hadoop客戶端。當HADOOP_HOME環(huán)境變量被別的用戶修改后,就會連接到別的hadoop平臺,當然就找不到所要的目錄:)。

【測試方法】當在程序中使用hadoop命令的時候,一定要指定hadoop命令的路徑,特別在rd提供的程序中,hadoop命令的路徑一定要可配。

3、Hadoop上程序輸入目錄的標準化

【現象】程序的輸入數據完全沒問題:文件路徑和格式均正確,為什么結果文件都為空呢?

【問題說明】對于多路輸入(即多種格式的輸入文件),rd進行設計程序的時候,常常會根據路徑名來進行文件類型的判斷,進而進行不同的操作。此時,當外界輸入的路徑名沒有標準化(比如存在:./a/,/a//b,/a/./b),map階段通過比較傳遞的路徑參數和map環(huán)境變量獲取的當前處理文件路徑來判斷當前處理的文件塊來自哪個目錄,結果會判斷當前處理的文件不來自任何輸入目錄,從而無法獲取輸入數據的類型。(當時針對這個問題排查很久,曾一度認為是hdfs的問題,最后通過查看程序源代碼才發(fā)現該問題)

【測試方法】出現該情況,首先查看該任務的監(jiān)控頁面: Map input records的輸入是否為0,若是為0,則需檢查輸入數據地址正確性。Map output records是否為0. Map output records代表map的輸出,若是為0,那么就是數據在map階段就被過濾掉,需要檢查輸入數據的格式正確性。然后查看Reduce input records是否為0,若rduece的輸入為0,那輸出肯定就為0了。

4、Hadoop副本任務對程序結果的影響

【現象】在reduce中生成的本地文件需要上傳到hdfs上。在上傳之前,為了避免目的文件存在而導致上傳失敗,需要先進行刪除操作,然后再上傳。所有的reduce任務都正常結束,可是結果文件偶爾會有缺失。而且是不能穩(wěn)定復現。

【問題說明】hadoop運行map,red任務的時候,為了防止單個task運行緩慢,拖累整個任務的完成時間,會對一些task啟用備奮task,即多個task運行同一份數據,當一個task運行完成后,系統自動kill掉備份task。這樣可能導致備份task被kill前,正確的文件上傳后,被備份任務刪除,導致最后結果文件的缺失。而該現象還不是穩(wěn)定復現。

【測試方法】對hdfs上的同一個文件,目錄進行操作時,一定要注意并行操作的干擾。特別當在reduce中進行hdfs操作的時候,一定要考慮到副本的影響(該問題比較隱蔽)。解決方案是:1,禁止平臺生成副本任務(可以配置啟動參數達到目的)。2,在一個統一的單機進行此類操作。比如,現在單機處理好環(huán)境,然后啟動mapred任務。

5、Reduce數據分桶不均

【現象】通過查看任務的監(jiān)控頁面發(fā)現有的reduce運行時間很短,而有的reduce運行時間很長。

【問題說明】既然利用hadoop的任務,處理的數據一定是大數據量的。簡單的hash映射分桶可能導致分桶不均,從而多個reduce處理的數據量差別很大。

【測試方法】當前hadoop任務處理的數據很多都上T,若是在處理這么大規(guī)模的數據,分桶不均,可能導致單個節(jié)點處理數據過大,導致性能降低,甚至可能導致內存超過閾值被平臺kill。因此在測試之前,一定要弄清楚,分桶的key和分桶函數是否會造成分桶不均。

6、worker資源分配的指定

【現象】每個task運行時間很短,集群資源很充足,可是任務運行時間卻很長。

【問題說明】當處理的數據量很大時,任務會被分成很多的task,而當任務啟動時,集群默認分配的worker會比較少,導致即使集群資源空閑,運行該任務的worker數仍然很少,運行結束時間延長。

【測試方法】若是處理的數據很大,在任務啟動的時候,一定要指定資源參數,否則按照系統默認值,分配的work會很少(在hy集群為50)。對于大數據量,該限制會大大降低性能。任務啟動的時候,可以通過監(jiān)控頁面,查看該任務運行的worker數。

7、單個worker內存限制

【現象】小數據量,測試通過,可是運行大數據,任務總是被平臺kill。

【問題說明】現在hadoop平臺對每個task運行時的內存進行了限制,默認是800M,當程序運行內存超過800M,平臺自動會kill該任務

【測試方法】針對該點測試有2種方法:1,在集群運行大數據量,被平臺kill后,查看日志,確認是因為內存超出被平臺kill。2,在本地運行mapred程序,查看程序內存占用。若是在800M左右,上線就會有很大風險。

8、MPI程序對hadoop上文件目錄的操作

【現象】在mpi節(jié)點上對同一目錄上的文件進行操作,偶爾會失敗。

【問題說明】該問題同Hadoop副本任務對程序結果的影響 原因一樣,都多個節(jié)點對hadoop上同一個文件的操作。只是一個是hadoop上,一個是mpi上。

【測試方法】多個地方對hdfs上的同一個文件或者目錄進行操作。特別是同一個模塊即在hadoop,又在mpi集群上運行。不要在每個mpi節(jié)點同時對同一個hadoop目錄或者文件進行修改操作。

9、對于map reduce的運行參數的設置

【現象】程序在本地就能執(zhí)行成功,可是在hadoop上卻無法運行

【問題說明】有時候,map reduce的運行參數比較長,為了閱讀方便,rd可能會對程序參數進行折行,添加tab鍵排版,這樣反倒使hadoop上解析命令失敗。

【測試方法】對于map reduce的運行參數比較長的情況,可以督促rd用shell變量進行設置。然后在hadoop程序啟動參數用shell變量進行替換。即閱讀方便,又不會出錯。

10、Hadoop程序的結果使用的bistreaming的二進制文件結果

【現象】程序結果文件是二進制格式,可是下載到本地,按照詳細設計中描述的格式,解析格式總是錯誤。

【問題說明】當前流模式可以用streaming和bistreaming,當使用bistreaming時,生成的結果文件是hadoop的 sequence file文件格式,文件格式中含有key length和value length信息。在hadoop上使用該數據時,這個格式對用戶是透明的。下載到本地后,就不能直接使用了。

【測試方法】當任務的輸出outputformat=SequenceFileAsBinaryOutputFormat 時,可以使用hadoop dfs -copySeqFileToLocal –ignoreLen命令,把二進制數據下載到本地,并去掉長度信息,就和文檔中寫的格式一致了。

11、Hadoop對于輸入文件的切分

【現象】輸入文件是基于session的query日志行,session之間空行分割。當設置一個map的時候,程序結果正確,當設置多個map時,運行結果錯誤。

【問題說明】hadoop對于輸入文件會以行為最小單元切分,因此,當輸入以空行為分割,有二次數據格式的時候,hadoop無法保證不把一個session切到兩個map task中。這樣就把一個session拆分為多個session了。

【測試方法】當程序實現邏輯依賴于比行粒度更大的單元時,需要設置map的切分大小比單個輸入文件大,否則就回出現把輸入文件切分成多個map輸入,導致切斷更大的輸入單元。

二、常用測試方法

1、跨集群拷貝或者大數據量集群內拷貝

在測試過程中,可能需要從摸個集群或者某個目錄拷貝大量測試數據,若是先把數據拷貝到本地,在上傳到目的集群,將會非常的耗時間,這時,可以考慮用distcp命令。

DistCp(分布式拷貝)是用于大規(guī)模集群內部和集群之間拷貝的工具。它使用Map/Reduce實現文件分發(fā),錯誤處理和恢復,以及報告生成。 它把文件和目錄的列表作為map任務的輸入,每個任務會完成源列表中部分文件的拷貝。

hadoop distcp hdfs://nn1:8020/foo/bar hdfs://nn2:8020/bar/foo這條命令會把nn1集群的/foo/bar目錄下的所有文件或目錄名展開并存儲到一個臨時文件中,這些文件內容的拷貝工作被分配給多個map任務, 然后每個TaskTracker分別執(zhí)行從nn1到nn2的拷貝操作。注意DistCp使用絕對路徑進行操作。

由于distcp無法指定兩個用戶名和密碼,因此,拷貝的源和目的集群的用戶名和密碼必須一致,且該用戶名密碼在源集群具有讀權限,在目的集群具有寫權限。

2、單機模擬分布式測試功能點

在測試部分功能點時或者內存不超過800M的性能時,可能會考慮到先用單機模擬分布式上運行進行測試:

cat input | mapper | sort | reducer > output

在用單機模擬分布式測試時,有以下注意點:

1)Streaming的輸入是按行劃分的文本,可以使用cat input即可;但是BiStreaming是“<key-length><key><value- length><value>”的格式,所以在輸入前要進行一定的處理;常用方法是:

cat input | ./ reader |./mapper |./ reducer >output

reader程序負責將文件轉化為mapper程序能夠識別的keyLength, key, valueLength, value的二進制格式。當輸入已經是sequencefile格式時,也不需要reader。

2)當Mapper或Reducer中使用到hadoop的環(huán)境變量時,單機模擬時,需要先修改這些環(huán)境變量或者在運行時設置這些環(huán)境變量的值。

3、分布式程序和單機程序結果的對比

在校驗分布式程序結果時,我們常常使用的方法是,實現一個單機版的程序,然后diff單機版和分布式版本的運行結果。

由于hadoop對于輸入文件的切分,以及map后的reduce分桶。在和單機版做結果對比時,需要考慮到輸入行亂序對于結果的影響。若輸入行的亂序對結果的正確性沒有影響。那在做分布式的結果和本地單機模擬的結果diff時,一定要先sort,然后在diff。

4、總控腳本的測試

分布式程序雖然以map-reduce程序為主體,但每一輪map-reduce任務都是在單機用腳本進行任務提交和啟動,大多數項目都包含多輪map-reduce 任務。因此,各輪任務之間的調度協調和項目的系統運行就需要總控腳本來完成。

在測試總控腳本的時候,用-x參數運行,并把運行l(wèi)og重定向到輸出文件。運行介紹后,即使結果正確,也需要看看運行腳本的log,很可能發(fā)現一些意想不到的問題。

到此,關于“Hadoop測試方法有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI