“ λ ”像一個雙手插兜兒,獨自行走的人,有“失意、無奈、孤獨”的感覺。λ 讀作lambda,是實體上的波長符号,放射學的衰變常數,線性代數中的特征值......在程式和代碼的世界裡,它代表了函數表達式,系統架構,以及雲計算架構。
lambda表達式基于數學中的λ演算得名,可以看作是匿名函數,可以代替表達式,函數,閉包等,也支援類型推論,可以遠離匿名内部類。
為什麼使用lambda呢?
代碼更緊湊
擁有函數式程式設計中修改方法的能力
有利于多核計算
lambda的目的是讓程式員能夠對程式行為進行抽象,把代碼行為看作資料。
java 8的一個大亮點是引入lambda表達式,在編寫lambda表達式時,也會随之被編譯成一個函數式接口。
一個典型的例子是檔案類型過濾 :
<code>file dir = new file("/an/dir/"); filefilter directoryfilter = new filefilter() { public boolean accept(file file) { return file.isdirectory(); } };</code>
用lambda 重寫後:
<code>file dir = new file("/an/dir/"); file[] dirs = dir.listfiles((file f) -> f.isdirectory());</code>
lambda 表達式本身沒有類型,因為正常類型系統沒有“lambda 表達式”這一内部概念。
與其它語言不同,python的lambda表達式的函數體隻能有唯一的一條語句,也就是傳回值表達式語句。python程式設計語言使用lambda來建立匿名函數。
一個典型的例子是求一個清單中所有元素的平方。
一般寫法:
<code>def sq(x): return x * x map(sq, [y for y in range(108)])</code>
使用lambda 的寫法:
<code>map( lambda x: x*x, [y for y in range(108)] )</code>
在spark 中,用python 操作rdd時,lambda 更是随處可見。
<code>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)</code>
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,是指serverless architecture,無需配置或管理伺服器即可運作代碼。借助 lambda,幾乎可以為任何類型的應用程式或後端服務運作代碼,而且全部無需管理。
以aws 為例,雲計算中的lambda 示意流程如下:
aws lambda
隻需上傳代碼,lambda 會處理運作和擴充高可用性代碼所需的一切工作。還可以将代碼設定為自動從其他服務觸發,或者直接從任何 web 或移動應用程式調用。
etl 是資料挖掘與資料分析中的必備環節,可以友善的通過aws的lambda實作,示例如下:
etl 的lambda 實作
其實,在spark 上實作lambda 雲服務也不是太費力的事。
總之,了解越多,越會喜歡上它,神奇而有趣的lambda。
本文轉載自微信公衆号 中生代技術 freshmantechnology