Caused by: No FileSystem for scheme: file
阿新 • • 發佈:2018-11-23
2018.10.26
文章目錄
前言
某專案使用HDFS Java API操作HDFS,常用操作如put、getMerge等,但一旦涉及到本地檔案系統和HDFS間的上傳下載,就會報錯,在StackOverflow上找到了解決方法1。
方法
這是一個典型的maven-assembly-plugin
所導致的問題。不同的Jar包中可能存在不同org.apache.hadoop.fs.FileSystem
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>