用Hadoop,還是不用Hadoop?

Lex Lian發表於2013-10-14

Hadoop通常被認定是能夠幫助你解決所有問題的唯一方案。 當人們提到“大資料”或是“資料分析”等相關問題的時候,會聽到脫口而出的回答:Hadoop!實際上Hadoop被設計和建造出來,是用來解決一系列特定問題的。對某些問題來說,Hadoop至多算是一個不好的選擇。對另一些問題來說,選擇Hadoop甚至會是一個錯誤。對於資料轉換的操作,或者更廣泛意義上的抽取-轉換-裝載的操作(譯者注:Extraction Transformation Load,ETL,資料倉儲中對資料從初始狀態到可用狀態處理過程的經典定義), 使用Hadoop系統能夠得到很多好處, 但是如果你的問題是下面5類之中的一個的話,Hadoop可能會是一不合適的解決方案。

 

1.對於大資料的渴望

很多人相信他們擁有正真“大”的資料, 但通常情況並非如此。 當考慮資料容量和理解大多數人對“大資料”處理的想法的時候, 我們應當參考這篇研究論文, 沒有人會因為買了一個叢集的伺服器而被辭退,它告訴了我們一些有趣的事實。 Hadoop是被設計成用來處理在TB或PB級別的資料的, 而世界上大多數的計算任務處理的是100GB以下的輸入資料。(Microsoft和Yahoo在這個資料統計上的中位數是14GB,而90% Facebook的任務處理的是100GB以下的資料)。對於這樣的情況來說, 縱向擴充套件的解決方案就會在效能上勝過橫向擴充套件(scale-out)的解決方案。

 

(譯者注:縱向擴充套件scale-up通常是指在一臺機器上增加或更換記憶體、CPU、硬碟或網路裝置等硬體來實現系統整體效能的提升, 橫向擴充套件(scale-out)指的是通過在叢集中增加機器來提升叢集系統整體效能的提升。論文中比較了對Hadoop系統進行各種縱向擴充套件和橫向擴充套件之後, 在效能指標上進行評測的試驗。結論是在某些情況下在一臺機器上的縱向擴充套件會比在Hadoop叢集中增加機器得到更高的系統效能,而且價效比會更好。這個結論打破了大多數人對Hadoop系統的簡單認識, 那就是一定要用若干廉價的機器組成叢集才能到達最好的整體效能。 )

 

所以你需要問自己:

  • 我是否有超過幾個TB的資料?
  • 我是否有穩定、海量的輸入資料?
  • 我有多少資料要操作和處理?

 

2.你在佇列中

當你在Hadoop系統中提交計算任務的時候, 最小的延遲時間是1分鐘 。 這意味系統對於客戶的商品購買資訊要花1分鐘的時間才能響應並提供相關商品推薦。這要求系統有非常忠實和耐心的客戶, 盯著電腦螢幕超過60秒鐘等待結果的出現。 一種好的方案是將庫存中的每一件商品都做一個預先的相關商品的計算, 放在Hadoop上。 然後提供一個網站,或者是移動應用來訪問預先儲存的結果,達到1秒或以下的即時響應。 Hadoop是一個非常好的做預先計算的大資料引擎。 當然,隨著需要返回的資料越來越複雜,完全的預先計算會變得越來越沒有效率。

 

所以你需要問自己:

  • 使用者期望的系統響應時間大概在什麼範圍?
  • 哪些計算任務是可以通過批處理的方式來執行的?

 

(譯者注:原作者應該是用了B2C電子商務網站上經典的商品推薦功能作為用例,描述如何用Hadoop實現這個功能。)

 

3.你的問題會在多少時間內得到響應

對於要求實時響應查詢的問題來說,Hadoop並不是一個好的解決方案。Hadoop的計算任務要在map和reduce上花費時間, 並且在shuffle階段還要花時間。 這些過程都不是可以在限定時間內可以完成的, 所以Hadoop並不適合用於開發有實時性需求的應用。一個實際的例子是,在期貨或股票市場的程式化交易系統(Program Trading)中用到的成交量加權平均價格(Volume-weighted average price,VWAP)的計算,通常是實時的。這要求交易系統在限定時間內將結果給到使用者,使得他們能夠進行交易。

