大資料已經不是什麼新話題了,在實際的開發和架構過程中,如何為大資料處理做優化和調整,是一個重要的話題,最近,諮詢師Fabiane Nardon和Fernando Babadopulos在「JAVA Magzine」 電子期刊中發文分享了自己的經驗。
作者在文中首先強調了大資料革命的重要性:
大資料革命正在進行,是時候去參與其中了。 企業每天產生的資料量不斷增加,可以被重新利用來發現新資訊的公共資料集也被廣泛使用。 再加上花費很小、按需處理的雲計算組合,你處在一個具有無限可能的新世界。 不難想像,通過利用大資料技術在雲計算中的力量,很多顛覆性的應用程式將會湧現出來。 許多新興公司現在提出了新的令人興奮的應用,而這些想法在幾年前無法得到足夠的財務支援。 作為JAVA開發者,我們完全有能力參與到這場革命中去,因為許多最為流行的大資料工具都是基於JAVA的。 然而,要構建真正可擴展並且強大的應用程式,同時要保持託管費用在掌控之中,我們不得不重新考慮架構,同時儘量不迷失在無數可用的工具當中。
文章介紹了Apache Hadoop,一個允許對大資料集進行分散式處理的框架,可能是這些工具中最為人熟知的一個了。 除了提供強大的MapReduce實現和可靠的分散式檔案系統——Hadoop分散式檔案系統(HDFS)——之外,也有一個大資料工具的生態系統構建在Hadoop之上,包括以下內容:
Apache HBase的是針對大表的分散式資料庫。
Apache Hive是一個資料倉儲中的基礎設施,它允許在HDFS中存儲的資料中進行臨時的類似SQL的查詢。
Apache Pig是一個用於創建MapReduce程式的高層平臺。
Apache Mahout是一個機器學習和資料採礦庫。
Apache Crunch和Cascading都是用於創建MapReduce管道的框架。
雖然這些工具是強大的,但它們也增加了許多開銷,除非你的資料集非常大,否則是無法抵消這些成本的。 比如,可以在一個非常小的資料集上嘗試運行文章中提供的代碼示例,比如一個只有一行的檔。 你將會看到,處理時間將會比你所預期的時間長很多。 如何確定你是否真的有一個大資料的問題?文章指出,雖然沒有固定的資料,但有幾個指標可以用來幫你決定你的資料是否足夠大:
你所有的資料不適合在一台機器上運行,這就意味著你需要一個伺服器集群來在可接受的時間範圍內處理你的資料。
你在處理的大多數是TB級別的而不是GB級別的資料。
你正在處理的資料量正在持續增長並且可能每年增加一倍。
如果你的資料是不是真的很大,就保持事情的簡單吧。 通過傳統的JAVA應用程式,甚至用更簡單的工具,例如grep或Awk來處理你的資料,你可能會節省時間和金錢。
作者特別強調,如果你決定用Hadoop來分析你的資料集,那麼隨著資料的增加,你會希望避免性能瓶頸。 你可以將很多配置調整應用到Hadoop集群上去,並且如果你的應用程式處理資料的速度沒有達到你需要的那麼快時,你可以一直添加更多的節點。 但是,請記住,沒有什麼會比你自己的代碼更高效對你的大資料應用程式產生更大的影響了。
當實現一個大的資料處理應用程式時,你的代碼通常會在每個處理週期內被執行數百萬或數十億次。 舉個例子,考慮一下你得處理一個10GB的日誌檔,並且每行有500位元組那麼長。 分析每行檔的代碼將運行2000萬次。 如果你可以讓你的代碼處理每行的時候快10微秒,這將使處理檔的過程快3.3分鐘。 因為你可能每天要處理很多10GB的檔,隨著時間的增多,那些分鐘將在資源和時間上表現出顯著的實惠。
這裡的經驗是,每微秒都很重要。 為你的問題選擇最快的JAVA資料結構,在可能的情況下使用緩存,避免不必要的物件具現化,使用高效的字串操作方法,並且用你的JAVA程式設計技能產出你所能編出的最高效的代碼。
除了生產高效的代碼之外,瞭解Hadoop的工作原理對於你避免一些常見的錯誤是很重要的。
在雲中部署大資料應用程式有許多優點。 文章指出,隨著資料量的增大,你可以根據需要購買更多的機器,並且可以為峰值做好準備。 然而,如果要在不產生高昂的擴展費用的前提下使用雲服務,你得在腦中考慮好雲平臺的特殊性後再構建應用程式。 首先,更加高效的代碼意味著更少的處理時間,也就是較少的託管費用。 每次你添加一個新節點到你的集群中的時候,你就是在增加更多花費,因此確保你的代碼盡可能的有效是個很好的做法。
當在雲中部署大資料應用程式時,考慮使用無共用架構是很重要的。 無共用架構基本上是只由網路相互連接的單個電腦,他們不共用任何磁片或者記憶體。 這就是為什麼這種架構的擴充性非常好,因為不會由磁片訪問的競爭或者是另一個進程的出現引發瓶頸。 每台機器都需要顧及所有工作,機器直接是相互獨立且自給自足的。
Hadoop的容錯功能打開了探索的可能,甚至更便宜的雲機器也能提供。 如Amazon spot的實例(當價格比你的競價更高的時候你可能會失去這個機器)。 當你使用這種機器來運行TaskTracker時,例如,你任何時候都可以承受機器的失去,因為Hadoop只要檢測到你失去了一個或多個正在作業的結點時,它將會在另一個節點上重新運行這個作業。
事實上,在很多大資料應用程式中,甚至可以接受失去一小部分資料。 如果你在做統計處理,很常見的事情是,一個沒有被處理的小資料集可能不會影響到最終結果,當你創建你的架構時,你可以將此作為你的優勢。
你可以使用一個在雲端中支援Hadoop的服務來託管你的應用程式。 亞馬遜EMR是這種服務的一個很好的例子。 使用Hadoop的託管服務將減輕安裝和維護自己Hadoop集群的負擔。 不過,如果需要更多的靈活性,你也可以在雲端安裝自己的Hadoop解決方案。
文章指出,在雲中使用Hadoop的另一個好處是,你可以監視作業的行為,並且即使在工作運行的情況下,你也可以根據需要自動添加或刪除節點。 Hadoop的容錯特性可以確保一切都將繼續工作。 這裡的竅門就是預先配置主節點使其允許一系列從IP位址。 這是通過Hadoop安裝目錄裡的conf/slaves檔來完成的。 有了這個配置,你可以從預先配置的一個IP位址中啟用一個新的從結點,它就會自動加入集群。