深入對比數據科學工具箱: SparkR vs Sparklyr

2021-01-21 統計之都

        SparkR 和 Sparklyr 是兩個基於 Spark 的R語言接口,通過簡單的語法深度集成到R語言生態中。SparkR 由 Spark 社區維護,通過源碼級別更新 SparkR 的最新功能,最初從2016年夏天的1.5版本開始支持,從使用上非常像Spark Native。Sparklyr 由 RStudio 社區維護,通過深度集成 RStudio 的方式,提供更易於擴展和使用的方法,更強調統計特性與機器學習,實現本地與分布式代碼的一致性,通常會比 SparkR 延遲1-2個版本,從使用上看接近於dplyr。


由於 SparkR 與 Sparklyr 都是 Spark API 的封裝,故二者在計算性能上沒有顯著差異。


       兩者文檔相對來說 Sparklyr 更加豐富一些,其中包含了業界/學界大量案例,但以中文版較少。SparkR 由第三方提供了中文版文檔。


       SparkR 文檔:http://spark.apachecn.org/docs/cn/2.3.0/structured-streaming-programming-guide.html


       Sparklyr 文檔:https://spark.rstudio.com


       SparkR: 從官網下載。


       Sparklyr:

sparklyr::spark_install(version = "2.3.0", hadoop_version = "2.7")

不依賴於Spark版本,spark 2.X 完美兼容1.X。

       

       Spark 環境配置需要注意的問題:

下載和 Hadoop 對應版本號的發行版,具體可以通過 sparklyr::spark_available_versions() 查詢可用的spark版本

JAVA_HOME/SPARK_HOME/HADOOP_HOME 是必須要指定的環境變量,建議使用 JDK8/spark2.x/hadoop2.7

yarn-client/yarn-cluster 模式需要設置環境變量 

Sys.setenv("HADOOP_CONF_DIR"="/etc/hadoop/conf")

連接 Hive 需要提供 Hive 連結配置, 在 spark-connection 初始化時指定對應 hive-site.xml 文件


       由於不同發行版本的 Hadoop/Yarn 集群略有差異,環境 Setup 問題可以留言討論。


       SparkR:

Sys.setenv("SPARKR_SUBMIT_ARGS"="--master yarn-client sparkr-shell")

sc <- SparkR::sparkR.session(enableHiveSupport = T,
                            sparkHome = "/data/FinanceR/Spark")

       Sparklyr:

sc <- sparklyr::spark_connect(master = "yarn-client",
                            spark_home = "/data/FinanceR/Spark",
                            version = "2.2.0",
                            config = sparklyr::spark_config())


       以寫Parquet文件為例,同理你可以用 SparkR::write.*()/sparklyr::spark_write_*() 等寫入其他格式文件到HDFS上,比如 csv/text。


什麼是 Parquet 文件? Parquet 是一種高性能列式存儲文件格式,比CSV文件強在內建索引,可以快速查詢數據,目前普遍應用在模型訓練過程。


       SparkR:

df <- SparkR::as.DataFrame(faithful)

SparkR::write.parquet(df,path= "/user/FinanceR",mode="overwrite",partition_by = "dt")


       Sparklyr:

df <- sparklyr::copy_to(sc,faithful,"df")

sparklyr::spark_write_parquet(df,path="/user/FinanceR",mode="overwrite",partition_by = "dt")


        dplyr 集成 spark/mysql 需要用到遠程處理模式。它要求先定義數據源表,再通過一系列dplyr操作惰性求值,直到執行 head() 或者 collect() 等觸發函數,才會執行計算過程,並將數據返回。如此設計是因為大數據集如果立即處理是無法優化數據處理流程的,通過惰性求值的方式,系統會在遠程機器上自動優化數據處理流程。


       以統計計數為例:

       從 db.financer_tbl 表中給 b 列 +2 後賦值為 a,過濾出 a > 2 條件下,每個 key 對應出現的次數並按照升序排序,最後去除統計缺失值。

       

       SparkR:

library(SparkR)
library(magrittr)

remote_df = SparkR::sql("select * from db.financer_tbl limit 10")

remote_df %>%
   mutate(a = df$b + 2) %>%
   filter("a > 2")%>%
   group_by("key")%>%
   count()%>%
   withColumn("count","cnt")%>%
   orderBy("cnt",decrease = F)%>%
   dropna() ->
   pipeline
   
pipeline %>% persist("MEM_AND_DISK")
pipeline %>% head()


       Sparklyr:

library(sparklyr)
library(dplyr)

remote_df = dplyr::tbl(sc,from = "db.financer_tbl")

remote_df %>%
   mutate(a = b+2) %>%  
   filter(a > 2)%>%
   group_by(key)%>%
   summarize(count = n())%>%
   select(cnt = count)%>%
   order_by(cnt)%>%
   arrange(desc(cnt))%>%
   na.omit() ->
   pipeline
   
pipeline %>% sdf_persist()
pipeline %>% head() %>% collect()


       SparkR: 

df <- SparkR::sql('SELECT * FROM financer_tbl WHERE dt = "20180318"')


       Sparklyr:

       由於 Sparklyr 通過 dplyr 接口操作,所以,所有數據操作幾乎和 MySQL 完全一樣,學習成本≈0。

df <- sc %>%
     dplyr::tbl(dplyr::sql('SELECT * FROM financer_tbl WHERE dt = "20180318"'))

sc %>% DBI::dbGetQuery('SELECT * FROM financer_tbl WHERE dt = "20180318" limit 10') df %>% dbplyr::sql_render()


       分發機制:

       系統會將本地依賴文件壓縮打包上傳到HDFS路徑上,通過 Spark 動態分發到執行任務的機器上解壓縮。 執行任務的機器本地獨立的線程、內存中執行代碼,最後匯總計算結果到主要節點機器上實現R代碼的分發。


       SparkR:

func <- function(x){x + runif(1) }
SparkR::gapplyCollect(x = df, func = func,group = "key")


       Sparklyr:

func <- function(x){x + runif(1) }
sparklyr::spark_apply(x = df,packages=T,name = c("key","value"),func =func,group = "key")


       SparkR 手動通過 spark.addFile 加載本地依賴,而 Sparklyr 打包本地 R 包只需通過 package = TRUE 參數即可,最大化減少學習成本。


什麼是流式計算? 流式計算是介於實時與離線計算之間的一種計算方式,以亞秒級準實時的方式小批量計算數據,廣泛應用在網際網路廣告、推薦等場景。


       SparkR:

stream <- SparkR::read.stream(
           source = "kafka",
           "kafka.bootstrap.servers" = "a1.financer.com:9092,
                                        a2.financer.com:9092",
           "subscribe" =  "binlog.financer.financer")
           
stream %>%
 SparkR::selectExpr( "CAST(key AS STRING)", "CAST(value AS STRING)") %>%
 SparkR::selectExpr("get_json_object(value,'$.data') as data") %>%
 SparkR::selectExpr("get_json_object(data,'$.ORDERID') as orderid"
            ,"get_json_object(data,'$.USERID') as userid"
            ,"get_json_object(data,'$.TS') as ts"
            ) %>%
 SparkR::withWatermark("ts", "5 minutes") %>%
 SparkR::createOrReplaceTempView("financer")
 
"
select userid,window.start as ts,count(1) as cnt
from financer
group by userid, window(ts, '5 seconds')
" %>%
SparkR::sql() %>%
 SparkR::write.stream("console",outputMode = "complete") ->
 query


       Sparklyr: 暫時不支持流式計算,功能開發中。


什麼是圖計算? 圖計算是以「圖論」為基礎的對現實世界的一種「圖」結構的抽象表達,以及在這種數據結構上的計算模式。 通常,在圖計算中,基本的數據結構表達就是: 