(譯者注:Hadoop的MapReduce中的shuffle過程指的是將多個map任務的結果分配給一個或多個reduc任務是的資料洗牌和分配的操作,這篇blog解釋的比較詳細,http://langyu.iteye.com/blog/992916 。 這裡的用例是在投資銀行的程式交易中,如何計算股票或期貨交易的基準價格。 這樣的計算我覺得每次對資料的查詢響應時間應該是在100ms以下的,詳見http://baike.baidu.com/view/1280239.htmhttp://baike.baidu.com/view/945603.htm。關於這個例子,相信投行的xdjm們應該有更多的發言權。)

 

對資料分析人員來說, 他們實際上非常想使用SQL這樣的查詢語言的。Hadoop系統並不能很好地支援對儲存在Hadoop上的資料的隨即訪問 。即便你使用了HIVE來幫助將你的類似SQL的查詢轉換成特定MapReduce計算任務的時候, 資料的隨機訪問也不是Hadoop的強項。Google的Dremel系統(和它的擴充套件, BigQuery系統)被設計成能夠在幾秒中之內返回海量的資料。啟示SQL還能夠很好地支援資料表之間的各種join操作。 另外一些支援實時響應的技術方案包括,從Berkley 加州分校(University of California, Berkeley)的AmpLab誕生的Shark專案, 以及Horntoworks領導的Stinger專案等。

 

所以你需要問自己:

  • 你的使用者和分析人員期望的資料訪問的互動性和實時性要求是怎樣的?
  • 你的使用者希望要能夠訪問TB級別的資料嗎,還是隻需要訪問其中的一部分資料?

 

(譯者注:Apache Hive 是Hadoop生態系統中的一個開源專案,其主要目的是在Hadoop系統上提供接近ANSI SQL的資料操作,以方便熟悉SQL語言的資料分析人員對Hadoop上的資料進行查詢。Dremel 系統是Google開發的支援大資料的實時查詢系統,它利用了精心設計的列式儲存結構和大規模並行查詢的機制, 在測試中能夠到達在3秒內在分析和查詢1PB資料的效能(英文論文中文翻譯 )。 BigQuery是Google基於Dremel開發出的開放給開發人員的SaaS服務,可以對大量資料進行操作  。Berkeley Data Analytics Stack, BDAS 是AmpLab提供的基於Hadoop的大資料平臺, 包含多個開源專案, 詳見https://amplab.cs.berkeley.edu/software/。Spark專案是BDAS中的一個專案, 它使用Scala語言開發,提供了類似於SQL的資料操作介面,完全相容Hive。其主要的特點是利用底層的Spark將查詢翻譯為具體的計算任務。Spark會通過大量使用Hadoop叢集中結點上記憶體的方式來進行資料快取和在記憶體中進行實時計算, 達到加速查詢和計算的目的。詳見http://shark.cs.berkeley.edu/。Hortonworks是目前幾家專注於提供基於Hadoop的大資料系統和應用的公司之一, Stinger是用來  Horontoworks提出的為了提升Hive查詢效能的一系列在基於Hadoop的專案和改進的總稱,其主要方法是優化Hive的檔案儲存格式以及針對Hive的查詢請求進行分析優化。)

 

我們應該認識到, Hadoop是在批處理的模式下工作的。 這意味著當有新的資料被新增進來的時候, 資料處理的計算任務需要在整個資料集合上重新執行一遍。所以,隨著資料的增長,資料分析的時間也會隨之增加。 在實際情況下,小塊新資料的增加、單一種類的資料更改或者微量資料的更新都會實時地發生。通常, 商業程式都需要根據這些事件進行決策。 然而,不論這些資料多麼迅速地被輸入到Hadoop系統,在Hadoop處理這些資料的時候,仍然是通過批處理的方式。Hadoop 2.0的MapReduce框架YARN承諾將解決這個問題。 Twitter使用的Storm平臺是另一個可行的、流行的備選方案。將Storm和例如Kafka這樣的分散式訊息系統結合在一起,可以支援流資料處理和彙總的各種需求。痛苦的是,目前Storm並不支援負載平衡,但是Yahoo的S4版本中會提供。

所以你需要問自己:

  • 我的資料的生命週期是多長?
  • 我的業務需要多迅速地從輸入資料中獲得價值?
  • 對我的業務來說響應實時的資料變化和更新有多重要?

 

實時性的廣告應用和收集感測器的監控應用都要求對流資料的實時處理。 Hadoop以及之上的工具並不是解決這類問題的唯一選擇。 在最近的Indy 500車賽中,邁凱輪車隊在他們的ATLAS系統中使用了SAP的HANA記憶體資料庫產品來進行資料分析,並結合Matlab來進行各種模擬,對比賽中實時得到的賽車遙測資料進行分析和計算。很多資料分析人員認為,Hadoop的未來在於能夠支援實時性和互動性的操作。

(譯者注:YARN是Hadoop2.0採用的新不同於MapReduce的資源管理和任務處理的框架,它號稱能夠支援比MapReduce更廣的程式設計模型, 同時實現對實時查詢和計算的任務的支援,詳見http://hortonworks.com/hadoop/yarn/ 。Storm是由Twitter主導的開源專案, 是一種分散式資料處理系統,其主要特點是能夠很好地支援實時性要求高的流資料處理,詳見http://storm-project.net  。淘寶和阿里巴巴都在使用Storm。Simple Scalable Streaming System, S4 是由Yahoo建立的另外一個實時流資料處理的分散式系統,詳見http://incubator.apache.org/s4/ 。這裡有一篇網頁引用了很多比較Yahoo S4和Storm的文章,http://blog.softwareabstractions.com/the_software_abstractions/2013/06/links-comparing-yahoo-s4-and-storm-for-continuous-stream-processing-aka-real-time-big-data.html 。Kafka是Apache 的一個開源專案,http://kafka.apache.org/。HANA是 SAP推出的商業產品,是可一個支援橫向擴充套件的記憶體資料庫解決方案,可以支援實時的大資料分析和計算。詳見 http://www.sap.com/HANA。Matlab是Mathworks公司開發的一個用於科學計算的開發類產品, www.mathworks.com/products/matlab. McLaren 車隊是著名的英國F1車隊, 它是F1方程式比賽中一支非常成功的隊伍。同時他們也參加美國著名的Indy 500賽車比賽。他們使用大資料平臺處理賽車資料來提高賽車成績的故事可以看這篇文章,http://blogs.gartner.com/doug-laney/the-indy-500-big-race-bigger-data/

 

4.我才和我的社交網路分手

當資料能夠被分解為鍵值對,又不用擔心丟失上下文或者某些資料之間隱性關係的時候,Hadoop,特別是MapReduce框架,是最好的選擇。但是圖這樣的資料結構中包含著各種隱性的關係, 如圖的邊、子樹 、節點之間的父子關係、權重等,而且這些關係並非都能在圖中一個結點上表示。這樣的特性就要求處理圖的演算法要在每一次的迭代計算中加入當前圖的完整或部分的資訊。 這樣的演算法基本上用MapReduce的框架是不可能實現的,即便能夠實現也會是一種很迂迴的解決方案。 另外一個問題是如何制定將資料切分到不同結點上的策略。如果你要處理的資料的主要資料結構是圖或者是網路, 那麼你最好選擇使用面向圖的資料庫,比如NeoJ或者Dex。或者你可以去研究一下最新的Google Pregel 或者Apache Giraph專案。

 

所以你需要問自己:

  • 我的資料的底層結構是否和資料本身一樣重要?
  • 我希望從資料的結構中得到的啟發和見解,是否和資料本身一樣重要, 甚至更重要?

(譯者注:NeoJ 擁有商業和GPL雙許可證模式,詳見http://www.neo4j.org/,Dex是商業產品,詳見http://www.sparsity-technologies.com/dex 。Apache Giraph 專案http://giraph.apache.org 是根據Google Pregel論文http://dl.acm.org/citation.cfm?id=1807184http://kowshik.github.io/JPregel/pregel_paper.pdf 的開源實現 ,是用來分析社交網路這樣可以被抽象為圖或網路資料結構的大資料處理平臺。 )

 

5.MapReduce的模具

很多的計算任務、工作及演算法從本質上來說就是不適合使用MapReduce框架的。 上一章中已經談到了其中一類的問題。另一類的問題是,某些計算任務需要上一步計算的結果來進行當前一步的計算。一個數學上的例子就是斐波那契數列的計算。 某些機器學習的演算法,如梯度和最大期望等,也不是很適合使用MapReduce的模式。很多研究人員已經對實現這些演算法中需要的特定優化和策略(全域性狀態,計算時將資料結構傳入進行引用等)給出了建議,但是如果用Hadoop來實現具體演算法的話,還是會變得很複雜而且不易被理解。

所以你需要問自己:

  • 我的業務是否對特定的演算法或者領域相關的流程有非常高的要求?
  • 技術團隊是否有足夠的能力和資源來分析演算法是否可以使用MapReduce框架?

(譯者注:梯度方法, gradient method通常用於數學優化計算中,詳見http://zh.wikipedia.org/wiki/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95。最大期望演算法maximization expectation algorithm ,通常用於概率模型及相應的機器學習演算法中, http://zh.wikipedia.org/zh-cn/%E6%9C%80%E5%A4%A7%E6%9C%9F%E6%9C%9B%E7%AE%97%E6%B3%95

除此之外,需要考慮另外一些情況, 比如,資料總量並不大,或者資料集雖然很大,但主要是由上億的小檔案組成,而且不能拼接(如,許多圖形檔案需要以不同的形狀被輸入進來)。正如我們之前說到的,對於那些不適合使用MapReduce分割、合併原則的計算任務,如果用Hadoop來實現他們的話,會讓Hadoop的使用變得大費周折。

現在我們已經分析了在哪些情況下Hadoop不合適,讓我們看一下在哪些情況下使用Hadoop是正確的選擇。

你需要問自己,你的組織是否,

  1. 想要從一堆文字格式的日誌檔案中抽取資訊?
  2. 想要將大多數是非結構化或者半結構化的資料轉換為有用的、結構化的格式?
  3. 有沒有計算任務是每天晚上在整個資料集合上執行的?(比如說信用卡公司在晚上處理所有白天的交易記錄)
  4. 從一次資料處理中獲取的結論和下一次計劃要處理的結論是一致的(不像股票市場的價格,每一天都在變化)?

如果以上答案都為“是”,那麼你就應該深入研究Hadoop。

 

以上所談到的幾類問題代表了相當大部分能夠用Hadoop來解決的商業問題(儘管很多行業報告的結論是將這些類別的Hadoop系統部署到生產環境中並不是一件容易的事情)。對於某些計算任務,Hadoop的計算模型是非常合適的。 比如說, 你需要處理海量的非結構化或半結構化的資料,然後將內容進行彙總或者將相關計算結果轉換成結構化的資料, 並且將結果提供給其他元件或系統使用。如果收集的資料可以很容易地被轉換位一個ID以及和它對應的內容(用Hadoop的術語來說就是鍵值對,key-value pair),那麼你就可以使用這種簡單的關聯來進行不同種類的彙總計算。

總的來說, 關鍵是要認清你擁有的各種資源,並且理解想要解決的問題的本質。 結合本文提到的一些觀點和你自己的理解和認識, 你就能夠選擇最適合你的工具。 在某些情況下, 最終的解決方案很有可能是Hadoop。

你在使用Hadoop方面有哪些經驗和教訓? 請在評論中分享吧。

相關文章