天天看點

老曹眼中的Lambda

“ λ ”像一個雙手插兜兒,獨自行走的人,有“失意、無奈、孤獨”的感覺。λ 讀作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) -&gt; 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']&gt;time_start)</code>

lambda架構的目标是設計出一個能滿足實時大資料系統關鍵特性的架構,包括有:高容錯、低延時和可擴充等。lambda架構整合離線計算和實時計算,融合不可變性(immunability),讀寫分離和複雜性隔離等一系列架構原則,可內建hadoop,kafka,storm,spark,hbase等各類大資料元件。

老曹眼中的Lambda

大資料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 示意流程如下:

老曹眼中的Lambda

aws lambda

隻需上傳代碼,lambda 會處理運作和擴充高可用性代碼所需的一切工作。還可以将代碼設定為自動從其他服務觸發,或者直接從任何 web 或移動應用程式調用。

etl 是資料挖掘與資料分析中的必備環節,可以友善的通過aws的lambda實作,示例如下:

老曹眼中的Lambda

etl 的lambda 實作

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

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

本文轉載自微信公衆号 中生代技術 freshmantechnology