通過 Spark R 操作 Hive


作為數據工程師,我日常用的主力語言是R,HiveQL,Java與Scala。R是非常適合做數據清洗的腳本語言,並且有非常好用的服務端IDE——RStudio Server;而用戶日志主要儲存在hive中,因此用HiveQL寫job也是日常工作之一;當然R的執行效率確實不靠譜,因此還需要Java(Elasticsearch,Hadoop的原生語言)與Scala(Spark的原生語言)的幫助。

R和python一樣也是一個很好的膠水語言,在搜索引擎的實戰中,我就是用R來完成了ES集群索引的全量/增量更新操作。既然是一瓶膠水,你很難不希望它粘合上越來越多的東西。對於一個有處女座傾向的雙魚座,因為RHive的安裝和配置太復雜而一直沒法把R和Hive粘合起來是我長期以來的苦惱。最近要用Spark的Mlib做文本分類工作於是開始重新鼓搗Spark,沒想到歪打正着地發現用Spark的R語言api可以操作Hive,搞通之后真是感到Awesome as fuck!

一、編譯安裝帶有hive與R的Spark

官網上預編譯好的spark都是不帶hive支持的,因此只能自己從源碼重新編譯(在這里要感謝spark老司機同事的指點)。

# 從官網下載源碼包
wget http://mirrors.hust.edu.cn/apache/spark/spark-1.6.1/spark-1.6.1.tgz # 解壓 tar zxvf spark-1.6.1.tgz # 為編譯R的支持做准備 spark-1.6.1/R/install-dev.sh # 編譯安裝帶有hive與R的spark spark-1.6.1/make-distribution.sh --name hadoop2.5 --skip-java-test --tgz -Psparkr -Pyarn -Dhadoop.version=2.5.0 -Dscala-2.10.4 -Phive -Phive-thriftserver # 把編譯好的包解壓到自己習慣的目錄(參考elasticsearch放在/usr/share/目錄下) tar zxvf spark-1.6.1/spark-1.6.1-bin-hadoop2.5.tgz mvspark-1.6.1/spark-1.6.1-bin-hadoop2.5 /usr/share/

二、環境配置

環境配置可以直接參考之前的文章 CentOS 6.7 hadoop free版本Spark 1.6安裝與使用 ,此外要添加一下spark-defaults.conf這個配置文件,以使得hive能夠被順利連接上:

# vim $SPARK_HOME/conf/spark-defaults.conf

spark.eventLog.dir=hdfs://n1:8020/user/spark/applicationHistory2 spark.eventLog.enabled=true spark.yarn.jar=hdfs://n1:8020/user/spark/share/lib/spark-assembly-1.6.1-hadoop2.5.0.jar spark.driver.extraLibraryPath=/opt/cloudera/parcels/CDH-5.3.0-1.cdh5.3.0.p0.30/lib/hadoop/lib/native spark.executor.extraLibraryPath=/opt/cloudera/parcels/CDH-5.3.0-1.cdh5.3.0.p0.30/lib/hadoop/lib/native # 注:需要把$SPARK_HOME/lib/spark-assembly-1.6.1-hadoop2.5.0.jar這個文件放到hdfs相應的目錄下

好吧,這一步也是完全按照同事之前的經驗整理的,還沒有深入研究到底是如何生效的,但重要的是先用起來……

三、讀寫hive實例

直接上代碼:

Sys.setenv(SPARK_HOME = "/usr/share/spark-1.6.1-bin-hadoop2.5", HADOOP_CONF_DIR="/opt/cloudera/parcels/CDH/lib/hadoop/etc/hadoop") library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib"))) sc <- sparkR.init(master = "yarn-client", appName = "test") hiveContext <- sparkRHive.init(sc) # 讀取數據 results <- sql(hiveContext, "select * from dd_b_ec_e46_clickmodel where dt=20150601") head(results) # 寫入數據(首先用R將數據寫到硬盤上然后進行裝載) sql(hiveContext, "CREATE TABLE IF NOT EXISTS src (key INT, value STRING)") sql(hiveContext, "LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src")

這里需要注意的是:如果運行R的用戶不是hdfs管理員用戶的話要自己處理一下權限問題,具體問題具體google……

總結

大致看了一遍Spark R api后,還是略感失望的,因為發現Spark當前對R的支持主要就是集中在dataframe部分,連最基本的map和reduce操作都沒有,看來也只是把R當成數據清洗的工具了。不知不覺中砸了兩周的時間在Spark上,接下倆得抖擻精神做一下業務需求了,然后就是硬剛Scala和Mlib!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM