SparkR无法访问工作人员

时间:2016-03-25 19:28:12

标签: r apache-spark sparkr

这个问题与this one基本相同(但在R中)。

我正在开发一个使用SparkR的R包。我使用testthat包在PkgName / inst / tests / test中创建了一些单元测试(几个.R文件)。对于其中一个测试,我需要读取一个外部数据文件,因为它很小而且只在测试中使用,我读到它可以放在测试的同一个文件夹中。

当我在一个独立的Spark集群中使用Maven部署它时,使用“local [*]”作为master,它可以工作。但是,如果我尝试使用“远程”Spark集群(通过docker-图像有java,Spark 1.5.2和R-,我在其中创建一个master,例如http://172.17.0.1,然后是一个成功链接到的worker那个主人),然后它不起作用。它抱怨无法找到数据文件,因为它似乎使用仅在我的本地PC中有效但在工作者中无效的绝对路径来查找它。如果我只使用文件名(没有前面的路径),也会发生同样的情况。

我还尝试使用spark-submit的--file参数将文件传递给worker,并且文件已成功传递(显然它放在http://192.168.0.160:44977/files/myfile.dat中,尽管端口随每次执行而变化)。如果我尝试使用SparkFiles.get检索文件的位置,我会得到一个路径(在其中一个中间文件夹中有一些随机数)但显然,它仍然引用我本地计算机中的路径。如果我尝试使用我检索的路径读取文件,则会抛出相同的错误(找不到文件)。

我已经设置了这样的环境变量:

SPARK_PACKAGES = "com.databricks:spark-csv_2.10:1.3.0"
SPARKR_SUBMIT_ARGS = " --jars /path/to/extra/jars --files /local/path/to/mydata.dat sparkr-shell"
SPARK_MASTER_IP = "spark://172.17.0.1:7077"

INFO消息说:

INFO Utils: Copying /local/path/to/mydata.dat to /tmp/spark-c86739c6-2c73-468f-8326-f3d03f5abd6b/userFiles-e1e77e47-2689-4882-b60f-327cf99fe5e0/mydata.dat INFO SparkContext: Added file file:/local/path/to/mydata.dat at http://192.168.0.160:47110/files/mydata.dat with timestamp 1458995156845

此端口从一次运行更改为另一次运行。从R内部,我尝试过:

fullpath <- SparkR:::callJStatic("org.apache.spark.SparkFiles", "get", "mydata.dat")

(这里我只使用callJStatic进行调试)我得到了 /tmp/spark-c86739c6-2c73-468f-8326-f3d03f5abd6b/userFiles-e1e77e47-2689-4882-b60f-327cf99fe5e0/ratings.dat

但是当我尝试从R中的fullpath读取时,我得到了fileNotFound异常,可能是因为fullpath不是worker中的位置。当我尝试简单地从“mydata.dat”(没有完整路径)阅读时,我得到相同的错误,因为R仍然试图从我的项目所在的本地路径读取(只需将“mydata.dat”附加到本地路径)。

我还尝试将R包交付给工人(不确定这是否有帮助),遵循正确的包装约定(具有严格结构的JAR文件等)。我没有错误(似乎我的R包中的JAR文件可以安装在工作人员中)但没有运气。

你能帮帮我吗?感谢。

编辑:我认为我错了,我不需要在工作人员中访问该文件,但只需在驱动程序中,因为访问权限不属于分布式操作(只需调用SparkR::read.df)。无论如何它不起作用。但令人惊讶的是,如果我使用--files传递文件并且我使用read.table(而不是来自SparkR但是基本的R utils)读取它并传递SparkFiles.get返回的完整路径,它可以工作(尽管这是对我没用。)顺便说一句,我使用的是SparkR版本1.5.2。

0 个答案:

没有答案