hadoopスキームのFileSystemがありません:ファイル


96

単純なNaiveBayesClassiferhadoopを使用して実行しようとしていますが、このエラーが発生します

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..

modelPathNaiveBayes.binファイルを指しており、構成オブジェクトが印刷中です-Configuration: core-default.xml, core-site.xml

私はそれが瓶のためだと思います、何かアイデアはありますか?


さらに情報が必要...
Tariq

2
私自身を知らないが、グーグルをざっと見てみると、あなたが提案したように参照されていないjarの周りにいくつかの問題があることがわかります。おそらく以下のリンクが答えをもたらすでしょう。groups.google.com/a/cloudera.org/forum/#!topic/scm-users/... grokbase.com/t/cloudera/cdh-user/134r64jm5t/...
エミール・

私はhadoop-common-2.0.0-cdh4.3.0-sources.jarとhadoop-core-0.20.2.jarをクラスパスに追加していましたが、最初に削除しましたが、理由はわかりませんでした。
Mahender Singh 2013

1
うーん。環境について教えてください。また、完全な例外メッセージを表示してください。
Tariq 2013年

modelPathの価値は何ですか?試してみましたfile:///path/to/dir
Chris White

回答:


174

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

なぜこれが起こったのか

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

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


13
ここではスパークで同じことを行うために必要な同等のコードがあります: val hadoopConfig: Configuration = spark.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)
フィリップ・O.

8
実際、私はこのmaven依存関係http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.2.0をmavenに追加し、問題を解決しました。
B.Mr.W.

6
私はhadoop-hdfs、hadoop-core、hadoop-common、hadoop-clientを追加しようとしました、AsloはhadoopConfig.set( "fs.hdfs.impl"、org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()を追加しようとしました) ); hadoopConfig.set( "fs.file.impl"、org.apache.hadoop.fs.LocalFileSystem.class.getName()); 機能していませんが、Eclipseから実行すると問題なく動作しますが、java -cpコマンドから実行すると上記のエラーが表示されます
Harish Pathak

1
ハリッシュ、何を見た?ここでも同じ問題ですが、intellijを使用しています
ThommyH

素晴らしい答えへの追加だけです:hadoop JARSを使用しているが、ジョブを非Hadoopクラスターで実行している場合、 "" "hadoopConfig.set(" fs.hdfs.impl ..... "" ""はその場合、アセンブリビルドの管理にフォールバックします。たとえば、sbtでは、concatまたはfilterDistinctLinesのmergeStrategyを実行できます
human

62

シェードプラグインを使用している場合は、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つのファイルにマージされます


3
私はこのソリューションが一番好きです。事後の設定変更でパッチを当てるのではなく、ソース(ビルド)で問題を修正します。
Kevin Pauli

1
すばらしい答えです。私の同様のエラーを修正しました。maven-assembly-pluginおよびmaven-jar-plugin / maven-dependency-pluginの組み合わせを試してみましたが、機能しませんでした。このソリューションにより、Sparkアプリが機能しました。どうもありがとう!
somnathchakrabarti

正解です。どうもありがとう!
andrea.lagala 2016年

これは、受け入れられた回答としてマークする必要があります。ServicesResourceTransformerは、jarファイルがMETA-INF / servicesディレクトリを使用してインターフェイスを実装にマップする場合に必要です。詳しい情報はここで見つけることができます:maven.apache.org/plugins/maven-shade-plugin/examples/...
マリオ

すばらしい答えです。
Niranjan Subramanian 2017

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>

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>

1
これを読んだ後で初めて、ここのconfがHadoop構成であることがわかりました。brucebcampbell.wordpress.com
Sal

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)

そして、私の関連部分build.sbt

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

これがお役に立てば幸いです。



5

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>

cloudera mvnリポジトリーを追加することを忘れないでください。

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

4

sbtアセンブリを使用してプロジェクトをパッケージ化しています。私もこの問題に直面しています。私の解決策はここにあります。ステップ1:build.sbtにMETA-INFマージ戦略を追加する

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

ステップ2:build.sbtにhadoop-hdfs libを追加する

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

ステップ3:sbt clean; sbtアセンブリ

上記の情報がお役に立てば幸いです。


15
より良い解決策は次のようにマージすることかもしれません:case PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.filterDistinctLinesこれは登録されたすべてのファイルシステムを保持します
ravwojdyla

@ravwojdylaに感謝、かなりきちんとした解決策。あなたは私の髪を救った。失われた魂たちがApache Sparkのこの答えを発見したのです。sbt-assemblyが正常に機能する場合、これをbuild.sbtに追加します。
Greedy Coder

@ravwojdylaによって提供されたソリューションは、私のために働いた唯一のものです。
Sergey Kovalev 2017

2
@ravwojdylaによって提供されるソリューションが理想的です。build.sbtでも同様の設定を行い、次を使用しました: `` `assemblyMergeStrategy in assembly:= {case PathList(" META-INF "、" MANIFEST.MF ")=> MergeStrategy.discard case PathList(" META-INF "、 "services"、 "org.apache.hadoop.fs.FileSystem")=> MergeStrategy.concatケース_ => MergeStrategy.first} `` `
human

2

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

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

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

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


HI Roman ..iにも同じ問題があり、META-INFO / services / org.apache.hadoop.fs.FileSystemにhdfs行がありません。唯一の依存関係として2.0.0-mr1-cdh4.4.0があります。何をする必要がありますか?これに関するドキュメントはありますか?Mavenを使用したビルド
sethi

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()));

1

私の初心者のため、与えられた回答から修正を見つけるのにしばらく時間がかかりました。誰かが最初から助けを必要としているなら、これは私が思いついたものです:

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
}

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

セットfs.defaultFSは私のために働きます!Hadoop-2.8.1


1

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)
  }
}

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>

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
)

0

私も同じ問題に直面しました。私は2つの解決策を見つけました:(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>


-1

私も同様の問題に遭遇しました。conf(オブジェクト)のリソースとしてcore-site.xmlおよびhdfs-site.xmlを追加

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で編集されたバージョンの競合。(たとえば、hadoopの構成済みバージョンが2.8.1であるがpom.xmlファイルで依存関係がバージョン2.7.1である場合、それを2.8.1に変更します)Mavenインストールを再度実行します。

これでエラーが解決しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.