我们想在火花作业中使用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).
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |