我的雲端生活網 - Life+

Showing posts with label middleware. Show all posts
Showing posts with label middleware. Show all posts

Thursday, December 3, 2009

程式風格與系統實作

有個著名的99題程式問題集中有二件基本問題:
  1. 反轉一列資料。
  2. 檢查一列資料是不是回文。
用 Erlang 寫,程式如下:

reverse( [ ] ) -> [ ] ;
reverse( [ X | Y ] ) -> reverse( Y ) ++ [ X ] .

palindrome( Xs ) -> reverse( Xs ) == Xs.

這些問題主要是在考邏輯程式語言或函數程式語言解決問題的方法,用 Erlang 寫非常自然。至於考慮到用指令式程式語言,程式會怎麼寫呢?先想想 C 程式。
void reverse(char *x, int xn, char *y, int yn) {
    int i;
    yn = xn;
    for(i=0; i<xn/2+1; i++) {
        y[i] = x[xn-1-i];
        y[yn-1-i] = x[i];
    }
}

main() {
    char a[] = {'a', 'b', 'c', 'd', 'e'};
    char b[] = {'1', '1', '1', '1', '1'};
    reverse(a, 5, b, 5);
}
以上程式是反轉一列資料。至於檢查是不是回文,與反轉一列資料有相當的程式結構。所以,照著反轉程式結構可以改出檢查回文的程式。

/* void reverse */ int is_palindrome(char *x, int xn /* , char *y, int yn */ ) {
    int i;
    // yn = xn;
    int result = TRUE;
    for(i=0; i<xn/2+1; i++) {
        // y[i] = x[xn-1-i];
        result &= (x[i] == x[xn-1-i]);
        // y[yn-1-i] = x[i];
    }
    return result;
}

Erlang 程式和 C 程式各自從掌握的不同邏輯意思解決問題。對 Erlang 程式來說,一列資料是回文隱含了將這一列資料反轉會和原資料相同。對 C 程式來說,是考慮到一列資料若是回文,資料每一項在前半段位置的,會和在後半段鏡射位置的資料相同。所以,用 C 寫以上程式,一定要把以上二個程式寫成一樣的結構,因為它們的順序邏輯一樣。但是用 Erlang 寫程式,則可以說是反轉資料問題是檢查回文問題的子問題。不同的語言有各自解決問題的能力。用 C 的程式風格思考, Erlang 真不好寫;並且用 Erlang 的程式風格思考, C 也不好寫。不過,只要用 Erlang 的方式寫 Erlang 程式,用 C 的方式寫 C 程式,都是做對事情了。

所以,本篇文題回到系統實作方面:本來我有個系統是用 Perl 規則持續讀檔案,用檔案時間判斷是否有新的 RFID reader 讀數出現。系統中存在大量這種類型的 Perl 規則,並且反覆判讀檔案消耗大量時間。我可以用 MapReduce 來節省工作時間嗎? MapReduce 本身就是前車之鑑。

在有大量資料需要處理的分散系統上,要直接寫程式,不管是什麼檔案鎖定、程序鎖定、或是信號的控制機制,最後都是普通的程式處理方式:把大量資料塞進一個迴圈裏。 MapReduce 是個漂亮的程式作法,它的思考方向是程式有多少等級的數量,程式也產生出多少等級數量的程序,讓每個程序分配到相當少量的工作,許多程序一起做!所以,前後二種處理方法,在程式的寫法上相當不同。直接的程式,想法依然直接。但是,實作 MapReduce 是先做一個計算框架,框架中有二種空位存放 map 和 reduce 二種類型的程式;而中樞設計不要思考 map 和 reduce 程式可能怎麼寫,而是只思考把一些程序分配去執行 map 程式、另一些程序分配去執行 reduce 程式,並且這些程序如果中斷但沒做完工作,就再分配一次同樣的工作。於是,剩下的工作是 map 和 reduce 程式都比較好寫,而且寫完並套進 MapReduce 架構之後,就可以處理大量的資料。同樣的問題處理,可以用不同的程式方法解決問題。

依我看,現有系統的規則,只有檢查新 reader 讀數的規則可以保留,直接寫成 map 程式。

rfid_read ( File, Reads ) :
    for each (Tag_ID, Reader_ID, Time) in Recent(Reads)
        emit( (observation, (Tag_ID, Reader_ID, Time)) )

然後交給其他的 reduce 程式處理。至於其他類型的規則,則要按照 MapReduce 的思維改寫成適當的 map 程式或 reduce 程式比較好。

Monday, November 2, 2009

用 MapReduce 處理大量工作

MapReduce是一種簡單的程式模型,只要知道map和reduce程式,系統會幫忙將map用在原始資料上,整理岀中繼資料,然後用reduce程式收斂這些中繼資料。

程式結構

