大數據處理的開發經驗

jopen 10年前發布 | 14K 次閱讀 大數據

  大數據已經不是什么新話題了,在實際的開發和架構過程中,如何為大數據處理做優化和調整,是一個重要的話題,最近,咨詢師 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 地址中啟用一個新的從結點,它就會自動加入集群。

來自: InfoQ
                    <span id="shareA4" class="fl">                          </span>                 </div>
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!