以下,我們會提供幾項簡易的教學,分別是
各服務連結如下
中山管院大數據分析平台是一個線上運算服務平台,提供強大的資料儲存與運算資源給管院學生。
目前有 18 台主機共 136 個核心數和 1.5TB 記憶體組成的 Hadoop 叢集(Hadoop Cluster) 以及 備載GPU運算能力的伺服器。 平台提供 RStudio 和 Jupyter 開發環境,讓使用者可以撰寫 R 和 Python 語言。
Hadoop 是什麼呢?什麼時候需要 Hadoop?
假如我們在處理的大數據資料,檔案大小超過你的電腦的容量,我們還有辦法做數據分析嗎?這時候我們就需要Hadoop了!
Hadoop 是一個能儲存並管理大量資料的雲端平台,除了能儲存單個超級大的檔案,還能夠同時儲存、處理、分析上千上萬上百萬份這種超大的檔案。所以每當講到大數據,時常會提到 Hadoop 這套技術。
下面我們提供影片與文字版的教學,讓使用者可以連上管院伺服器上的 Hadoop,並對 HDFS(Hadoop File System) 上的檔案做些簡單的操作。
連線設定
載入packages
rmr2, plyrmr, rhdfs
這些 packages 提供許多 R 的函式,讓使用者可以直接對 HDFS 系統上的檔案執行指令,例如存取資料或資料分析。
hdfs.init()
:連線 HDFS 叢集必備的步驟。
與HDFS系統互動
to.dfs()
:寫入檔案至 HDFS。
from.dfs()
:讀取 HDFS 上的檔案。
hdfs.ls()
:列出 HDFS 上的所有檔案。
hdfs.del()
:刪除 HDFS 上的所有檔案。
上述語法的 /yourAccountName/ 部分,請使用者自行將其改成自己的目錄名稱。
以上是 Hadoop 連線以及基本 HDFS 操作的介紹。
使用者可以透過更進階的「MapReduce」對 Hadoop 上的資料做操作。
既然我們有了 Hadoop 這個強大的工具來處理大數據,為何還需要 Spark 呢?而 Spark 與 Hadoop 又有什麼不同呢?
Hadoop 執行 MapReduce 運算時,會將中間產生的數據儲存在硬碟中,也就說任何的資料存取都會執行 I/O,而 I/O 往往是效能的瓶頸,因此會有讀寫資料延遲的問題。
Spark 比 Hadoop 晚四年問世,Spark 是一個基於記憶體的運算框架,在運算時,會將中間產生的數據暫存在記憶體中,因此可以大大地加快運算速度。尤其是反覆執行多次時,需讀取的資料量越大,越能看出 Spark 的效能,而 Spark 同時也與 Hadoop 相容,所以可以透過 HDFS 存儲檔案、透過 Spark 在記憶體中運算。
載入所需的 Package 並連線上 HDFS
該步驟與前面的 Hadoop 連線一樣。
設定 Spark 的連線資訊
執行完以上的程式後就可以連線上 Spark 了。
如果連線成功的話,會在 RStudio 的畫面右上角看到一個新的頁籤叫做 connection。如果連線失敗則會在下方的 console 頁籤跳出錯誤訊息。
在HDFS上存取檔案
中斷連線
接下來的範例會示範如何在 Spark 上操作巨量資料。
範例中我們會用到 babynames 資料集,資料集紀錄一百八十多萬的新生兒姓名資料。選用這個資料集的目的是要讓使用者感受在操作巨量資料時,Spark 的運算能力有多強大。
設定連線資訊&讀取資料
Spark 連線
資料集讀取
簡單查詢句:以 babynames 資料為例
當資料筆數很多的時候,因為查詢句至少要搜尋過全部資料一次,需要會花非常多的時間,何況實務上查詢句可能包含不只一個變數,必定會耗費大量運算資源。
但透過 Spark,底下的程式只需花 5 ~ 7 秒的時間就可以完成查詢,這就是 Spark 強大的地方。
以 babynames 資料為例,底下查詢句用來查詢各欄位中 不重複的資料 有幾筆。
執行結果可以看出 prop 欄位的不重複資料有 16 萬多筆,卻能夠很快就完成查詢句。
如果是直接在執行相同的查詢句,而不是透過spark做運算的話,其執行速度沒有辦法來得像spark這麼快。
資料視覺化:以 babynames 資料集為例
babynames 資料集紀錄從 1880 年開始,在美國每年出生的新生兒取哪些名字、每個名字總共被用了幾次等資訊,在資料集裡面共有 5 個columns,分別是年份、性別、姓名、總數、佔總出生人數的比重。
在範例中,寫了一個函式用來查詢特定一年中,哪些名字最常被使用來命名。另外我們也附上官方教學文件供使用者參考。
載入會用到的packages
先找出1986以後且被用來命名過超過一千次的資料,列出姓名跟性別這個兩個變數,並以topNames這個變數儲存起來。
接著用原始資料對topNames做inner_join,並且group_by年份這個變數,表示出來的結果會是各年中最代表的姓名
再來我們將上面做過的事情,寫成一個函式,以便未來想要做查詢的時候,不需要重複打這麼多程式碼,只要傳入年份變數就可以得到我們想要的結果,還可以把結果以圖形化的方式呈現出來。
透過函式給定特定年份,就可以得到該年中最常被使用的姓名是哪個。
將男生姓名及女生姓名在資料中的分佈狀況畫出來。
使用完Spark後,如果暫時沒有要再使用,務必要將其中斷連線
Greenplum database 是一種開源的分散式資料庫,它提供 PB 級別數據量的快速分析能力及對超大資料表做快速查詢的能力。
過去,當使用者要分析儲存在資料庫上的結構化資料的時候,必須先將資料表讀入分析工具中,例如將一個 table 讀進 RStudio 中,再進行資料分析、建立模型等等,但如果資料表很大的話,會造成在讀取資料的階段就耗盡了大量的運算資源。而現在有了 Greenplum 這個擁有資料分析能力的資料庫,使用者可以直接在資料庫中對資料表做資料分析、做查詢句甚至是訓練模型,並將結果直接輸出至我們的分析工具中,如此一來,就可以避免在讀取資料時大量消耗運算資源的問題,使用者可以直接對資料庫中的資料表做更快速、更彈性的操作。
底下的範例會教使用者如何用 RStudio 連線上資料庫(本院提供的資料庫為 Greenplum)以及對資料表做些簡單的查詢句。
PivotalR、DBI、RPostgreSQL
都是與資料庫操作有關的 packages,使用者可以根據自己的需求決定要載入哪些,範例中使用的語法都只有用到 RPostgreSQL package 裡面的function。ggplot2
package 是因為我們會用到 diamonds 資料集。
192.168.1.100
。
dbSendQuery()
,使用者下 SQL 去執行,執行完畢後產生一個 resultset 用來儲存結果,再透過 fetch()
讀取resultset 裡面儲存的資訊。dbGetQuery()
,直接取得使用者所下的 SQL 的執行結果。
以上是連線上資料庫與簡易的資料庫操作範例,使用可以依照自己的需求去使用一開始提到的幾個 package 內的功能,在這邊只簡單示範了幾個基本語法而已
GPU 的環境變數設定是很重要的步驟,因為在管院商業大數據平台上,運算資源是由中山大學管理學院的學生共同享有,若沒有適當地設定 GPU 環境變數的話,可能會造成系統資源被特定使用者佔用,導致其他使用者無法共享平台上的資源。以下我們會分別教學在 Python 和 R 中要如何設定GPU的環境變數。
GPU 指定
限制 GPU 用量
一次只使用一張。
限制 GPU 的記憶體使用量