命令列工具可以比Hadoop叢集快235倍 - Adam Drake

banq發表於2022-03-08

當我在瀏覽網頁和趕上一些我定期訪問的網站時,我發現了一篇來自Tom Hayden的很酷的文章,關於使用亞馬遜彈性Map Reduce(EMR)和mrjob來計算他從millionbase檔案館下載的國際象棋遊戲的一些輸贏比率的統計資料,並且總體上對EMR感到有趣。由於資料量只有大約1.75GB,包含大約200萬個棋譜,我對使用Hadoop來完成這個任務持懷疑態度,但我可以理解他使用mrjob和EMR來學習和娛樂的目的。因為這個問題基本上只是看每個檔案的結果行,並彙總不同的結果,所以似乎非常適合用shell命令進行流處理。我試了一下,對於同樣的資料量,我能夠用我的膝上型電腦在大約12秒內得到結果(處理速度大約為270MB/秒),而Hadoop的處理則需要大約26分鐘(處理速度大約為1.14MB/秒)。

在報告了用叢集中的7臺c1.medium機器處理資料所需的時間為26分鐘後,湯姆說:

這可能比在我的機器上序列執行要好,但可能還不如我在本地做一些巧妙的多執行緒應用好。

這絕對是正確的,儘管即使是序列處理也可能勝過26分鐘。雖然湯姆做這個專案是為了好玩,但人們經常使用Hadoop和其他所謂的大資料(tm)工具來進行現實世界的處理和分析工作,而這些工作可以用更簡單的工具和不同的技術來更快地完成。

一種特別未被使用的資料處理方法是使用標準的外殼工具和命令。這種方法的好處是巨大的,因為用shell命令建立一個資料管道意味著所有的處理步驟都可以並行完成。這基本上就像在你的本地機器上擁有你自己的風暴叢集。甚至連Spouts、Bolts和Sinks的概念也轉移到shell管道和它們之間的命令。你可以很容易地用基本命令構建一個流處理管道,與許多現代大資料(TM)工具相比,它將具有非常好的效能。

另外一點是批處理與流分析方法。湯姆在文章的開頭提到,在載入10000個遊戲並在本地進行分析後,他的記憶體有點不足了。這是因為所有的遊戲資料都被載入到RAM中進行分析。然而,考慮一下這個問題,可以用流式分析輕鬆解決,基本上不需要任何記憶體。我們將建立的流處理管道將比Hadoop的實現快235倍以上,並且幾乎不使用任何記憶體。
....

 
這條命令語句是:

find . -type f -name '*.pgn' -print0 | xargs -0 -n4 -P4 mawk '/Result/ { split($0, a, "-"); res = substr(a[1], length(a[1]), 1); if (res == 1) white++; if (res == 0) black++; if (res == 2) draw++ } END { print white+black+draw, white, black, draw }' | mawk '{games += $1; white += $2; black += $3; draw += $4; } END { print games, white, black, draw }'


這條find | xargs mawk | mawk管道讓我們的執行時間縮短到大約 12 秒,或大約 270MB/秒,這比 Hadoop 實現快了大約 235 倍。
 

結論
希望這說明了一些關於使用和濫用 Hadoop 等工具進行資料處理任務的要點,這些任務可以透過簡單的 shell 命令和工具在單臺機器上更好地完成。如果您有大量資料或確實需要分散式處理,那麼可能需要像 Hadoop 這樣的工具,但這些天我經常看到使用 Hadoop 的地方傳統的關聯式資料庫或其他解決方案在效能方面要好得多,實施成本和持續維護。

點選標頭見原文

相關文章