本章將介紹資料前處理、資料庫建置、分散式資料庫技術到最後本系統視覺 化工具所應用的所有方法;資料前處理將資料彙整成系統所需之資料結構,儲存 於 MongoDB 分片資料庫伺服器中,並運用 MapReduce 功能存取資料,最後透過本 系統設計之視覺化工具呈現資料,方便使用者閱讀資料。
4-1 資料預處理
原始數據(raw data)沒有結構且具有許多冗餘欄位,可能隱藏著許多問題甚 至可能影響效能,必須透過一定的預處理程序將數據結構化為系統容易使用結
doi:10.6342/NTU201601304
22
鎮解析出來並將其與區域代碼關聯,剔除外島並依縣市改制後的行政區歸檔,將 較常使用的採樣屬性(如:NO3N、NO2N、ClNO2…等)依據採樣日期之年分歸檔。
4-1-3 健保資料庫
健保資料庫中的資料每一筆紀錄結果皆為歸人的結構,包含經過轉碼的身分 證字號、生日、性別、戶籍區碼以及其就醫紀錄。健保資料庫將資料透過水平擴 充技術分片(Sharding)分散儲存於三台 mongoDB 資料庫伺服器中,存取時透過 mapreduce 技術解析資料提升效能。
4-2 分片(Sharding)
分片(Sharding)是 MongoDB 將資料儲存在叢集的一種方法,用於分散單一伺 服器負載就是將資料庫分區塊放在不同的資料庫節點上。大量的針對單一個 database daemon 進行 query,會造成 CPU 的運算負擔。大量的 data sets 也可 能會超過單一台機器所能提供的硬碟容量,所以利用分片(shard)來突破硬體限 (vertical scalability)與水平擴充(horizontal scalability)。最簡單的方法就是垂直擴 充,透過提升中央處理器(CPU)、擴充記憶體(RAM)以及增加硬體容量,以最直接 的方式提升效能加速資料庫的處理效能,然而這樣的擴充方法仍然會造成硬體上
doi:10.6342/NTU201601304
23
的限制,擴充效能相較於水平擴充其實並不符合成本。水平擴充,有效利用多台 相對低階的資料庫伺服器分散工作負荷以提升效能和可靠性達到甚至超過一台較 高階的伺服器主機,處理分散式系統具有一定的困難性需要考量速度、擴充性、
容錯性和一致性;MongoDB 中水平擴充方法又稱為分片(sharding), MongoDB 資料 庫的自動分片技術就是將原先資料庫中集合依據一定的規則切成若干分片
(shards)分散於叢集中,這些分片小塊可以視為獨立資料庫統一由 mongos 路由管 理以使用者觀點組成一個完整的資料庫,當有請求查詢或寫入時,路由會依據分 片 shard key 規則找到對應的分片進行操作。
4-2-2 MongoDB 分片機制
一個 MongoDB 的 Shared 叢集由三個角色組成:
1. 分片(Shards):
用來儲存分片後的資料,通常是一組副本集(replica set)用來提高可用 性和資料一致性。
欲對一個 collection 作分片必須選擇 shared key,MongoDB 再根據 shared key 的值將資料分割成許多個 chunks 並平均分布在 shard 中。針對 shard key 的 儲存策略分成兩種,分別是 range based 與 hash based 兩種,前者直接判斷鍵值 將集合切割成多個 chunks 而後者則會透過雜湊函式(hash function)來分配其屬 於之 chunk;為了維持分散資料的平衡,MongoDB 使用 splitting 和 balancer 兩 個背景程式來完成,當 chunk 成長為設定的大小時 Splitting 這支程式會將 chunk
doi:10.6342/NTU201601304
24
分成兩半,確保 chunks 的成長不會太大;Balancer 來管理 chunks 資料的搬移,
但這樣過程中,會產生許多資料移動的成本,要盡可能的讓這行為發生的次數降 低,當最多 chunk 數的 shard 比最少 chunk 數的 shard 多 9 個 chunk 時 MongoDB 才會開始做 Balancing 移動、合併資料的動作。
圖 4-1:Splitting
圖 4-2:Balancer
doi:10.6342/NTU201601304
25
4-3 MapReduce
MapReduce 是 MongoDB 內建分析資料的介面,讓使用者可以從分散式資料庫 中取得資料並提高查詢效能並能進行複雜的運算。
其運作機制,map task 會從 input shard 中讀取指派給他執行的資料,並將 對應需要處理的資料透過許多 map worker 同時執行,提升 performance,map worker 執行完 map function 內的程式後,最後的 output 仍是(key,value)這個 資料串,這些中間資料會先暫存成 spill 檔在記憶體中,最後會將所有 spill 檔 進行合併(merge)與排序(sort),目的是把所有有相同 key 值的資料聚集在一起,
當所有 map worker 完成工作時,Master node 就會通知 Reduce workers 執行 reduce function,每讀入一個新的 key 值時就會呼叫一次 reduce function 並傳入 key 值以及相同 key 的 value 所組成的 list,執行完後結果會寫入記憶體,當所有 reduce worker 完成工作,Master 會將控制權轉回 user program。
使用者從入口網站填寫欲查詢疾病之疾病代碼以及其他條件,如圖 4-3 所 示,每次資料搜尋會根據使用者輸入欲查詢的疾病代碼(ICD-9),系統存取資料庫 運用 MapReduce 從龐大的歸人文件資料庫中取得具有特定就醫紀錄的病患資料並 將不符合條件的紀錄去除,透過 Reduce 程式將資料利用戶籍區碼進行歸檔,並會
doi:10.6342/NTU201601304
26
樣資料中掃描每一位病患並將其依照居住區碼統計而成。
圖 4-3:入口網站
doi:10.6342/NTU201601304
疾病分布比例尺作為著色依據,利用利用 D3.js 的 scale.linear()函式,包 含 domain()與 range()兩個屬性分別為輸入範圍與輸出範圍,輸入範圍會依據相 對盛行率與絕對盛行率兩個模式而有所不同,相對盛行率模式中系統會計算該年
doi:10.6342/NTU201601304
利用 SVG(可縮放向量圖形,Scalable Vector Graphics)的物件特 性,不會隨放大與縮小而有所失真可以保持圖像清晰度,將 SVG 物件註 冊縮放事件,讓使用者可以透過滑鼠滾輪對地圖進行縮放以及拖曳,利 用 d3 資料庫的 behavior.zoom()函式進行縮放,scaleExtent 屬性設定 縮放級距的最大與最小值系統設定為[1,10],如此便能方便使用者選取
doi:10.6342/NTU201601304
doi:10.6342/NTU201601304
30
4-4-3 整合趨勢圖
利用 D3.js 建立專屬的整合趨勢圖系統;在 HTML 標籤中宣告一個 SVG 物件並 先預留圖表空間,接著利用 D3.js 所提供的 axis API 建立 X 軸與 Y 軸,包含 scale()、orient()與 ticks()三個屬性,scale()定義數值的輸入與輸出,scale() 包含三個屬性 linear()、domain()與 range(),linear()定義數值輸入以線性方 式映射,有指數(exp)與對數(log)兩種依據輸入數值的結構選擇最適當的映射模 件(circle)呈現,包含 x 座標(cx)、y 座標(cy)、半徑(r)、著色(fill)與外框 (stroke),利用 D3.js 將物件 append 在趨勢圖上,系統規劃 x 座標為疾病盛行率
doi:10.6342/NTU201601304
31
值與半徑。
水質資料庫採用動態載入的模式目的是提升效能,可以透過控制面板的其他 資料庫中勾選欲載入的資料庫(目前有自來水水質資料與水庫水質抽樣資料),系 統便會利用 Ajax 從 mongoDB 中載入對應的資料庫,由於不同資料庫均有各自的資 料結構及屬性所以必須先進行處理,將資料整合成依據縣市以及年份規劃的通用 資料結構,紀錄可用的資料庫屬性更新 Y 軸所能使用的選項,並且將水質整合趨 勢圖重新初始化。
doi:10.6342/NTU201601304
32