2014-07-14 138 views
1

我是R用戶。我對Linux命令PuTTY或Hadoop/Hive瞭解甚少。所以請糾正我,如果我錯了。在安裝了Hadoop的羣集上使用R

我現在正在與一個團隊合作。他們在集羣上運行Ubuntu系統。我可以用膩子訪問此Ubuntu系統,並通過使用代碼訪問數據文件:

user$hadoop fs -ls /datafolder/ 

或使用蜂巢:

user$hive 
hive>use datafolder; 
hive>show tables; 

在對面,那我一起工作的團隊非常瞭解一點關於R,所以他們要我做R部分。我已經在羣集上安裝了R,並且還在R中安裝了rJava HRive和其他軟件包(我不確定是否正確執行了此操作,但R似乎運行正常)。

現在我可以做一些測試。我R 7羣集上運行下面的代碼:

user$R 
>install.packages(c('Rcpp', 'RJSONIO', 'bitops', 'digest', 'functional', 'stringr', 'plyr', 'reshape2','caTools')) 

>Sys.setenv(HADOOP_CMD="/opt/cloudera/bin/hadoop") 
>Sys.setenv(HADOOP_HOME="/opt/cloudera/lib/hadoop") 
>Sys.setenv(HADOOP_STREAMING="/opt/cloudera/lib/hadoop-mapreduce/hadoop-streaming.jar") 

>library(rmr2) 
>library(rhdfs) 
>hdfs.init() 

測試:

>ints = to.dfs(1:10) 
>calc = mapreduce(input = ints, map = function(k,v) cbind(v, v/2, 2*v)) 
>test <- from.dfs(calc) 
>test 

我可以成功加載 「測試」 回用from.dfs。這似乎是我能救一個虛擬數據集的Hadoop,並可以把它從Hadoop的背成功(正確嗎?)

現在,我的問題是,如何令R導入這些,我可以從

user$hadoop fs -ls /datafolder/ 
看到的數據集

>hive use datafolder; 

回答

1

這是例如具有負載結果單詞計數的回R:

Sys.setenv(HADOOP_CMD="/usr/bin/hadoop") 
    Sys.setenv(HADOOP_STREAMING="/opt/cloudera/parcels/CDH-5.1.0-1.cdh5.1.0.p0.53/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming.jar") 
    Sys.setenv(JAVA_HOME="/usr/java/jdk1.7.0_55-cloudera") 
    Sys.setenv(HADOOP_COMMON_LIB_NATIVE_DIR="/opt/cloudera/parcels/CDH-5.1.0-1.cdh5.1.0.p0.53/lib/hadoop/lib/native") 
    Sys.setenv(HADOOP_OPTS="-Djava.library.path=HADOOP_HOME/lib") 
    library(rhdfs) 
    hdfs.init() 
    library(rmr2) 

    ## space and word delimiter 
    map <- function(k,lines) { 
     words.list <- strsplit(lines, '\\s') 
     words <- unlist(words.list) 
     return(keyval(words, 1)) 
    } 
    reduce <- function(word, counts) { 
     keyval(word, sum(counts)) 
    } 
    wordcount <- function (input, output=NULL) { 
     mapreduce(input=input, output=output, input.format="text", map=map, reduce=reduce) 
    } 

    ## variables 
    hdfs.root <- '/user/node' 
    hdfs.data <- file.path(hdfs.root, 'data') 
    hdfs.out <- file.path(hdfs.root, 'out') 

    ## run mapreduce job 
    ##out <- wordcount(hdfs.data, hdfs.out) 
    system.time(out <- wordcount(hdfs.data, hdfs.out)) 

    ## fetch results from HDFS 
    results <- from.dfs(out) 
    results.df <- as.data.frame(results, stringsAsFactors=F) 
    colnames(results.df) <- c('word', 'count') 

    ##head(results.df) 
    ## sorted output TOP10 
    head(results.df[order(-results.df$count),],10)