스키마에 대한 파일 시스템 없음 : 파일


97

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

modelPathNaiveBayes.bin파일을 가리키고 구성 개체가 인쇄 중입니다.Configuration: core-default.xml, core-site.xml

항아리 때문이라고 생각합니다. 아이디어가 있습니까?


... 좀 더 많은 정보를 필요
타리크

2
나 자신을 모르지만 Google을 빠르게 살펴보면 제안한대로 참조되지 않는 항아리와 관련된 몇 가지 문제가 있음을 알 수 있습니다. 아마도 다음 링크에서 답을 얻을 수 있습니다. groups.google.com/a/cloudera.org/forum/#!topic/scm-users/… grokbase.com/t/cloudera/cdh-user/134r64jm5t/…
Emile

클래스 경로에 hadoop-common-2.0.0-cdh4.3.0-sources.jar 및 hadoop-core-0.20.2.jar을 추가하고 있었는데, 먼저 제거했는데 그 이유를 알지 못했습니다.
Mahender Singh 2013-06-23

1
흠 .. 환경에 대해 말씀해 주시겠습니까? 또한 전체 예외 메시지를 보여주세요.
Tariq

modelPath의 가치는 무엇입니까? 시도해 본 적이 있으 file:///path/to/dir
Chris White

답변:


175

이것은 maven-assembly플러그인이 문제를 일으키는 전형적인 경우입니다 .

이것이 우리에게 일어난 이유

서로 다른 JAR ( hadoop-commonsfor LocalFileSystem, hadoop-hdfsfor 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-assemblyFileSystem


13
다음은 Spark에서 동일한 작업을 수행하는 데 필요한 동등한 코드입니다. 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)
Philip 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 ()); 이클립스에서 실행이 벌금을 달리고 있지만, 자바 -cp에서 실행할 때 때 작동하지, 그것을 오류 위의 프로그램 명령
Harish Pathak를

1
Harish, 당신은 무엇을 보았습니까? 같은 문제가 여기 만에 인 IntelliJ
ThommyH

멋진 대답에 대한 추가 사항 : hadoop JARS를 사용하고 있지만 Hadoop이 아닌 클러스터에서 작업을 실행하는 경우 "" "hadoopConfig.set ("fs.hdfs.impl ..... "" ""은 그렇지 않습니다. . 작품에서 어떤 경우에 우리는 어셈블리를 빌드 관리에 다시 떨어질 예에서 SBT 우리가 CONCAT 또는 filterDistinctLines의 mergeStrategy을 할 수 있습니다.
인간의

62

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>

이렇게하면 모든 org.apache.hadoop.fs.FileSystem 서비스가 하나의 파일에 병합됩니다.


3
이 솔루션이 가장 마음에 듭니다. 사실 이후에 구성 변경으로 패치하는 대신 소스 (빌드)에서 문제를 수정하십시오.
Kevin Pauli 2015 년

1
좋은 대답입니다. 비슷한 오류를 수정했습니다. maven-assembly-plugin 및 maven-jar-plugin / maven-dependency-plugin 조합으로 시도했지만 작동하지 않았습니다. 이 솔루션으로 Spark 앱이 작동했습니다. 감사합니다!
somnathchakrabarti

좋은 대답입니다! 감사합니다!
andrea.lagala

수락 된 답변으로 표시되어야합니다. ServicesResourceTransformer는 jar 파일이 META-INF / services 디렉토리를 사용하여 인터페이스를 구현에 매핑 할 때 필요합니다. 더 많은 정보는 여기에서 찾을 수 있습니다 : maven.apache.org/plugins/maven-shade-plugin/examples/…
Mario

훌륭한 대답입니다.
Niranjan Subramanian

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/2014/12/11/…
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"

Step3 : 깨끗한 sbt; sbt 어셈블리

위의 정보가 도움이되기를 바랍니다.


15
더 나은 솔루션과 같은 병합 수 있습니다 : case PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.filterDistinctLines이것은 등록 된 모든 파일 시스템을 유지합니다
ravwojdyla

@ravwojdyla, 매우 깔끔한 솔루션에 감사드립니다. 당신은 내 머리를 구했습니다. 아파치 스파크에 대한이 답변을 발견 한 잃어버린 영혼을 위해. sbt-assembly가 올바르게 작동 할 때 build.sbt에 추가하십시오.
욕심 코더

@ravwojdyla가 제공하는 솔루션은 나를 위해 일한 유일한 솔루션입니다.
Sergey Kovalev

2
@ravwojdyla가 제공하는 솔루션이 이상적입니다. build.sbt에서 비슷한 설정을했고 다음과 같이 사용했습니다.```assemblyMergeStrategy in assembly : = {case PathList ( "META-INF", "MANIFEST.MF") => MergeStrategy.discard case PathList ( "META-INF", "서비스", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.concat 케이스 _ => MergeStrategy.first}```
인간

2

maven을 사용하여 샘플을 빌드한다고 가정합니다.

실행하려는 JAR의 내용을 확인하십시오. 특히 META-INFO/services디렉토리, file org.apache.hadoop.fs.FileSystem. filsystem 구현 클래스 목록이 있어야합니다. org.apache.hadoop.hdfs.DistributedFileSystemHDFS 목록에 체크 라인 이 있으며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

또 다른 가능한 원인 (OPs 질문 자체가이 문제를 겪지는 않지만)은 기본값을로드하지 않는 구성 인스턴스를 만드는 경우입니다.

Configuration config = new Configuration(false);

기본값을로드하지 않으면 FileSystemHDFS에 액세스하려고 할 때 이와 같은 동일한 오류가 발생 하는 구현 과 같은 항목에 대한 기본 설정을 얻을 수 없습니다 . 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);

set fs.defaultFS가 나를 위해 작동합니다! 하둡 -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

나는 같은 문제에 직면했다. 두 가지 해결책을 찾았습니다. (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>

0

이것은 Flink와 관련이 없지만 Flink에서도이 문제를 발견했습니다.

사람들이 FLINK을 사용하기 위해, 당신은 다운로드 할 필요가 사전 번들 하둡를 내부에 넣어 /opt/flink/lib.


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