我在同一个网络中有3个容器:hadoop容器、spark容器和shanny r容器
我想从我闪亮的应用程序中读取hdfs上的文件夹。如果hadoop、spark和Shinny r在同一台服务器上(没有docker容器),我可以使用以下方法:
system(paste0("hdfs dfs -ls ", "/"), intern = TRUE)
如果我使用docker容器,其中hadoop和Shinny r在不同的容器中,我不能这样做:
system(paste0("hdfs dfs -ls ", "/"), intern = TRUE)
因为他们是独立的。
你知道我怎么做吗?
我试图使用sparklyr的invoke函数,但没有成功。
> 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)
谢谢你的帮助
1条答案
按热度按时间ax6ht2ek1#
我用这个:/var/run/docker.sock解决了这个问题。所以我换了 Docker 。我的服务是:
我完整的 Docker 组成是:
然后我不得不在我闪亮的容器里安装docker。我在dockerfile上添加了命令。我闪亮的dockerfile是:
在docker容器中使用docker系统函数和docker命令
然后我在应用程序中使用r系统函数时遇到了一些问题。这是错误:
我通过以下操作解决了这个问题(shiny的容器):
然后,我在app user=root上添加了:
我的简单应用程序使用system()的代码:
我的闪亮应用程序正在运行(使用系统)