Map是一個從 (key, list(value)) 對應到 list(key', value') 的函數。簡單說,對map輸入一列資料,map會將資料做一些前處理,然後把一個 key 跟每一筆資料配對。Map是使用者自己寫的程式。

Reduce是一個從 list(key', value') 對應到 list(value'') 的函數。簡單說,reduce是彙總函數,將許多 value' 收合為一個value'' 。 Key' 的存在,可能是用於樣式比對或額外附加資訊的需要。最後的結果仍是 list(value'') 是方便與其他 reduce 程式的輸出再做合併。

系統組成

系統使用相當多的工作單元分別消化map和reduce工作。工作單元可以分佈在許多台電腦中,並且工作單元彼此不共享記憶體資料。Map或reduce做完之後,將資料儲存在檔案系統中。只有一種特殊的工作單元稱為master,負責監看所有map和reduce工作單元的活動情況,並負責派遣map或reduce工作。

分散處理:Map和reduce工作單元各別處理自己的一段資料,做完時,將資料儲存在自己所在電腦的檔案系統,並將完成訊息和檔案位置資訊傳給master工作單元。Master工作單元可以再將中繼檔案或結果檔案的位置資訊傳給下一個map或reduce工作單元,指派下一階段的工作。

檔案儲存:檔案從來不整合成一個大檔案,而是以許多小檔案的形式存在許多台電腦中。電腦彼此之間不交換檔案流,節省網路頻寬。

容錯處理:如果有一些工作單元或電腦不活動並且沒有回應,master工作單元將已經指派去那些電腦的工作重新指派給其他工作單元。要重做工作的原因是,不回應的工作單元造成它所在的電腦檔案無法讀取。重做無效的工作最有容錯的保障。

實作案例

Google MapReduce是C/C++寫的。Hadoop是用Java實作的MapReduce平台,從其中擴充出HadoopDB和Hive等資料庫系統。CouchDB是用到MapReduce方法處理索引的文件式資料庫,用Erlang實作。Disco是Nokia開發的開源MapReduce平台,用Erlang實作,使用者必須用Python寫程式。

1. MapReduce, Wikipedia, http://en.wikipedia.org/wiki/MapReduce.
2. Jeffrey Dean and Sanjay Ghemawat, MapReduce: Simplified Data Processing on Large Clusters, Proceedings of 6th Symposium on Operating Systems Design and Implementation, 2004.

Thursday, September 24, 2009

連繫真實與虛擬世界的RFID應用

德國ETH Zurich技術大學有一組人設計了稱為Deja vu的系統,做RFID複雜事件處理的中介平台,並借用三維模型虛擬世界Second Life環境做使用者介面,展示出連繫真實與虛擬世界的應用範例。

Deja vu系統強調能處理即時訊息的能力,於是以查詢基礎架構──如下圖──為中心,著重查詢語言的樣式比對能力,偵測特定的事件組合。以MySQL為基本平台,將查詢處理程式擴充,使能對表格的資料列做樣式比對。

他們又在Second Life建立了客製模組,在獨立的小島上的SmartRF Lib,是虛擬的RFID系統環境。其中定義了圖書館RFID環境,在每一本書上貼了標籤,並在重要地點如書架、流通櫃台、出口等等,設置了讀寫機。Second Life的SmartRF Lib圖書館環境對應到真實圖書館環境,在真正圖書館出入的人,在Second Life有替身人物做代表。圖書館發生書籍取出、借出、或是竊取的行為,都反應在Second Life虛擬環境中。如果有一本書由書架取出、並離開圖書館出口,卻沒有在流通櫃台登記,在出口位置會顯示紅色亮點訊號代表竊取事件。從真正圖書館取得的RFID資料,透過Deja Vu查詢,反應到Second Life虛擬環境。

相關文獻
[1] Nihal Dindar at el., Event Processing Support for Cross-Reality Environments, Pervasive Computing, vol. 8, issue 3, pp.34-41, 2009.
[2] ____________, Deja Vu: Declarative Pattern Matching over Live and Archived Streams of Events, Proceedings of the 35th ACM SIGMOD Conference, pp. 1023-1026, 2009.

Wednesday, January 21, 2009

談談Middleware

資訊領域中的 middleware 很多。例如,作業系統是介於硬體與應用程式之間的 middleware 、 Java VM 是介於作業系統與 Java 程式之間的 middleware 。資訊領域中有太多分層概念,像多層式主從架構之類,存在於許多不同的平台、許多不同的討論範圍、以及許多不同的用途。 Middleware 對我們不陌生。但是,站在設計 middleware 的立場,首先要為自己的立場找個夠強的理由。

「為什麼要有 middleware ?」這個問題,到處能看到的答案好像很少。我們為什麼要在 RFID readers 與上層系統中間,多放一層軟體系統?

