programing

스킴용 Hadoop 파일 시스템 없음: 파일

javaba 2023. 1. 9. 21:31
반응형

스킴용 Hadoop 파일 시스템 없음: 파일

.NaiveBayesClassiferhadoop, 이 오류 Hadoop, 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입니다.- 일 、 일 、 일 、 file 、 file file file file file file 。Configuration: core-default.xml, core-site.xml

항아리 때문인 것 같은데, 무슨 생각 있어?

인 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다'의 입니다.maven-assembly플러그인이 망가뜨리고 있습니다.

왜 우리에게 이런 일이 일어났는지

JAR다중 JAR)hadoop-commons★★★★★★에LocalFileSystem,hadoop-hdfs★★★★★★에DistributedFileSystem는 각각 하고 있습니다.org.apache.hadoop.fs.FileSystem의 의중에META-INFO/services디렉토리로 이동합니다.의 표준 ).java.util.ServiceLoader, 를 참조해 주세요.

★★★★★★를 사용하는 경우maven-assembly-plugin JAR이 META-INFO/services/org.apache.hadoop.fs.FileSystem 으로 추가된 있습니다.이러한 파일 중 하나만 남아 있습니다(마지막으로 추가된 파일). 「」는,FileSystemhadoop-commonshadoop-hdfs, (그래서)DistributedFileSystem더 이상 선언되지 않았습니다.

수정 방법

Hadoop후, 어떤 작업을 에 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()
    );

업데이트: 올바른 수정

by it it것 it it it it it it it it it it it it it it it it it it it it it 。krookedking으로 「」를 할 수 있는 것을 확인합니다.maven-assembly모든 것을 통합한 버전을 사용하다FileSystem서비스 선언을 참조하십시오. 아래를 참조하십시오.

음영 플러그인을 사용하는 사용자의 경우 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를 참조해 주세요.File System 서비스를 1개의 파일로 제공

참고로 이 문제는 하둡 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>

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"

도움이 됐으면 좋겠네요!

고마워 David_p,snota

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>

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

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

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>

cloudera mvn 저장소를 추가하는 것을 잊지 마십시오.

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

저는 제 프로젝트를 패키지화하기 위해 sbt 어셈블리를 사용합니다.나도 이 문제에 직면한다.제 해결책은 여기 있습니다.스텝 1: META-INF Mergestrategy를 build.sbt에 추가합니다.

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 클리닝

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

저도 같은 문제에 직면했어요.두 가지 해결 방법을 찾았습니다. (1) jar 파일을 수동으로 편집:

WinRar(또는 유사한 도구)를 사용하여 jar 파일을 엽니다.Meta-info > services 순으로 이동하여 "org.apache"를 편집합니다.hadoop.fs를 참조해 주세요.파일 시스템"을 추가합니다.

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>

당신은 메이븐을 사용하여 샘플을 만들 것 같습니다.

'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의존성은 선택사항이 아닙니다.

다른 생각할 수 있는 원인은 (OPs 질문 자체는 이 문제를 겪지 않지만) 기본값을 로드하지 않는 구성 인스턴스를 작성하는 것입니다.

Configuration config = new Configuration(false);

을 얻을 수 FileSystem구현하면 HDFS에 액세스하려고 할 때 이와 같은 오류가 발생합니다. : 매개 변수 없는 intrue이 문제를 해결할 수 있습니다.

커스텀 장소 등를 「」( 「」)에하는 경우는,Configuration 인지 주의할 것addResource()사용하고 있습니다.를 들어, 「」를 사용하고 있는 는,addResource(String)그런 다음 Hadoop은 문자열이 클래스 경로 리소스라고 가정합니다. 로컬 파일을 지정해야 하는 경우 다음을 시도해 보십시오.

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

나는 초보이기 때문에 주어진 답을 통해 해결책을 찾는 데 시간이 좀 걸렸다.처음부터 도움이 필요한 사람이 있다면 이렇게 생각해 냈어요

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을 사용하고 있습니다.

저는 이의 리리 my my my my my에 있습니다.build.sbt

assemblyMergeStrategy in assembly := {
  case PathList("META-INF", xs @ _*) => MergeStrategy.discard
  case x => MergeStrategy.first
}
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://nameNode:9000");
FileSystem fs = FileSystem.get(conf);

fs.default 설정난 FS가 좋아!Hadoop-2.8.1

아래의 mergeStrategy in build.sbt를 사용하는 SBT용

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

Flink와 관련된 것은 아니지만 Flink에서도 이 문제가 발견되었습니다.

Flink를 사용하는 사용자는 사전 번들된 Hadoop을 다운로드하여 내장해야 합니다./opt/flink/lib.

이 질문은 오래된 질문이지만, 최근 같은 문제에 직면했고, 오류의 발생원은 여기 답변과 다릅니다.

제 경우, 근본 원인은 hdfs가 다음 문제를 만났을 때 권한을 해석하려고 했기 때문입니다.//

$ hdfs dfs -ls //dev
ls: No FileSystem for scheme: null

따라서 코드의 경로 구축 부분에서 이중 슬래시 또는 빈 변수를 찾아보십시오.

관련 하둡 티켓: https://issues.apache.org/jira/browse/HADOOP-8087

Gradle Shadow 플러그인을 사용하고 있는 경우는, 다음의 설정을 추가할 필요가 있습니다.

shadowJar {
    mergeServiceFiles()
}

이 플러그인 사용

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

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
)

나도 비슷한 문제를 만났다.core-site.xml 및 hdfs-site.xml이 conf(개체) 리소스로 추가되었습니다.

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 설치를 다시 실행합니다.

이것으로 나는 오류를 해결했다.

언급URL : https://stackoverflow.com/questions/17265002/hadoop-no-filesystem-for-scheme-file

반응형