1. 程式人生 > >Caused by: No FileSystem for scheme: file

Caused by: No FileSystem for scheme: file

2018.10.26

文章目錄

前言

某專案使用HDFS Java API操作HDFS,常用操作如put、getMerge等,但一旦涉及到本地檔案系統和HDFS間的上傳下載,就會報錯,在StackOverflow上找到了解決方法1

方法

這是一個典型的maven-assembly-plugin所導致的問題。不同的Jar包中可能存在不同org.apache.hadoop.fs.FileSystem

抽象類的實現,如hadoop-commons包中LocalFileSystem的祖先類和hadoop-hdfs包中DistributedFileSystem的祖先類。當採用maven-assembly-plugin時,包名類名相同的類就會出現相互覆蓋,最終只保留一份實現,並打成一個Jar包。

方法一:配置類中指定實現類

在Hadoop的配置Configuration中配置:

Configuration conf = new Configuration();
conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.
class.getName()); conf.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName());

方法二:打成fat包

pom.xml中使用maven-shade-plugin外掛,將專案打成fat包:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version
>
${shadeVersion}</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> </configuration> </execution> </executions> </plugin>

  1. No FileSystem for scheme ↩︎