[劉勇 陸小慧]
Hadoop 是一個由Apache 基金會所開發(fā)的分布式系統(tǒng)基礎架構。用戶可以在不了解分布式底層細節(jié)的情況下,開發(fā)分布式程序,充分利用集群的威力進行高速運算和存儲。
Hadoop 實現了一個分布式文件系統(tǒng)HDFS(Hadoop Distributed File System),HDFS 有高容錯性的特點,并設計用來部署在相比小型機更為廉價的(Low-cost)PC服務器上;而且它提供高吞吐量(High throughput)來訪問應用程序的數據,適合那些有著超大數據集(Large data set)的應用程序。HDFS 放寬了POSIX 的要求,可以以流的形式訪問(Streaming access)文件系統(tǒng)中的數據。
Hadoop 框架最核心的設計是HDFS 和MapReduce:HDFS 為海量的數據提供了存儲方式,MapReduce 為海量的數據提供了計算方式。
目前Hadoop 在大數據的通行市場上占據主導地位?;陂_源免費、硬件廉價、開發(fā)便利這3 個原因使得Hadoop 市場份額逐年高速遞增。事實上在軟件的成本之外,硬件產生的經濟成本更為可觀,如何降低硬件成本是每一個應用運營商都在考慮并尋求解決方案的課題。
目前Intel 公司的CPU 占據著市場的主導地位,導致PC 服務器的CPU 價格居高不下,一顆服務器至強E3 型號的4 核CPU 處理器價格在1 500 元左右。而智能終端所用的CPU 處理器,如聯(lián)發(fā)科MT6582 處理器只有42 元。這兩者價格相差30 倍左右,功耗相差1 000 倍左右。而兩者之間的性能差距,平均到單核上,至強處理器只有智能終端處理器的5 倍左右。
一臺100 個智能終端組成的集群(如手機集群),成本可以控制在1 到2 萬元,物理體積和一臺普通PC 服務器相當,計算性能是一臺PC 服務器的5~10 倍,功耗可以控制在PC 服務器的1/10 到1/20。
在現有技術上,基于智能終端的Android 系統(tǒng)不能支持Hadoop 的運行,本方案是建立一個中間層保障Hadoop和Android 之間的適配以及運行。
本文所述智能終端以手機終端進行舉例,不限制于運行Android 系統(tǒng)的手機終端、PAD、機頂盒,以及運行Android 系統(tǒng)的各類手持設備。
一個大數據計算集群是由分布式軟件和硬件集群一起組成的,本文研究并提供一個優(yōu)秀的廉價、易用、便攜的大數據計算和存儲平臺。使用本平臺后,能快速、方便且更為廉價地為企業(yè)提供分布式計算、云計算服務。
2.1.1 Hadoop on Android
基于Android 系統(tǒng)的Hadoop 分布式計算平臺,使得Hadoop 可以在 Android 系統(tǒng)上正常運行;并且提供Hadoop 運行時軟件和硬件的健康監(jiān)控,損壞時觸發(fā)對軟件的修復或對硬件的替換。
2.1.2 軟件架構
圖1 為移動云計算中間平臺在軟件系統(tǒng)的位置,該平臺位于Android 系統(tǒng)和Hadoop 之間。
圖1 軟件架構
圖2 移動云計算中間平臺內功能模塊
模塊一:硬件驅動
移動云計算中間平臺為操作系統(tǒng)加載硬件驅動,該驅動主要為網絡控制器服務。
模塊二:Hadoop 支撐Java 庫
移動云計算中間平臺為Hadoop 提供Android 系統(tǒng)缺少的Java 庫。Android 系統(tǒng)支持一部分Java 功能,該平臺可補足Android 系統(tǒng)中缺少的Java 庫。
模塊三:硬件健康監(jiān)控
移動云計算中間平臺為智能終端提供硬件健康監(jiān)控,監(jiān)控并提供修復操作。當硬件出現問題后會進行重連/重啟操作,多次重連/重啟失敗后,提示替換該硬件。監(jiān)控功能使用心跳檢測機制以及溫度檢測來監(jiān)控硬件。
模塊四:配置自動獲取
網絡配置自動化:移動云計算中間平臺能夠在第一次啟動時,為智能終端分發(fā)一個固定地址,當在無線連接下,IP 地址由無線DHCP 自動分配,讀取分配的IP 地址寫入Hadoop 配置文件中。
同時,根據加入集群的智能終端的計算能力、存儲大小來自動設置Hadoop 的運行配置。
模塊五:計算存儲資源管理
在當前Hadoop 計算和存儲控制的基礎上整合到平臺中,對計算和存儲的資源進行軟件管理,基于計算存儲資源的飽和度來進行資源平衡處理。
當集群接收外來寫入和計算任務時,先確認當前集群中機器的資源使用狀況,然后調取Hadoop 的任務分配方法:存儲已經超出設定限額上限的將不接受寫入操作,計算超出設定限額上限的將不接受計算任務;當存儲低于設定限額下限時將優(yōu)先寫入,直到到達設定限額的上限;當計算低于設定限額下限時將優(yōu)先接受計算任務;直到到達設定限額的上限;其他處于上限和下限之間的機器獲取任務時進行隨機分配。
模塊六:系統(tǒng)日志處理
當系統(tǒng)日志大于設定的范圍值時,日志的存儲進行FIFO(First in first out) 存儲。也就是先刪除遠期日志,然后存儲最新的日志。
模塊七:云計算任務調度
提供給外部接口進行云計算管理,該管理包括啟動、停止、暫停、定時等功能。
圖3 為移動云計算中間平臺功能流程圖,詳細描述了一臺智能終端在安裝移動云計算中間平臺后各模塊的工作流程情況。
圖3 移動云計算中間平臺功能流程圖
2.2.1 Android API 接口的封裝
Hadoop 通過移動云計算中間平臺對底層Android 系統(tǒng)調用各API 功能接口進行數據讀寫、計算等任務。
(1)手機內存數據讀寫
getFileDir():得到Hadoop 在手機內存存儲數據的位置/data/data/Hadoop/files
getCacheDir():得到Hadoop 在手機內存緩存數據的位置/data/data/Hadoop/cache
openFileInput(String name):直接得到/data/data/Hadoop/files/name 文件的輸入流
openFileOutput(String name,int mode):直接得到/data/data/Hadoop/files/name 文件的輸出流,mode 為寫入文件時的權限
Context.MODE_PRIVATE:私有模式(默認模式),只能被應用本身和同一群組的人訪問;寫入的內容覆蓋原文件內容
Context.MODE_APPEND:追加模式也是私有模式,只能被應用本身和同一群組的人訪問;如果文件存在就追加內容,如果文件不存在就新建文件并寫入內容
Context.MODE_WORLD_READABLE:所有人可讀權限
Context.MODE_WORLD_WRITEABLE:所有人可寫權限
(2)SDcard 數據讀寫
getExternalStorageDirectory():得到Hadoop 所在智能終端的SDcard 位置/storage/sdcard
getExternalStorageState():得到Hadoop 所在智能終端的SDcard 的當前狀態(tài),比較常用的是MEDIA_MOUNTED
使用FileInputStream 讀取文件
使用BufferReader 讀取文件
httpConnection 讀取流保存成String 數據
使用FileOutputStream 寫入文件
使用BufferedWriter 寫入文件
(3)Hadoop 計算使用Java 的加(+)減(-)乘(*)除(/)四則運算
2.2.2 Hadoop on Android 存儲和計算過程
Hadoop HDFS 集群有兩類節(jié)點,并以“管理者—工作者”模式運行,即一個NameNode(管理者,Master)和多個DataNode(工作者)。每一個NameNode 和DataNode 都各對應一臺智能終端。
NameNode 是管理者(Master),主要負責管理HDFS文件系統(tǒng),具體包括namespace 管理、block 管理;DataNode 主要是用來存儲數據文件。HDFS 將一個文件分割成一個個的block,這些block 可能存儲在一個DataNode 上或者是多個DataNode 上。DataNode 負責實際的底層文件的讀寫,如果客戶端client 程序發(fā)起了讀HDFS 上的文件的命令,那么首先將這些文件分成block,然后NameNode 將告知client 這些block 數據是存儲在哪些DataNode 上的,之后,client 將直接和DataNode 交互。
(1)Hadoop on Android 存儲數據過程
我們以文件上傳到分布式集群進行Hadoop on Android 存儲數據的過程進行舉例。
NameNode 負責管理存儲在Hadoop HDFS 上所有文件的元數據,它會確認客戶端的請求,并記錄下文件的名字和存儲這個文件的數據節(jié)點(DataNode)集合。它把該信息存儲在內存中的文件分配表里。
例如,客戶端發(fā)送一個請求給NameNode,說它要將“swimmer.txt”文件寫入到HDFS。那么,其執(zhí)行流程如圖4 所示。具體為:
圖4 文件上傳到Hadoop on Android 分布式集群流程圖
步驟1,客戶端發(fā)消息給NameNode,說要將“swimmer.txt”文件寫入。
步驟2,NameNode 發(fā)消息給客戶端,叫客戶端寫到DataNode A、B 和D,并直接聯(lián)系DataNode B。
步驟3,客戶端發(fā)消息給DataNode B,叫它保存一份“swimmer.txt”文件,并且發(fā)送一份副本給DataNode A和DataNode D。
步驟4,DataNode B 發(fā)消息給DataNode A,叫它保存一份“swimmer.txt”文件,并且發(fā)送一份副本給DataNode D。
步驟5,DataNode A 發(fā)消息給DataNode D,叫它保存一份“swimmer.txt”文件。
步驟6,DataNode D 發(fā)確認消息給DataNode A。
步驟7,DataNode A 發(fā)確認消息給DataNode B。
步驟8,DataNode B 發(fā)確認消息給客戶端,表示寫入完成。
這樣,一份“swimmer.txt”文件就保存在了分布式集群A、B、D 三個數據節(jié)點(智能終端)上。
(2)Hadoop on Android 計算過程
在Hadoop on Android 中,每個MapReduce 任務都被初始化為一個Job,每個Job 又可以分為兩種階段:map階段和reduce 階段。這兩個階段分別用兩個函數表示,即map 函數和reduce 函數。map 函數接收一個
2.2.3 無線連接
一般常見的智能終端,在安裝移動云計算中間平臺和Hadoop 之后,使用穩(wěn)定的無線連接,經過本平臺對Hadoop 進行配置后,即可進行Hadoop 之上的各組件的使用。
圖5 Hadoop on Android 處理大數據集的過程
比如你所在的辦公室,可以把大家的智能終端集中到一個集群內,實現計算資源和存儲資源共享。一個人的手機無法做到的較大計算量,通過十幾個人的手機就可以組建起集群,然后完成本來不能完成的計算量。
無線連接又分為WIFI 網絡與移動網絡(4G/5G/……)兩種集群組建方式;具體實現過程,在實施例里詳細描述。
無線網絡(含WIFI,4G、5G、……)的組網圖如圖6 所示,連接流程以如下步驟(見圖7 所示)進行:
圖6 無線網絡連接組網圖
圖7 無線網絡連接流程圖
步驟1,將智能終端移入現有集群無線網絡。
步驟2,獲取并安裝好移動云計算中間平臺及Hadoop 平臺。
步驟3,使用移動云計算中間平臺配置Hadoop 系統(tǒng)網絡(具體過程可見圖3)。
在這里,我們設置連接方式Connection 參數 1:WIFI,2:移動網絡。
在本實施例,Connection 傳入參數2,則移動云計算中間平臺根據該移動網絡里面的DHCP 機制給新加入節(jié)點(智能終端)分配IP 地址;并寫入集群配置文件中去。
步驟4,啟動Hadoop 集群組件。
步驟5,進行集群內數據資源遷移以及計算資源整合(balance)。
在這里,移動云計算中間平臺會根據新節(jié)點(智能終端)的存儲和計算資源情況,自行進行數據資源遷移以及計算資源整合。我們設置每個節(jié)點的存儲資源上限為總存儲資源的80%以及下限為總存儲資源的5%;設置每個節(jié)點的CPU 計算資源上限為CPU 利用率達到80%以及下限為CPU 利用率達到5%;其中上限、下限的設置閾值可以按需調整。
移動云計算中間平臺根據設置閾值,進行如下操作:
當該節(jié)點存儲已經超出設定限額上限時將不接受寫入操作;
當計算超出設定限額上限時將不接受計算任務;
當存儲低于設定限額下限時將優(yōu)先寫入,直到到達設定限額的上限;
當計算低于設定限額下限時將優(yōu)先接受計算任務;直到到達設定限額的上限;
其他處于上限和下限之間時,獲取任務時進行隨機分配。
對于移動網絡(Connection=2),考慮到傳輸速率以及流量資費的因素,我們設置一個數據壓縮參數Compress參數1:壓縮,0:不壓縮。
當Connection=2 時,Compress 參數默認設置為1,數據傳輸時進行壓縮,以獲得高傳輸速率,降低流量資費。
當Connection=1 時,Compress 參數默認設置為0,數據傳輸不進行壓縮,同時可減輕CPU 運算壓力。
步驟6,調用本平臺接口,提交Hadoop 任務進行運行。
步驟7,各數據節(jié)點完成任務計算,并反饋給主節(jié)點。
退出集群步驟:
步驟8,某個數據節(jié)點申請退出集群。
步驟9,主節(jié)點進行數據資源遷移并進行計算資源整合(balance)。
步驟10,資源整合完成后,數據節(jié)點退出集群。
在本實施例,我們舉個典型應用場景進行詳細描述本平臺及系統(tǒng)的工作流程。
假設在一個房間,我們有5 個人手持5 臺性能不一的Android 系統(tǒng)的智能手機,測試使用一款大型游戲,該游戲因計算量大且產生數據多,在一些計算和存儲性能都比較低的手機,因不符合該游戲運行最低要求,運行非常卡頓甚至無法運行。我們可以使用本文的技術來解決,使得每臺手機都能流暢的運行該游戲。
圖8 示例畫出2 臺設備即Master 主節(jié)點與一臺Slave 節(jié)點之間的業(yè)務流程;Master與其他Slave 節(jié)點之間的業(yè)務流程與圖8 所示的業(yè)務流程一樣。
圖8 典型應用場景流程圖
步驟1,安裝好移動云計算中間平臺、Hadoop、游戲應用。
步驟2,移動云計算中間平臺對Android系統(tǒng)及Hadoop 平臺進行相關配置并生效(具體過程可見圖3)。
步驟3,各節(jié)點檢測游戲應用占用資源情況,并反饋到各節(jié)點的Hadoop 平臺;各Slave 節(jié)點Hadoop 平臺收到后,反饋到Master 節(jié)點。
步驟4,Master 節(jié)點根據各節(jié)點存儲和計算資源情況,自動進行數據資源遷移以及計算資源整合。
步驟5,游戲應用開始使用,Master 節(jié)點收到使用行為和任務后,為各Slave 節(jié)點分配計算和存儲任務。
步驟6,各Slave 節(jié)點向Master 節(jié)點反饋計算結果和存儲結果,Master 節(jié)點進行計算結果和存儲結果匯總。
步驟7,Master 節(jié)點反饋游戲應用運算結果和存儲結果。
步驟8,在游戲應用的計算任務和存儲任務進行過程中,移動云計算中間平臺進行日志的存儲,使用FIFO 方式存儲。
步驟9,在游戲應用的計算任務和存儲任務進行過程中,移動云計算中間平臺進行各節(jié)點的硬件健康監(jiān)控。
步驟10,游戲應用結束,Master 節(jié)點通知各Slave 節(jié)點釋放計算資源和存儲資源。
步驟11,各Slave 節(jié)點向Master 節(jié)點反饋計算資源和存儲資源釋放結果。
通過本文,我們實現了移動云計算中間平臺,一種基于Android 系統(tǒng)的Hadoop 分布式計算平臺,該平臺使得Hadoop 可以在 Android 系統(tǒng)上運行;并且清楚地描述了智能終端可以非常方便的組建、加入/移出無線網絡組建的分布式集群。通過上述兩點,實現了使用更為廉價且方便更換的智能終端作為平臺,降低了分布式集群的成本。這樣,我們就提供一個優(yōu)秀的廉價、易用、便攜的大數據計算和存儲平臺。使用本平臺后,能快速、方便且更為廉價地為企業(yè)或團體提供分布式計算、云計算服務。
后續(xù)改進思考:
因無線網絡存在地理位置、覆蓋范圍等弱網絡影響因素,以及智能終端存在運動中、通話中、低電量等場景,數據傳輸存在不穩(wěn)定性。因此,為了提高通信及數據傳輸的穩(wěn)定性,我們可以改造智能終端,使用有線連接方式,這樣集群的可靠性可以得到保障,數據傳輸速度可以得到加強。
使用有線連接方式的集群硬件來源可以為定制的智能終端,也可以使用現有智能終端進行有線通信的改造。如對智能終端數據傳輸接口進行改造,通過轉換數據傳輸接口為雙絞線或者光纖線通信,以增強數據傳輸的穩(wěn)定性等。
此外,對于個人智能終端加入集群存在的隱私擔憂,也可以通過在設備上劃分獨立存儲區(qū)域、數據通信認證、個人數據保護等手段以保證隱私。在此不再行文贅述。