2018年4月11日 星期三

使用 sparklyr 的經驗分享之一: 連接失敗多半是 Java_Home 沒指定

R處理大規模數據時,ETL往往需要克服一些問題。以讀取資料為例,需要一些技巧來提高讀資料的速度。原始資料讀取後,轉換存取用 feather 或 pigz 都是高效能的好方法,或以記憶體管理為方向的 bigmemory 都是好方法。本文主要解說啟動 sparklyr 連接失敗的問題如何克服,多半是Java_home沒有適當的指定,或版本須要更新。

以 1.5G 的範例檔 exampleFile.csv (1千萬列,10個行變數),硬體 64位元 PC Intel Core(TM) i7-4700 CPU 3.40 GHz,32 GB 記憶體。我們先看看三個原始資料的子載入速度:

read.csv 讀取需 8分鐘。
> system.time(csvData <- read.csv("exampleFile.csv"))
   user  system elapsed 
 473.68    4.11  494.14

data.table::fread 需 55秒:
> system.time(freadData <- fread("exampleFile.csv")) 
   user  system elapsed 
  53.96    0.41   55.31

版本2.2.1的 Spark,R 套件 sparklyr 則只20秒
> library(sparklyr)
> sc <- spark_connect(master="local")
> system.time(sparkDF <- spark_read_csv(sc, name= "spDF", path= "exampleFile.csv"))
   user  system elapsed 
   0.10    0.00   19.22

sparkDF 是 Spark data frame, sparklyr 無法存成正規的 Spark 資料庫,所以 sparklyr 只能以 data.frame 存在工作空間。但是, feather pigz 都可以有效管理Spark data frame的存取。只要是 spark data frame, Spark 的機器學習工具都可以有效使用,sparklyr 的環境也可以把 R data frame轉成 spark data frame.

  sparklyr 有一些優點,但是啟動 spark_connect(master="local")會遇到一些錯誤訊息,這些錯誤訊息,關鍵在於Java_Home路徑沒有清楚的在電腦中被指定。如果使用時出現錯誤,最主要的問題都是Java_Home不存在。檢查方法如下:在 cmd 環境執行 echo %Java_Home% 查一下Java_Home路徑是否存在。

  如果沒有裝好 Java,則請先安裝Java。
  如果你還沒裝置套件,則:
install.packages("sparklyr") #裝套件

sparklyr::spark_install(version = "2.2.1") #安裝Spark

  再由控制台->系統,如下圖 


  將正確的 Java_Home 路徑書寫進去,退出後,重新啟動R,目前為止,都可以成功執行 sc <- spark_connect(master="local")的連結。一旦連結成功,建立 Spark data frame的方法很簡單:
                 RDF_tbl <- copy_to(sc, R_data.frame)

  只要是Spark data frame,所有 Spark 的機器學習工具都可以使用。 15 GB 的資料(美國上市公司財報資料庫),很快就可以完成演算,不會當機。詳細的說明,下一則再來繼續。









沒有留言:

張貼留言