복붙노트

[HADOOP] hadoop scheme : file에 대한 FileSystem 없음

HADOOP

hadoop scheme : file에 대한 FileSystem 없음

이 오류가 발생하면서 간단한 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

나는 그것 때문에 항아리, 어떤 생각을 생각하십니까?

해결법

  1. ==============================

    1.이것은 메이븐 어셈블리 플러그인의 전형적인 경우입니다.

    이것은 메이븐 어셈블리 플러그인의 전형적인 경우입니다.

    서로 다른 JAR (LocalFileSystem의 경우 hadoop-commons, DistributedFileSystem의 경우 hadoop-hdfs)에는 각각 META-INFO / services 디렉토리에 org.apache.hadoop.fs.FileSystem이라는 파일이 있습니다. 이 파일은 선언하고자하는 파일 시스템 구현의 정식 클래스 이름을 나열합니다 (java.util.ServiceLoader를 통해 구현 된 서비스 공급자 인터페이스, org.apache.hadoop.FileSystem 2622 참고).

    maven-assembly-plugin을 사용할 때 모든 JAR 파일을 하나로 합병하고 모든 META-INFO / services / org.apache.hadoop.fs.FileSystem은 서로를 덮어 씁니다. 이 파일 중 하나만 남아 있습니다 (마지막으로 추가 된 파일). 이 경우 hadoop-commons의 FileSystem 목록이 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()
        );
    

    maven-assembly가 모든 FileSystem 서비스 선언의 병합 된 버전을 사용하도록하는 구성 기반의 방법이 있다는 것을주의 깊게 살펴 보았습니다. pom.xml 파일에 다음 플러그인을 추가하십시오.

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

    2.그림자 플러그인을 사용하는 사용자는 david_p의 조언에 따라 ServicesResourceTransformer를 플러그인 config에 추가하여 음영 처리 된 jar 파일의 서비스를 병합 할 수 있습니다.

    그림자 플러그인을 사용하는 사용자는 david_p의 조언에 따라 ServicesResourceTransformer를 플러그인 config에 추가하여 음영 처리 된 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. ==============================

    3.기록을 위해, 이것은 hadoop 2.4.0에서 아직도 일어나고 있습니다. 너무 실망한 ...

    기록을 위해, 이것은 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>
    
  4. ==============================

    4.덕분에 david_p, scala

    덕분에 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>
    
  5. ==============================

    5.나에게 Spark 2.0.2로 그것을 이해하게 나이를 가져 갔다. 그러나 여기에서 나의 작은 조각이있다 :

    나에게 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"
    

    이게 도움이되기를 바랍니다.

  6. ==============================

    6.maven의 경우 hadoop-hdfs에 대한 maven 종속성을 추가하면 (아래 링크 참조) 문제가 해결됩니다.

    maven의 경우 hadoop-hdfs에 대한 maven 종속성을 추가하면 (아래 링크 참조) 문제가 해결됩니다.

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

  7. ==============================

    7.당신이 hadoop의 mvn과 cloudera 분포를 사용한다고 가정합니다. 나는 cdh4.6을 사용하고 있으며 이러한 의존성을 추가하는 것은 나를 위해 일했다. 나는 당신이 hadoop과 mvn 의존성의 버전을 확인해야한다고 생각한다.

    당신이 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 메이븐 저장소를 추가하는 것을 잊지 마십시오.

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

    8.내 프로젝트를 패키징하기 위해 sbt 어셈블리를 사용합니다. 나는 또한이 문제를 만난다. 내 솔루션이 여기 있습니다. 1 단계 : build.sbt에 META-INF 병합 전략 추가

    내 프로젝트를 패키징하기 위해 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 정리; sbt 어셈블리

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

  9. ==============================

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

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

    실행하려는 JAR의 내용을 확인하십시오. 특히 META-INFO / services 디렉토리, org.apache.hadoop.fs.FileSystem 파일. 파일 시스템 구현 클래스 목록이 있어야합니다. 체크 라인 org.apache.hadoop.hdfs.DistributedFileSystem은 HDFS의 목록에 있고 로컬 파일 스키마의 org.apache.hadoop.fs.LocalFileSystem에 있습니다.

    이 경우 빌드 중에 참조 된 리소스를 재정의해야합니다.

    다른 가능성은 클래스 패스에 hadoop-hdfs.jar가 없어도 가능성이 낮습니다. 일반적으로 올바른 hadoop-client 의존성이 있다면 옵션이 아닙니다.

  10. ==============================

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

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

    Configuration config = new Configuration(false);
    

    기본값을로드하지 않으면 HDFS에 액세스 할 때 이와 같은 오류가 발생하는 FileSystem 구현과 같은 기본 설정을 얻지 못합니다. 기본값을로드하기 위해 true를 전달하는 매개 변수없는 생성자로 전환하면이 문제를 해결할 수 있습니다.

    또한 사용자 정의 구성 위치 (예 : 파일 시스템)를 Configuration 객체에 추가하는 경우 사용하는 addResource ()의 오버로드를주의하십시오. 예를 들어 addResource (String)를 사용하는 경우 Hadoop은 문자열이 클래스 경로 리소스라고 가정합니다. 로컬 파일을 지정해야하는 경우 다음을 시도하십시오.

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

    11.저의 신참함으로 인해 주어진 답변에서 해결 방법을 찾아내는 데 어느 정도 시간이 걸렸습니다. 다른 사람이 처음부터 도움이 필요하면 이것은 내가 생각해내는 것입니다.

    저의 신참함으로 인해 주어진 답변에서 해결 방법을 찾아내는 데 어느 정도 시간이 걸렸습니다. 다른 사람이 처음부터 도움이 필요하면 이것은 내가 생각해내는 것입니다.

    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
    }
    
  12. ==============================

    12.

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

    fs.defaultFS가 나를 위해 작동합니다! Hadoop-2.8.1

  13. ==============================

    13.build.sbt에서 mergeStrategy 이하의 SBT 사용

    build.sbt에서 mergeStrategy 이하의 SBT 사용

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

    14.sbt를 사용하는 경우 :

    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
    )
    
  15. ==============================

    15.이 플러그인 사용

    이 플러그인 사용

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

    16.나는 또한 비슷한 문제에 직면했다. conf (object)의 자원으로 core-site.xml과 hdfs-site.xml을 추가했습니다.

    나는 또한 비슷한 문제에 직면했다. conf (object)의 자원으로 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 파일에서 dependancies의 버전이 2.7.1 인 경우 2.8.1로 변경) Maven 설치를 다시 실행하십시오.

    이 오류가 해결되었습니다.

  17. from https://stackoverflow.com/questions/17265002/hadoop-no-filesystem-for-scheme-file by cc-by-sa and MIT license