106

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

瓶のせいだと思いますが、何かアイデアはありますか?

4

20 に答える 20

189

これは、maven-assemblyプラグインが問題を起こす典型的なケースです。

なぜこれが私たちに起こったのか

異なる JAR ( hadoop-commonsfor LocalFileSystemhadoop-hdfsfor ) には、それぞれのディレクトリでDistributedFileSystem呼び出される異なるファイルが含まれています。このファイルには、宣言するファイル システム実装の標準クラス名がリストされています (これは、 を介して実装されたサービス プロバイダ インタフェースと呼ばれます。を参照してください)。org.apache.hadoop.fs.FileSystemMETA-INFO/servicesjava.util.ServiceLoaderorg.apache.hadoop.FileSystem#loadFileSystems

を使用するmaven-assembly-pluginと、すべての JAR が 1 つにマージされ、すべてがMETA-INFO/services/org.apache.hadoop.fs.FileSystem互いに上書きされます。これらのファイルのうち 1 つだけが残ります (最後に追加されたファイル)。この場合、FileSystemリスト fromはリスト from を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-assemblyFileSystem

于 2014-01-14T16:37:27.537 に答える
73

シェード プラグインを使用している場合は、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>

これにより、すべての org.apache.hadoop.fs.FileSystem サービスが 1 つのファイルにマージされます

于 2014-12-17T18:23:01.463 に答える
9

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"

これが役立つことを願っています!

于 2016-11-23T13:15:13.393 に答える
9

記録として、これは 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>
于 2014-08-15T15:28:04.387 に答える
8

ありがとう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);

また

<property>
 <name>fs.hdfs.impl</name>
 <value>org.apache.hadoop.hdfs.DistributedFileSystem</value>
</property>
于 2014-07-23T07:40:20.220 に答える
7

maven の場合、hadoop-hdfs の maven 依存関係を追加するだけで (以下のリンクを参照)、問題が解決します。

http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.7.1

于 2015-09-09T09:59:47.137 に答える
2

maven を使用してサンプルをビルドすると仮定します。

実行しようとしている JAR の内容を確認してください。特にMETA-INFO/servicesディレクトリ、ファイルorg.apache.hadoop.fs.FileSystem。filsystem 実装クラスのリストがあるはずです。HDFS およびローカル ファイル スキームorg.apache.hadoop.hdfs.DistributedFileSystemのリストにチェック行があります。org.apache.hadoop.fs.LocalFileSystem

この場合、ビルド中に参照されたリソースをオーバーライドする必要があります。

他の可能性は、単にクラスパスにないということですhadoop-hdfs.jarが、これは確率が低いです。通常、正しいhadoop-client依存関係がある場合、それはオプションではありません。

于 2013-08-31T17:51:53.947 に答える
2

別の考えられる原因 (ただし、OP の質問自体はこれに悩まされることはありません) は、デフォルトをロードしない構成インスタンスを作成した場合です。

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()));
于 2016-02-10T14:46:34.590 に答える
1

これは Flink とは関係ありませんが、Flink でもこの問題を発見しました。

Flink を使用している場合は、Pre-bundled Hadoopをダウンロードして に配置する必要があります/opt/flink/lib

于 2020-01-09T12:06:54.430 に答える
0

このプラグインを使用

<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>
于 2016-01-08T10:10:09.213 に答える
0

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
)
于 2017-06-06T15:11:41.840 に答える