據我這陣子調閱及學習的認知, middleware 的好處是:

  1. Middleware 對下層 RFID 設備來說,要做設備的管理與協同工作。
  2. Middleware 對上層系統來說,提供抽象的 RFID 設備。
  3. RFID 系統的資料,在 middleware 中是一般化的,隨時準備被取用。

與其他軟體比較、類比, Microsoft Office 是一般化的文件編輯軟體,所有的功能都具備一般的彈性,沒有特別偏向哪一邊特殊的面向。這種一般性的概念, Office 的開發者腦中已具備。同理, RFID system middleware 是一種比較一般化的 RFID 上層系統,提供 RFID 系統中最基本且必要的功能。 Middleware 所做的是中樞機能的工作,而不是偏向哪一個應用面向的特殊工作。

目前我 RFID system middleware 的構想,包含的元件有:對上層提供的應用層事件(ALE)介面、對應下層的抽象設備或代理設備(agent)、資料表達規格、必要的背景工作(包含 reader polling 等等)、資訊過濾及彙整函數、工作排程、以及邏輯規則系統。

Wednesday, November 12, 2008

ALE middleware 架構布局


目前正在思考 Application Level Events 介面 [1,2] 如何整併入系統中。我的構想如右圖。 Middleware 為 ALE 介面的實作,處理讀寫命令呼叫及程序觸發與控制,可能是獨立 server 、或是 DLL 、 local services 或 Web services 形式。一件 middleware server 可以管理許多台 readers 。 Middleware 對應用系統提供介面做讀取 (pooling) 。

Middleware 對 readers 以低層 reader 協定 (LLRP) 溝通,對應用系統則以 SOAP (簡單物件存取協定) 溝通。 Readers 的設定表可能離線備份在 middleware ,使上下二端讀取設定比較簡單。每一台 reader 只和少數一件 middleware(或二件,包含備援機)溝通,不同步的問題會比較少。應用系統的開發人員則呼叫 middleware 的 ALE 介面,傳 SOAP 參數或訊息,讓程式比較好寫。不過,少數的 middleware 會是效能關卡,這方面還要思考解決方案。


Middleware 做成獨立模組,內涵物可以有許多故事。例如 [4] 的處理方式。

SOAP 效能問題則可以參考 [3] 的處理方式(參左圖):應用系統送出訊息(由路線 2 )都由 client 代理,處理每一串 SOAP 訊息都先找 cache 有沒有舊的相同資料(由路線 3 ),若有則發送舊的訊息(由路線 5 ),或者若沒有則發送新訊息(由路線 5 )。

參考資料

[1] EPCglobal Inc. The EPCglobal architecture framework, EPCglobal final version 1.2 approved 10 September 2007. http://www.epcglobalinc.org/standards/architecture/architecture_1_2-framework-20070910.pdf , Sep. 10, 2007 (referred at August 2008).

[2] EPCglobal Inc. The Application Level Events (ALE) specification, version 1.1: Part I: Core specification. http://www.epcglobalinc.org/standards/ale/ale_1_1-standard-core-20080227.pdf , Feb. 27, 2008 (referred at September 2008).

[3] K. Devaram and D. Andresen. SOAP optimization via client-side caching. Proceedings of the First International Conference on Web Services (ICWS'03), pp. 520-524, Las Vegas, NV, June 24-27, 2003.

[4] J. Song, T. Kim, S. Lee, and H. Kim. Security enhanced RFID middleware system. Procedings of World Academy of Science, Engineering and Technology, v.10, pp.79-82, Dec. 10, 2005.

Friday, October 24, 2008

參與「2008年空間資訊基礎建設國際研討會暨台灣地理資訊學會年會」

2008年10月23到24日在台北市台大集思會議中心(羅斯福路四段85號B1)舉行,由行政院經濟建設委員會與台灣地理資訊學會主辦、財團法人台灣地理資訊中心與逢甲大學地理資訊系統研究中心執行。

在場次C1孫國勛教授發表了〈以RFID、GPS、GIS定位與通訊科技整合為基礎之文化資產保存、管理、展示及導覽系統─以『珍貴老樹管理系統』為例〉,直接點明為RPID資訊應用的一例。

在場次C11,張筑鈞研究生發表了〈以開放空間服務鏈架構支源互操作中介軟體之發展〉,其中提出將多項公開資訊服務串連成服務鏈的構想,為地理資訊應用的中介軟體。做為中介軟體,勢必要思考到異質資料的套疊與重覆資料的整併或篩減。

在場次C15,來自中華電信的楊仕丞先生發表了〈一種快速之階層式合理路徑計算方法〉,提出根據道路層次限制其計算最短路徑所考慮的路徑數目。

當前在RFID技術研究的興趣,轉向到中介軟體(middleware)的考慮。其中可評量觀點有:異質平台的協同運作、資料的粹取、資料的一致、以及通訊安全。這是我參與空間資訊基礎建設研討會所關心的方面,由他山之石尋找切入點。

Blog Archive