У меня есть 3 контейнера в одной сети: контейнер Hadoop, контейнер Spark и контейнер Shiny R
Я хотел бы прочитать папку на HDFS из моего приложения Shiny.Если Hadoop, Spark и Shiny R находятся на одном сервере (без Docker-контейнеров), я могу использовать это:
system(paste0("hdfs dfs -ls ", "/"), intern = TRUE)
Если я использую Docker-контейнеры, где Hadoop и Shiny R находятся в разных контейнерах, я не могу это сделатьэто:
system(paste0("hdfs dfs -ls ", "/"), intern = TRUE)
Поскольку они независимы.
Знаете ли вы, как я могу это сделать?
Я пытался использовать функцию invoke из sparklyr, но этоне работал.
> library(sparklyr)
>
> conf = spark_config()
>
> sc <- spark_connect(master = "local[*]", config = conf)
Re-using existing Spark connection to local[*]
>
> hconf <- sc %>% spark_context() %>% invoke("hadoopConfiguration")
>
> path <- 'hdfs://namenode:9000/user/root/input2/'
>
> spath <- sparklyr::invoke_new(sc, 'org.apache.hadoop.fs.Path', path)
> spath
<jobj[30]>
org.apache.hadoop.fs.Path
hdfs://namenode:9000/user/root/input2
> fs <- invoke_static(sc, "org.apache.hadoop.fs.FileSystem", "get", hconf)
> fs
<jobj[32]>
org.apache.hadoop.fs.LocalFileSystem
org.apache.hadoop.fs.LocalFileSystem@788cf1b0
> lls <- invoke(fs, "globStatus", spath)
Error: java.lang.IllegalArgumentException: Wrong FS: hdfs://namenode:9000/user/root/input2, expected: file:///
at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:649)
at org.apache.hadoop.fs.RawLocalFileSystem.pathToFile(RawLocalFileSystem.java:82)
at org.apache.hadoop.fs.RawLocalFileSystem.deprecatedGetFileStatus(RawLocalFileSystem.java:606)
at org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:824)
at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:601)
at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:421)
at org.apache.hadoop.fs.Globber.getFileStatus(Globber.java:57)
at org.apache.hadoop.fs.Globber.glob(Globber.java:252)
Спасибо за вашу помощь