hadoop没有scheme:file的文件系统

7uzetpgm  于 2021-06-04  发布在  Hadoop
关注(0)|答案(18)|浏览(538)

我在试着做一个简单的 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,有什么想法吗?
omtl5h9j

omtl5h9j1#

作为记录,hadoop2.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>
omvjsjqw

omvjsjqw2#

另一个可能的原因(尽管ops问题本身并不受此影响)是如果您创建的配置示例没有加载默认值:

Configuration config = new Configuration(false);

如果不加载默认值,则无法获得 FileSystem 在尝试访问hdfs时会导致类似这样的错误的实现。切换到传入的无参数构造函数 true 加载默认值可以解决这个问题。
此外,如果要将自定义配置位置(例如,在文件系统上)添加到 Configuration 小心哪一个超载的 addResource() 你用的。例如,如果您使用 addResource(String) 然后hadoop假设字符串是类路径资源,如果需要指定本地文件,请尝试以下操作:

File configFile = new File("example/config.xml");
config.addResource(new Path("file://" + configFile.getAbsolutePath()));
gpfsuwkq

gpfsuwkq3#

对于那些使用shade插件的用户,按照david\u p的建议,您可以通过将servicesresourcetransformer添加到插件配置来合并shade 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>

这将把所有org.apache.hadoop.fs.filesystem服务合并到一个文件中

k3bvogb1

k3bvogb14#

使用此插件

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.5</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>

                        <configuration>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <shadedArtifactAttached>true</shadedArtifactAttached>
                            <shadedClassifierName>allinone</shadedClassifierName>
                            <artifactSet>
                                <includes>
                                    <include>*:*</include>
                                </includes>
                            </artifactSet>
                            <transformers>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>reference.conf</resource>
                                </transformer>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                </transformer>
                                <transformer 
                                implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer">
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
mlmc2os5

mlmc2os55#

如果您使用sbt:

//hadoop
lazy val HADOOP_VERSION = "2.8.0"

lazy val dependenceList = Seq(

//hadoop
//The order is important: "hadoop-hdfs" and then "hadoop-common"
"org.apache.hadoop" % "hadoop-hdfs" % HADOOP_VERSION

,"org.apache.hadoop" % "hadoop-common" % HADOOP_VERSION
)
zbq4xfa0

zbq4xfa06#

我使用sbt汇编来打包我的项目。我也遇到了这个问题。我的解决办法在这里。步骤1:在build.sbt中添加meta-inf合并策略

case PathList("META-INF", "MANIFEST.MF") => MergeStrategy.discard
case PathList("META-INF", ps @ _*) => MergeStrategy.first

步骤2:将hadoop hdfs lib添加到build.sbt

"org.apache.hadoop" % "hadoop-hdfs" % "2.4.0"

第三步:sbt清洗;sbt组件
希望以上信息能对您有所帮助。

aamkag61

aamkag617#

我也遇到了类似的问题。添加core-site.xml和hdfs-site.xml作为conf(object)的资源

Configuration conf = new Configuration(true);    
conf.addResource(new Path("<path to>/core-site.xml"));
conf.addResource(new Path("<path to>/hdfs-site.xml"));

也在pom.xml中编辑了版本冲突(e、 g.如果hadoop的配置版本是2.8.1,但在pom.xml文件中,dependances的版本是2.7.1,那么将其更改为2.8.1)再次运行maven install。
这为我解决了错误。

txu3uszq

txu3uszq8#

我也面临同样的问题。我找到了两个解决方案:(1)手动编辑jar文件:
用winrar(或类似工具)打开jar文件。转到meta info>services,通过附加以下内容编辑“org.apache.hadoop.fs.filesystem”:

org.apache.hadoop.fs.LocalFileSystem

(2) 更改依赖项的顺序如下

<dependencies>
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-hdfs</artifactId>
  <version>3.2.1</version>
</dependency>

<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-common</artifactId>
  <version>3.2.1</version>
</dependency>

<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-mapreduce-client-core</artifactId>
  <version>3.2.1</version>
</dependency>

<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-client</artifactId>
  <version>3.2.1</version>
</dependency>

</dependencies>
c90pui9n

c90pui9n9#

由于我的新手身份,我花了一些时间才从给出的答案中找出解决办法。如果有人从一开始就需要帮助,这就是我想到的:

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf

object MyObject {
  def main(args: Array[String]): Unit = {

    val mySparkConf = new SparkConf().setAppName("SparkApp").setMaster("local[*]").set("spark.executor.memory","5g");
    val sc = new SparkContext(mySparkConf)

    val conf = sc.hadoopConfiguration

    conf.set("fs.hdfs.impl", classOf[org.apache.hadoop.hdfs.DistributedFileSystem].getName)
    conf.set("fs.file.impl", classOf[org.apache.hadoop.fs.LocalFileSystem].getName)

我用的是spark 2.1
我的生活中也有这个角色 build.sbt ```
assemblyMergeStrategy in assembly := {
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x => MergeStrategy.first
}

gg58donl

gg58donl10#

我花了很长时间才用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)

以及我生命中的相关部分 build.sbt :

scalaVersion := "2.11.8"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.0.2"

我希望这能有所帮助!

klsxnrf1

klsxnrf111#

对于sbt,请在build.sbt中使用下面的mergestrategy

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) => {
    case PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.filterDistinctLines
    case s => old(s)
  }
}
nnt7mjpx

nnt7mjpx12#

这与flink无关,但我在flink中也发现了这个问题。
对于使用flink的用户,您需要下载预捆绑的hadoop并将其放入其中 /opt/flink/lib .

z5btuh9x

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 -我们称之为:

hadoopConfig.set("fs.hdfs.impl", 
        org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()
    );
    hadoopConfig.set("fs.file.impl",
        org.apache.hadoop.fs.LocalFileSystem.class.getName()
    );

更新:正确的修复

这件事引起了我的注意 krookedking 有一种基于配置的方法 maven-assembly 使用所有文件的合并版本 FileSystem 服务声明,看看下面他的答案。

gorkyyrv

gorkyyrv14#

假设您使用的是mvn和hadoop的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>

别忘了添加clouderamvn存储库。

<repository>
        <id>cloudera</id>
        <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
ds97pgxw

ds97pgxw15#

Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://nameNode:9000");
FileSystem fs = FileSystem.get(conf);

set fs.defaultfs对我有用!hadoop-2.8.1版本

相关问题