如何在Apache Spark中使用JSR-203文件系统提供程序?

bma*_*ies 6 apache-spark

我们想在火花作业中使用HDFS NIO.2文件系统提供程序.但是,我们遇到了文件系统提供程序的类路径问题:它们必须位于系统类路径中才能通过Paths.get(URI)API使用.因此,即使在提供给spark-submit的jar文件中提供了提供程序,也找不到提供程序.

这是spark-submit命令:

spark-submit --master local["*"] \
  --jars target/dependency/jimfs-1.1.jar,target/dependency/guava-16.0.1.jar \
 --class com.basistech.tc.SparkFsTc \
 target/spark-fs-tc-0.0.1-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)

而这里是作业类,因"未找到文件系统"而失败.

public final class SparkFsTc {
private SparkFsTc() {
    //
}
public static void main(String[] args) {

    SparkConf conf = new SparkConf().setAppName("File System Test Case");
    JavaSparkContext sc = new JavaSparkContext(conf);

    JavaRDD<String> logData = sc.parallelize(Collections.singletonList("foo"));
    System.out.println(logData.getNumPartitions());
    logData.mapPartitions(itr -> {
        FileSystem fs = Jimfs.newFileSystem();
        Path path = fs.getPath("/root");
        URI uri = path.toUri();
        Paths.get(uri); // expect this to go splat.
        return null;
    }).collect();
}
}
Run Code Online (Sandbox Code Playgroud)

是否有一些机制来说服spark将FS提供程序添加到适当的类路径?

读者应注意文件系统提供者是特殊的.如果你阅读了JRE中的代码,你会看到

ServiceLoader<FileSystemProvider> sl = ServiceLoader
        .load(FileSystemProvider.class, ClassLoader.getSystemClassLoader()).
Run Code Online (Sandbox Code Playgroud)

他们必须在'系统类加载器'中.他们在当地找不到.

如果我FileSystem自己获取对象引用而不是使用,那么这件事就可以了Paths.get(URI).