程式碼世界中的Lambda

abel_cao發表於2016-10-20

“ λ ”像一個雙手插兜兒,獨自行走的人,有“失意、無奈、孤獨”的感覺。λ 讀作Lambda,是物理上的波長符號,放射學的衰變常數,線性代數中的特徵值……在程式和程式碼的世界裡,它代表了函式表示式,系統架構,以及雲端計算架構。

程式碼中的Lambda

Lambda表示式基於數學中的λ演算得名,可以看作是匿名函式,可以代替表示式,函式,閉包等,也支援型別推論,可以遠離匿名內部類。

為什麼使用Lambda呢?
1)程式碼更緊湊
2)擁有函數語言程式設計中修改方法的能力
3)有利於多核計算

Lambda的目的是讓程式設計師能夠對程式行為進行抽象,把程式碼行為看作資料。

Java

Java 8的一個大亮點是引入Lambda表示式,在編寫Lambda表示式時,也會隨之被編譯成一個函式式介面。

一個典型的例子是檔案型別過濾 :

用lambda 重寫後:

Lambda 表示式本身沒有型別,因為常規型別系統沒有“Lambda 表示式”這一內部概念。

Python

與其它語言不同,Python的Lambda表示式的函式體只能有唯一的一條語句,也就是返回值表示式語句。Python程式語言使用lambda來建立匿名函式。

一個典型的例子是求一個列表中所有元素的平方。

一般寫法

使用Lambda 的寫法

在spark 中,用python 操作RDD時,Lambda 更是隨處可見。

大資料架構中的Lambda

Lambda架構的目標是設計出一個能滿足實時大資料系統關鍵特性的架構,包括有:高容錯、低延時和可擴充套件等。Lambda架構整合離線計算和實時計算,融合不可變性(Immunability),讀寫分離和複雜性隔離等一系列架構原則,可整合Hadoop,Kafka,Storm,Spark,Hbase等各類大資料元件。
大資料Lambda 架構

Batch Layer進行預運算的作用實際上就是將大資料變小,從而有效地利用資源,改善實時查詢的效能。主要功能是:

  • 儲存Master Dataset,這是一個不變的持續增長的資料集
  • 針對這個Master Dataset進行預運算

Serving Layer就要負責對batch view進行操作,從而為最終的實時查詢提供支撐。主要作用是:

  • 對batch view的隨機訪問
  • 更新batch view

speed layer與batch layer非常相似,它們之間最大的區別是前者只處理最近的資料,後者則要處理所有的資料。另一個區別是為了滿足最小的延遲,speed layer並不會在同一時間讀取所有的新資料,在接收到新資料時,更新realtime view,而不會像batch layer那樣重新運算整個view。speed layer是一種增量的計算,而非重新運算(recomputation)。Speed Layer的作用包括:

  • 對更新到serving layer帶來的高延遲的一種補充
  • 快速、增量的演算法
  • 最終Batch Layer會覆蓋speed layer

大資料系統一般具有如下屬性:
* 健壯性和容錯性(Robustness和Fault Tolerance)
* 低延遲的讀與更新(Low Latency reads and updates)
* 可伸縮性(Scalability)
* 通用性(Generalization)
* 可擴充套件性(Extensibility)
* 內建查詢(Ad hoc queries)
* 維護最小(Minimal maintenance)
* 可除錯性(Debuggability)

個人覺得,有了spark streaming 之後,spark 本身就是一種Lambda架構。

雲端計算中的Lambda

雲端計算中的Lambda,是指serverless architecture,無需配置或管理伺服器即可執行程式碼。藉助 Lambda,幾乎可以為任何型別的應用程式或後端服務執行程式碼,而且全部無需管理。

以AWS 為例,雲端計算中的Lambda 示意流程如下:

AWS Lambda

只需上傳程式碼,Lambda 會處理執行和擴充套件高可用性程式碼所需的一切工作。還可以將程式碼設定為自動從其他服務觸發,或者直接從任何 Web 或移動應用程式呼叫。

ETL 是資料探勘與資料分析中的必備環節,可以方便的通過AWS的Lambda實現,示例如下:
ETL 的Lambda實現

其實,在spark 上實現Lambda 雲服務也不是太費力的事。

總之,瞭解越多,越會喜歡上它,神奇而有趣的Lambda。

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

程式碼世界中的Lambda

相關文章