RHive 是一種通過HIVE高性能查詢來擴展R計算能力的包。它可以在R環境中非常容易的調用HQL, 也允許在Hive中使用R的對象和函數。理論上數據處理量可以無限擴展的Hive平台,搭配上數據挖掘的利器R環境, 堪稱是一個完美的大數據分析挖掘的工作環境。
環境配置
(配置部分是同事搞定的,只記錄一些細節)
RHive 依賴於Rserve,因此在安裝R的時候有些變化:
./configure --disable-nls --enable-R-shlib
make
make install
enable-R-shlib 是將R作為動態庫進行安裝,這樣像Rserve依賴於R動態庫的包就可以安裝了,但缺點是會有20%左右的性能下降
。
Rserve的安裝
正常的安裝R包:
install.packages('rJava')
install.packages('Rserve')
在安裝Rsever用戶下,創建一目錄,並創建Rserv.conf文件,寫入``remote enable''保存並退出。
通過scp -r 命令將Master節點上安裝好的Rserve包,以及Rserv.conf文件拷貝到所有slave節點下,
scp -r /data2/soft/R2.15/library/Rserve slave1:/data2/soft/R2.15/library/
scp -r /data2/soft/R2.15/library/Rserve slave2:/data2/soft/R2.15/library/
scp -r /data2/soft/R2.15/library/Rserve slave3:/data2/soft/R2.15/library/
scp -r /data2/soft/Rserv.conf slave1:/data2/soft/
scp -r /data2/soft/Rserv.conf slave2:/data2/soft/
scp -r /data2/soft/Rserv.conf slave3:/data2/soft/
在所有節點啟動Rserve
Rserve--RS-conf /data2/soft/Rserv.conf
telnet slave1 6311
在Master節點telnet所有slave節點,顯示 Rsrv0103QAP1 則表示連接成功
RHive的安裝
安裝包,並在master節點和所有slave節點創建目錄,並授讀寫權限
R CMD INSTALL RHive_0.0-7.tar.gz
cd /data2/soft/
mkdir -p rhive/data
在master節點和所有slave節點的hadoop用戶下配置環境變量
vi .bash_profile
export RHIVE_DATA=/data2/soft/R/rhive/data
通過scp -r 命令將Master節點上安裝好的RHive包拷貝到所有slave節點下,
scp -r /data2/soft/R2.15/library/RHive slave1:/data2/soft/R2.15/library/
scp -r /data2/soft/R2.15/library/RHive slave2:/data2/soft/R2.15/library/
scp -r /data2/soft/R2.15/library/RHive slave3:/data2/soft/R2.15/library/
查看hdfs文件系統下的jar包是否有讀寫權限
hadoop fs -ls /rhive/lib
最后,啟動hive遠程服務: rhive是通過thrift連接hiveserver的,需要要啟動后台thrift服務,即:在hive客戶端啟動hive遠程服務
nohup hive --service hiveserver &
完畢。
RHive的使用
rhive-api
從HIVE中獲得表信息的函數,比如
- rhive.list.tables:獲得表名列表,支持pattern參數(正則表達式),類似於HIVE的show table
- rhive.desc.table:表的描述,HIVE中的desc table
- rhive.exist.table:
RHive 簡單應用
載入Rhive包,並連接HIVE,獲取數據:
library(RHive)
rhive.connect(host ='host_ip')
d <- rhive.query('select * from emp limit 1000')
class(d)
m <- rhive.block.sample(data_sku, percent =0.0001, seed =0)
rhive.close()
一般在系統中已經配置了host,因此可以直接rhive.connect()
進行連接,記得最后要有rhive.close()
操作。 通過HIVE查詢語句,將HIVE中的目標數據加載至R環境下,返回的 d 是一個dataframe。
實際上,rhive.query
的實際用途有很多,一般HIVE操作都可以使用,比如變更scheme等操作:
rhive.query('use scheme1')
rhive.query('show tables')
rhive.query('drop table emp')
但需要注意的是,數據量較大的情況需要使用rhive.big.query
,並設置memlimit參數。
將R中的對象通過構建表的方式存儲到HIVE中需要使用
rhive.write.table(dat, tablename ='usertable', sep =',')
而后使用join等HIVE語句獲得相關建模數據。其實寫到這兒,有需求的看官就應該明白了,這幾項 RHive 的功能就足夠 折騰些有趣的事情了。
- 注1:其他關於在HIVE中調用R函數,暫時還沒有應用,未來更新。
-
注2:
rhive.block.sample
這個函數需要在HIVE 0.8版本以上才能執行。