“ λ ”像一個雙手插兜兒,獨自行走的人,有“失意、無奈、孤獨”的感覺。λ 讀作Lambda,是物理上的波長符號,放射學的衰變常數,線性代數中的特徵值……在程式和程式碼的世界裡,它代表了函式表示式,系統架構,以及雲端計算架構。
程式碼中的Lambda
Lambda表示式基於數學中的λ演算得名,可以看作是匿名函式,可以代替表示式,函式,閉包等,也支援型別推論,可以遠離匿名內部類。
為什麼使用Lambda呢?
1)程式碼更緊湊
2)擁有函數語言程式設計中修改方法的能力
3)有利於多核計算
Lambda的目的是讓程式設計師能夠對程式行為進行抽象,把程式碼行為看作資料。
Java
Java 8的一個大亮點是引入Lambda表示式,在編寫Lambda表示式時,也會隨之被編譯成一個函式式介面。
一個典型的例子是檔案型別過濾 :
1 2 3 4 5 6 |
File dir = new File("/an/dir/"); FileFilter directoryFilter = new FileFilter() { public boolean accept(File file) { return file.isDirectory(); } }; |
用lambda 重寫後:
1 2 3 |
File dir = new File("/an/dir/"); File[] dirs = dir.listFiles((File f) -> f.isDirectory()); |
Lambda 表示式本身沒有型別,因為常規型別系統沒有“Lambda 表示式”這一內部概念。
Python
與其它語言不同,Python的Lambda表示式的函式體只能有唯一的一條語句,也就是返回值表示式語句。Python程式語言使用lambda來建立匿名函式。
一個典型的例子是求一個列表中所有元素的平方。
一般寫法
1 2 3 4 |
def sq(x): return x * x map(sq, [y for y in range(108)]) |
使用Lambda 的寫法
1 |
map( lambda x: x*x, [y for y in range(108)] ) |
在spark 中,用python 操作RDD時,Lambda 更是隨處可見。
1 2 3 4 5 6 7 8 |
out_rdd = in_rdd.filter( # filter the empty record lambda x:x[1] is not None and x[1] != {} ).map( lambda x:utils.parse_data(x[1],es_relations) ).filter( # filter the empty record lambda x:x is not None ).filter( # filter the record lambda x:x[u'timestamp']>time_start) |
大資料架構中的Lambda
Lambda架構的目標是設計出一個能滿足實時大資料系統關鍵特性的架構,包括有:高容錯、低延時和可擴充套件等。Lambda架構整合離線計算和實時計算,融合不可變性(Immunability),讀寫分離和複雜性隔離等一系列架構原則,可整合Hadoop,Kafka,Storm,Spark,Hbase等各類大資料元件。
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 示意流程如下:
只需上傳程式碼,Lambda 會處理執行和擴充套件高可用性程式碼所需的一切工作。還可以將程式碼設定為自動從其他服務觸發,或者直接從任何 Web 或移動應用程式呼叫。
ETL 是資料探勘與資料分析中的必備環節,可以方便的通過AWS的Lambda實現,示例如下:
其實,在spark 上實現Lambda 雲服務也不是太費力的事。
總之,瞭解越多,越會喜歡上它,神奇而有趣的Lambda。
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!