我是R用户。我对Linux命令,PuTTY或Hadoop / Hive知之甚少。如果我错了,请纠正我。
我现在正在与一个团队合作。他们在集群上运行Ubuntu系统。我可以使用PuTTY访问这个Ubuntu系统并使用代码访问数据文件:
user$hadoop fs -ls /datafolder/
或使用配置单元:
user$hive
hive>use datafolder;
hive>show tables;
相反,与我合作的团队对R知之甚少,所以他们希望我做R部分。我在集群上安装了R,并在R中安装了rJava HRive和其他软件包。(我不确定我是否正确执行了此操作,但R似乎运行正常)。
现在我可以做一些测试了。我可以在R @ cluster上运行以下代码:
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成功加载“test”。好像我可以将一个虚拟数据集保存到Hadoop,并且可以成功从Hadoop中恢复(正确吗?)
现在,我的问题是,如何让R导入我可以从
中看到的数据集user$hadoop fs -ls /datafolder/
或
>hive use datafolder;
答案 0 :(得分:1)
这是wordcount的示例,其中加载结果返回到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)