我试图运行一个简单的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)
Run Code Online (Sandbox Code Playgroud)
代码:
Configuration configuration = new Configuration();
NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelPath), configuration);// error in this line..
Run Code Online (Sandbox Code Playgroud)
modelPath指向NaiveBayes.bin文件,配置对象正在打印 -Configuration: core-default.xml, core-site.xml
我认为这是因为罐子,任何想法?
dav*_*d_p 165
这是maven-assembly插件破坏事物的典型案例.
不同的JAR(hadoop-commonsfor LocalFileSystem,hadoop-hdfsfor DistributedFileSystem)每个都包含org.apache.hadoop.fs.FileSystem在其META-INFO/services目录中调用的不同文件.该文件列出了他们想要声明的文件系统实现的规范类名(这称为通过实现的服务提供者接口java.util.ServiceLoader,参见org.apache.hadoop.FileSystem 第2622行).
当我们使用maven-assembly-plugin它时,它将我们所有的JAR合并为一个,并且所有JAR都META-INFO/services/org.apache.hadoop.fs.FileSystem相互覆盖.只剩下其中一个文件(最后添加的文件).在这种情况下,FileSystem列表将hadoop-commons覆盖列表hadoop-hdfs,因此DistributedFileSystem不再声明.
在加载Hadoop配置之后,但在执行任何FileSystem相关操作之前,我们称之为:
hadoopConfig.set("fs.hdfs.impl",
org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()
);
hadoopConfig.set("fs.file.impl",
org.apache.hadoop.fs.LocalFileSystem.class.getName()
);
Run Code Online (Sandbox Code Playgroud)
引起我注意的是krookedking,有一种基于配置的方法可以maven-assembly使用所有FileSystem服务声明的合并版本.将以下插件添加到您的maven-assembly文件中:
hadoopConfig.set("fs.hdfs.impl",
org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()
);
hadoopConfig.set("fs.file.impl",
org.apache.hadoop.fs.LocalFileSystem.class.getName()
);
Run Code Online (Sandbox Code Playgroud)
kro*_*ing 55
对于那些使用shade插件的人,按照david_p的建议,你可以通过将ServicesResourceTransformer添加到插件配置来合并阴影jar中的服务:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</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>
Run Code Online (Sandbox Code Playgroud)
这会将所有org.apache.hadoop.fs.FileSystem服务合并到一个文件中
小智 8
为了记录,这仍然发生在hadoop 2.4.0中.太令人沮丧......
我能够按照以下链接中的说明操作:http://grokbase.com/t/cloudera/scm-users/1288xszz7r/no-filesystem-for-scheme-hdfs
我将以下内容添加到我的core-site.xml中并且工作正常:
<property>
<name>fs.file.impl</name>
<value>org.apache.hadoop.fs.LocalFileSystem</value>
<description>The FileSystem for file: uris.</description>
</property>
<property>
<name>fs.hdfs.impl</name>
<value>org.apache.hadoop.hdfs.DistributedFileSystem</value>
<description>The FileSystem for hdfs: uris.</description>
</property>
Run Code Online (Sandbox Code Playgroud)
小智 8
花了我很多时间用Spark 2.0.2来解决这个问题,但这是我的意思:
val sparkBuilder = SparkSession.builder
.appName("app_name")
.master("local")
// Various Params
.getOrCreate()
val hadoopConfig: Configuration = sparkBuilder.sparkContext.hadoopConfiguration
hadoopConfig.set("fs.hdfs.impl", classOf[org.apache.hadoop.hdfs.DistributedFileSystem].getName)
hadoopConfig.set("fs.file.impl", classOf[org.apache.hadoop.fs.LocalFileSystem].getName)
Run Code Online (Sandbox Code Playgroud)
以及我的相关部分build.sbt:
scalaVersion := "2.11.8"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.0.2"
Run Code Online (Sandbox Code Playgroud)
我希望这可以帮助你!
谢谢david_p,scala
conf.set("fs.hdfs.impl", classOf[org.apache.hadoop.hdfs.DistributedFileSystem].getName);
conf.set("fs.file.impl", classOf[org.apache.hadoop.fs.LocalFileSystem].getName);
Run Code Online (Sandbox Code Playgroud)
要么
<property>
<name>fs.hdfs.impl</name>
<value>org.apache.hadoop.hdfs.DistributedFileSystem</value>
</property>
Run Code Online (Sandbox Code Playgroud)
我使用 sbt assembly 来打包我的项目。我也遇到这个问题。我的解决方案就在这里。第 1 步:在 build.sbt 中添加 META-INF mergestrategy
case PathList("META-INF", "MANIFEST.MF") => MergeStrategy.discard
case PathList("META-INF", ps @ _*) => MergeStrategy.first
Run Code Online (Sandbox Code Playgroud)
Step2:将hadoop-hdfs lib添加到build.sbt
"org.apache.hadoop" % "hadoop-hdfs" % "2.4.0"
Run Code Online (Sandbox Code Playgroud)
Step3:sbt清理;sbt组装
希望以上信息能够对您有所帮助。
小智 6
对于maven,只需为hadoop-hdfs添加maven依赖项(请参阅下面的链接)即可解决问题.
http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.7.1
假设您正在使用 hadoop 的 mvn 和 cloudera 发行版。我正在使用 cdh4.6 并添加这些依赖项对我有用。我认为您应该检查 hadoop 和 mvn 依赖项的版本。
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>2.0.0-mr1-cdh4.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.0.0-cdh4.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.0.0-cdh4.6.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
不要忘记添加 cloudera mvn 存储库。
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
Run Code Online (Sandbox Code Playgroud)
我假设您使用 Maven 构建示例。
请检查您尝试运行的 JAR 的内容。特别是META-INFO/services目录、文件org.apache.hadoop.fs.FileSystem。应该有 filsystem 实现类的列表。检查org.apache.hadoop.hdfs.DistributedFileSystemHDFS 和org.apache.hadoop.fs.LocalFileSystem本地文件方案列表中是否存在行。
如果是这种情况,您必须在构建期间覆盖引用的资源。
另一种可能性是您的类路径中根本没有这种情况hadoop-hdfs.jar,但这可能性很低。通常,如果您有正确的hadoop-client依赖性,那么这不是一个选择。
| 归档时间: |
|
| 查看次数: |
94195 次 |
| 最近记录: |