Я хочу запустить инструмент Java на данных, хранящихся в кластере Hadoop.Я пытаюсь сделать это, используя функцию spark_apply от sparklyr, но меня немного смущает синтаксис.
Перед запуском 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)
Мой вопрос касается PATH для инструмента Java.Как я могу увидеть, где sparklyr хранит среду conda?
Кроме того, есть ли более простой способ сделать это?