Выполнение системной команды в Hadoop с использованием spark_apply от sparklyr - PullRequest
0 голосов
/ 18 октября 2018

Я хочу запустить инструмент 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?

Кроме того, есть ли более простой способ сделать это?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

вам нужно позвонить sparklyr::spark_apply с packages = FALSE, что означает, что sparklyr :: spark_apply будет использовать ваш архивный пакет (r_env.zip) вместо вашего .libPaths()

0 голосов
/ 23 октября 2018

Согласно руководству [Running Spark on YARN] https://spark.apache.org/docs/latest/running-on-yarn.html(), spark.yarn.dist.archives:

Список архивов, разделенных запятыми, которые нужно извлечь в рабочий каталог каждого исполнителя.

Таким образом, файлы должны находиться в рабочем каталоге вашего приложения.

...