G = (V,E,D) 

V = vertex (頂點或者節點) 

E = edge (邊) 

D = data (權重)


       SparkR: 不直接支持 Graph Minining。

       Sparklyr: 通過拓展程序,graphframes 實現圖挖掘,比如Pagerank、LPA等。


       下面是一個通過 graphframes 實現 Pagerank 的例子:

library(graphframes)

highschool_tbl <- copy_to(sc, ggraph::highschool, "highschool")


vertices_tbl <- sdf_bind_rows(
 highschool_tbl %>% distinct(from) %>% transmute(id = from),
 highschool_tbl %>% distinct(to) %>% transmute(id = to)
)


edges_tbl <- highschool_tbl %>% transmute(src = from, dst = to)

gf_graphframe(vertices_tbl, edges_tbl) %>%
 gf_pagerank(reset_prob = 0.15, max_iter = 10L, source_id = "1")


       SparkR 不直接支持 Deep Learnig。Sparklyr 通過拓展程序 Rsparkling 實現深度學習,比如 Anto-Encoder。


        目前,SparkR 僅在實時計算上領先於 Sparklyr,在圖計算、機器學習、深度學習等領域已經被拉開差距,在大多數場景下,Sparklyr將是一個更好的選擇,在不久的將來,Sparklyr也將集成Streaming模塊,屆時將全面覆蓋SparkR功能。


        相比於 pandas 和 pyspark,R 和 SparkR 的差異更小,並且如果你已經掌握了 dplyr 操作 mysql 的方法,學習 Sparklyr 將變得十分容易,因為他們共用同一套數據處理的語法,使用spark幾乎只有參數配置的學習成本, 更多 Sparklyr 教程可見 Sparklyr 官網 spark.rstudio.com 以及 Sparklyr 使用手冊: https://github.com/rstudio/cheatsheets/raw/master/translations/chinese/sparklyr-cheatsheet_zh_CN.pdf


https://eddjberry.netlify.com/post/2017-12-05-sparkr-vs-sparklyr/

https://github.com/rstudio/sparklyr/issues/502

https://databricks.com/session/r-and-spark-how-to-analyze-data-using-rstudios-sparklyr-and-h2os-rsparkling-packages

https://github.com/kevinykuo/sparklygraphs

http://docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/deep-learning.html

https://github.com/rstudio/graphframes



作者:朱俊輝

審稿:郎大為、黃俊文、朱雪寧




點擊查看原文連結:https://cosx.org/2018/05/sparkr-vs-sparklyr/ 或「閱讀原文」





統計之都:專業、人本、正直的中國統計學社區。



關注方式:掃描下圖二維碼。或查找公眾帳號,搜索 統計之都 或 CapStat 即可。

往期推送:進入統計之都會話窗口,點擊右上角小人圖標,查看歷史消息即可。




相關焦點

  • 大數據掃盲——什麼是spark
    spark的出現就彌補了MapReduce的不足。 spark是一種基於內存的快速、通用、可擴展的大數據計算引擎。它集批處理、實時流處理、交互式查詢、圖計算與機器學習於一體Spark應用場景批處理可用於ETL(抽取、轉換、加載)。 機器學習可用於自動判斷淘寶的買家評論是好評還是差評。 交互式分析可用於查詢Hive數據倉庫。
  • 「sparkr+sparkr mini」 打火機手電筒完美合體
    「sparkr」與「sparkr mini」將他們「古怪的」設計特色與生產日常用品的願望相結合。這套造型別致的多功能全新系列作品能夠讓使用者們隨時隨地生火或照明。經過無數次的討論,power practical的工業設計師mckay nilson 開始著手模擬「sparkr」可能的外形。設計定稿後,整個團隊立即開始打造產品原型進行測試。
  • 每個數據科學家都得會一點SparkMagic
    即使是21世紀最具吸引力的工作,數據科學依然逃不脫這一定律。商業數據科學家80%的時間都花在查找、清洗和準備數據上,這是數據科學家工作中效率最低也是最可怕的部分。網際網路為如何打破數據科學的80/20定律提供了許多的意見,但卻收效甚微。
  • 大數據分析工程師入門9-Spark SQL
    2.Spark SQL特性其實最初Spark團隊推出的是Shark-基於Hive對內存管理、物理計劃、執行做了優化,底層使用Spark基於內存的計算引擎,對比Hive性能提升一個數量級。大數據處理使用SQL進行大數據處理,使傳統的RDBMS人員也可以進行大數據處理,不需要掌握像mapreduce的編程方法。
  • Spark在360商業數據部的應用實踐
    2.2 基於SparkSQL和DataFrame的數據分析需求SparkSQL是Spark的核心組件,作為新一代的SQL on Hadoop的解決方案,完美的支持了對現有Hive數據的存取。在與Hive進行集成的同時,Spark SQL也提供了JDBC/ODBC接口,便於第三方工具如Tableau、Qlik等通過該接口接入Spark SQL。
  • 業界| 四大機器學習程式語言對比:R、Python、MATLAB、Octave
    原標題:業界 | 四大機器學習程式語言對比:R、Python、MATLAB、Octave 選自 towardsdatascience 作者:作者列出了這些語言(工具)的優缺點,希望對想開始學習它們的人有用。
  • 放棄PK,擁抱合作——R和 Python 能做出什麼新花樣?
    from-r-vs-python-to-r-and-python-aa25db33ce17我們更應該關注的是技能,而不是工具。如果你想進入數據科學領域,你可能立即會想到R和Python。然而,我們並不是要以作為兩種選擇來考慮他們,相反地,我們更多的是去比較他們。R和Pyhton在他們各自的領域裡,都是非常完美的工具。儘管如此,他們往往成為各自敵人而爭吵。如果你在谷歌搜索欄裡輸入「R vs Python」,你會看到非常多的關於他們霸權之爭。
  • 停止使用Pandas並開始使用Spark+Scala
    Spark核心概念   · DataFrame:spark DataFrame是一種與Pandas DataFrame非常相似的數據結構  · Dataset:數據集是類型化的數據框,對於確保數據符合預期的架構非常有用  · RDD:這是Spark中的核心數據結構,在其上構建了DataFrame和Dataset  通常,我們會儘可能使用數據集
  • Python與R、Matlab在數據分析的趨勢對比
    Python與R語言的對比 Python與R語言在數據分析領域的對比,DataCamp上有一篇引用率非常高的文章,數據分析選擇R還是Python,不過這篇文章是2015年寫的,我們先大致總結一下文章內容: R主要用於學術與研究,也開始迅速進入企業市場,越是接近統計學、研究、數據科學,你就會越偏愛
  • 數據分析工程師面試集錦5——Spark面試指南
    3.Spark提供了豐富的開箱即用算子工具,讓開發者可以快速的用Java、Scala或Python編寫程序。它本身自帶了一個超過80個的高階操作符集合。 3、Spark中Worker的主要工作是什麼?;2.hadoop的job只有map和reduce操作,表達能力比較欠缺而且在mr過程中會重複的讀寫hdfs,造成大量的io操作,多個job需要自己管理關係;而spark則提供了豐富的算子,可以實現常用的各種數據處理操作。
  • Polarr 想用免費專業圖片處理工具,在數據的幫助下幫助專家和小白...
    今天在36氪開放日矽谷站路演的Pollar 想要通過在線免費專業工具,在吸引專業用戶的同時引導入門用戶獲得更好的照片成品。根據 Pollar 團隊展示的數據:在美國,Instagram、Photor、Afterlight 等工具類應用的用戶有 4500 萬人,而 Lightroom、DXO Optics Pro 的用戶僅有 500 萬。
  • 手把手教你在本機安裝spark
    言歸正傳,spark鼎鼎大名,凡是搞分布式或者是大數據的應該都聽說過它的大名。它是apache公司開發的一個開源集群計算框架,也就是分布式計算框架。相比於Hadoop的MapReduce,它支持更多的功能,並且運算速度也更快,如今已經成了非常主流的大數據計算框架。幾乎各大公司當中都有它的身影。
  • 基於Bert和通用句子編碼的Spark-NLP文本分類
    自然語言處理(NLP)是許多數據科學系統中必須理解或推理文本的關鍵組成部分。常見的用例包括文本分類、問答、釋義或總結、情感分析、自然語言BI、語言建模和消歧。NLP在越來越多的人工智慧應用中是越來越重要。如果你正在構建聊天機器人、搜索專利資料庫、將患者與臨床試驗相匹配、對客戶服務或銷售電話進行分級、從財務報告中提取摘要,你必須從文本中提取準確的信息。
  • 【大數據】最新大數據學習路線(完整詳細版】
    ,redis)Spark(scala,spark,spark core,spark sql,spark streaming,spark mllib,spark graphx)Python(python,spark python)?
  • 烏海spark培訓_博雅環球教育放心之選
    烏海spark培訓,博雅環球教育放心之選,是以網際網路企業技術研發、軟體開發、大數據分析、雲計算、人工智慧開發應用等網際網路技術為依託,以校企專業共建,崗前技能實訓,高薪就業安置,網際網路人才外包服務等業務為核心的高端就業培訓。烏海spark培訓, Oracle認證講師、Microsoft認證講師。
  • 大數據分析與數據分析的根本區別在哪裡?
    數據分析是指用適當的統計分析方法對收集來的大量數據進行分析,提取有用信息和形成結論而對數據加以詳細研究和概括總結的過程。大數據分析與數據分析最核心的區別是處理的數據規模不同,由此導致兩個方向從業者的技能也是不同的。在CDA人才能力標準中從理論基礎、軟體工具、分析方法、業務分析、可視化五個方面對數據分析師與大數據分析師進行了定義。
  • 數據可視化之R語言
    分類數據的可視化使用條形圖、點圖、柱形圖、脊柱圖、馬賽克圖、餅圖及四折圖連續數據的可視化使用箱線圖、直方圖、散點圖及其變種、帕累託圖==============================================一、分類數據的可視化
  • kdnuggets:2017年Python打敗R成數據科學、機器學習中最熱門語言
    近日,kdnuggets做了一個關於數據科學、機器學習語言使用情況的問卷調查,他們分析了954個回答,得出結論——Python已經打敗R語言,成為分析、數據科學和機器學習平臺中使用頻率最高的語言。有關此次問卷更具體的情況如何?
  • RFID智能化工具管理解決方案——智能工具櫃,工具車,工具箱
    所以在這些情景下我們就要運用RFID技術,製造成三種智能終端的設備形態:RFID工具櫃嗎,RFID工具車,RFID工具箱,從而智能化的管理這些大大小小的工具。我們先在各種工具上安裝上RFID電子標籤,之後在指定場所的關鍵位置安裝上讀寫器,這樣在後臺就可以實時監控這些工具所在的位置。
  • 2017年中美數據科學對比報告,Python排名第一,年薪中位數高達11萬...
    不過,因為中國的數據收集不夠全面,而美國數據也同樣存在清洗不夠的情況,所以,以下數據僅供參考。希望Kaggle下次能將數據做得更透徹更深入更全面。以下為AI科技大本營對其進行的數據整理,並從中美數據科學和機器學習對比的角度呈現如下:中美數據工作者概況對比年齡從世界範圍來看,本次調查對象的平均年齡大約 30 歲,當然,這個值在各個國家之間有變動。以下為中美調查對象的年齡對比: