繁体   English   中英

使用Sparklyr中的spark_apply在Hadoop中运行系统命令

[英]Running a system command in Hadoop using spark_apply from sparklyr

我想对存储在Hadoop集群中的数据运行Java工具。 我正在尝试使用sparklyr中的spark_apply函数来执行此操作,但是我对语法有点困惑。

在运行Spark代码之前,我已经按照此处的说明设置了一个conda环境: http : //blog.cloudera.com/blog/2017/09/how-to-distribute-your-r-code-with-sparklyr -and-cdsw / 我无权使用包裹,因此需要使用本文所述的第二个选项。 conda环境还包含我要使用的Java工具。

让我们以虹膜数据为例:

library(sparklyr)
library(tidyverse)
library(datasets)
data(iris)
config <- spark_config()
config[["spark.r.command"]] <- "./r_env.zip/r_env/bin/Rscript"
config[["spark.yarn.dist.archives"]] <- "r_env.zip"
config$sparklyr.apply.env.R_HOME <- "./r_env.zip/r_env/lib/R"
config$sparklyr.apply.env.RHOME <- "./r_env.zip/r_env"
config$sparklyr.apply.env.R_SHARE_DIR <- "./r_env.zip/r_env/lib/R/share"
config$sparklyr.apply.env.R_INCLUDE_DIR <- "./r_env.zip/r_env/lib/R/include"
sc <- spark_connect(master = "yarn-client", config = config)

# Write iris table to HDFS, partitioning by Species
iris_tbl_tmp = copy_to(sc, iris, overwrite=T)
spark_write_table(iris_tbl_tmp, "iris_byspecies", partition_by="Species")
iris_tbl = sc %>% tbl("iris_byspecies")
iris_tbl

由于Java工具无法从HDFS读取数据,因此我实际上必须将每个数据集保存到文件中,运行Java工具,然后再次读取数据:

myfunction = function(x) { 
    write.table(x, "tempfile.txt")
    system2("{PATH}/myjavatool.java")
    res = read.table("output_of_java_command.txt")
    res
}
myoutput = spark_apply(iris_tbl, myfunction, group_by=Species)

我的问题是有关Java工具的路径。 如何查看Sparklyr在哪里存储conda环境?

而且,有没有更简单的方法可以做到这一点?

根据[运行YARN上的Spark] https://spark.apache.org/docs/latest/running-on-yarn.html()指南, spark.yarn.dist.archives

以逗号分隔的归档列表,将其提取到每个执行程序的工作目录中。

因此,文件应位于应用程序的工作目录中。

您需要使用packages = FALSE来调用sparklyr::spark_apply ,这意味着sparklyr :: spark_apply将使用您的存档包(r_env.zip)而不是.libPaths()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM