我在试着做一个简单的 NaiveBayesClassifer
使用hadoop,获取此错误
Exception in thread "main" java.io.IOException: No FileSystem for scheme: file
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1375)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:66)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1390)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:196)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:95)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:180)
at org.apache.hadoop.fs.Path.getFileSystem(Path.java:175)
at org.apache.mahout.classifier.naivebayes.NaiveBayesModel.materialize(NaiveBayesModel.java:100)
代码:
Configuration configuration = new Configuration();
NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelPath), configuration);// error in this line..
``` `modelPath` 指的是 `NaiveBayes.bin` 文件,配置对象正在打印- `Configuration: core-default.xml, core-site.xml` 我想是因为jar,有什么想法吗?
18条答案
按热度按时间omtl5h9j1#
作为记录,hadoop2.4.0中仍然存在这种情况。太令人沮丧了。。。
我可以按照此链接中的说明进行操作:http://grokbase.com/t/cloudera/scm-users/1288xszz7r/no-filesystem-for-scheme-hdfs
我在core-site.xml中添加了以下内容,并且成功了:
omvjsjqw2#
另一个可能的原因(尽管ops问题本身并不受此影响)是如果您创建的配置示例没有加载默认值:
如果不加载默认值,则无法获得
FileSystem
在尝试访问hdfs时会导致类似这样的错误的实现。切换到传入的无参数构造函数true
加载默认值可以解决这个问题。此外,如果要将自定义配置位置(例如,在文件系统上)添加到
Configuration
小心哪一个超载的addResource()
你用的。例如,如果您使用addResource(String)
然后hadoop假设字符串是类路径资源,如果需要指定本地文件,请尝试以下操作:gpfsuwkq3#
对于那些使用shade插件的用户,按照david\u p的建议,您可以通过将servicesresourcetransformer添加到插件配置来合并shade jar中的服务:
这将把所有org.apache.hadoop.fs.filesystem服务合并到一个文件中
k3bvogb14#
使用此插件
mlmc2os55#
如果您使用sbt:
zbq4xfa06#
我使用sbt汇编来打包我的项目。我也遇到了这个问题。我的解决办法在这里。步骤1:在build.sbt中添加meta-inf合并策略
步骤2:将hadoop hdfs lib添加到build.sbt
第三步:sbt清洗;sbt组件
希望以上信息能对您有所帮助。
aamkag617#
我也遇到了类似的问题。添加core-site.xml和hdfs-site.xml作为conf(object)的资源
也在pom.xml中编辑了版本冲突(e、 g.如果hadoop的配置版本是2.8.1,但在pom.xml文件中,dependances的版本是2.7.1,那么将其更改为2.8.1)再次运行maven install。
这为我解决了错误。
txu3uszq8#
我也面临同样的问题。我找到了两个解决方案:(1)手动编辑jar文件:
用winrar(或类似工具)打开jar文件。转到meta info>services,通过附加以下内容编辑“org.apache.hadoop.fs.filesystem”:
(2) 更改依赖项的顺序如下
c90pui9n9#
由于我的新手身份,我花了一些时间才从给出的答案中找出解决办法。如果有人从一开始就需要帮助,这就是我想到的:
我用的是spark 2.1
我的生活中也有这个角色
build.sbt
```assemblyMergeStrategy in assembly := {
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x => MergeStrategy.first
}
gg58donl10#
我花了很长时间才用spark 2.0.2解决了这个问题,但我的观点是:
以及我生命中的相关部分
build.sbt
:我希望这能有所帮助!
klsxnrf111#
对于sbt,请在build.sbt中使用下面的mergestrategy
nnt7mjpx12#
这与flink无关,但我在flink中也发现了这个问题。
对于使用flink的用户,您需要下载预捆绑的hadoop并将其放入其中
/opt/flink/lib
.z5btuh9x13#
这是一个典型的
maven-assembly
把东西弄坏。为什么会发生在我们身上
不同的jar(
hadoop-commons
为了LocalFileSystem
,hadoop-hdfs
为了DistributedFileSystem
)每个文件都包含一个名为org.apache.hadoop.fs.FileSystem
在他们的META-INFO/services
目录。该文件列出了要声明的文件系统实现的规范类名(这称为通过java.util.ServiceLoader
,请参见org.apache.hadoop.FileSystem#loadFileSystems
).当我们使用
maven-assembly-plugin
,它把我们所有的jar合并成一个,然后META-INFO/services/org.apache.hadoop.fs.FileSystem
相互覆盖。这些文件中只剩下一个(添加的最后一个)。在这种情况下FileSystem
列表来源hadoop-commons
覆盖列表hadoop-hdfs
,所以DistributedFileSystem
不再申报。我们怎么修好的
在加载hadoop配置之后,但是在做任何事情之前
FileSystem
-我们称之为:更新:正确的修复
这件事引起了我的注意
krookedking
有一种基于配置的方法maven-assembly
使用所有文件的合并版本FileSystem
服务声明,看看下面他的答案。gorkyyrv14#
假设您使用的是mvn和hadoop的cloudera发行版。我正在使用cdh4.6,添加这些依赖项对我来说很有用。我认为您应该检查hadoop和mvn依赖项的版本。
别忘了添加clouderamvn存储库。
ds97pgxw15#
set fs.defaultfs对我有用!hadoop-2.8.1版本