Pyspark从HDFS读取caffe模型

我正在使用caffe库来使用PySpark框架进行图像检测 . 我能够在本地模式下运行spark程序,其中模型存在于本地文件系统中 .

但是当我想将它部署到集群模式时,我不知道正确的方法是什么 . 我尝试了以下方法:

  • 将文件添加到HDFS,并在提交作业时使用 addfile--file

sc.addFile("hdfs:///caffe-public/dataset/test.caffemodel")

  • 使用读取每个工作节点中的模型

model_weight =SparkFiles.get('test.caffemodel') net = caffe.Net(model_define, model_weight, caffe.TEST)

由于 SparkFiles.get() 将返回工作节点(而不是HDFS)中的本地文件位置,因此我可以使用它返回的路径重建我的模型 . 此方法在本地模式下也可以正常工作,但是,在分布式模式下,它将导致以下错误:

ERROR server.TransportRequestHandler: Error sending result StreamResponse{streamId=/files/xxx, byteCount=xxx, body=FileSegmentManagedBuffer{file=xxx, offset=0,length=xxxx}} to /192.168.100.40:37690; closing connection
io.netty.handler.codec.EncoderException: java.lang.NoSuchMethodError: io.netty.channel.DefaultFileRegion.<init>(Ljava/io/File;JJ)V

似乎数据太大而不能像_1058986中讨论的那样洗牌 . 但是,模型的大小只有大约1M .

更新:

我发现如果 sc.addFile(path) 中的路径在HDFS上,则不会出现错误 . 但是,当路径在本地文件系统中时,将出现错误 .

我的问题是

  • 是否有任何其他可能导致上述异常而不是文件大小的情况 . (火花在YARN上运行,我使用默认的shuffle服务而不是外部shuffle服务)

  • 如果我在submmit时没有添加文件,如何使用PySpark从HDFS读取模型文件? (这样我就可以使用caffe API重建模型) . 或者有没有办法获得 SparkFiles.get() 以外的路径?

任何建议将不胜感激!

回答(0)