hadoop ไม่มี FileSystem สำหรับแบบแผน: ไฟล์


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

modelPath ชี้ไปที่ NaiveBayes.binไฟล์และวัตถุการกำหนดค่ากำลังพิมพ์ -Configuration: core-default.xml, core-site.xml

ฉันคิดว่ามันเป็นเพราะขวดความคิดใด ๆ ?


ต้องการข้อมูลเพิ่มเติม ...
Tariq

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 -ources.jar และ hadoop-core-0.20.2.jar ไปยังพา ธ คลาสฉันลบออกก่อนและมันใช้งานได้โดยไม่รู้ว่าทำไม
Mahender Singh

1
อืม.. ช่วยเล่าสภาพแวดล้อมของคุณให้ฟังหน่อยได้ไหม? นอกจากนี้โปรดแสดงข้อความยกเว้นทั้งหมดให้ฉันดู
Tariq

ค่า modelPath คืออะไร? คุณได้ลองfile:///path/to/dir
Chris White

คำตอบ:


177

นี่เป็นกรณีทั่วไปของmaven-assemblyปลั๊กอินที่ทำลายสิ่งต่างๆ

ทำไมสิ่งนี้ถึงเกิดขึ้นกับเรา

ขวดที่แตกต่างกัน ( hadoop-commonsสำหรับLocalFileSystem, hadoop-hdfsสำหรับDistributedFileSystem) แต่ละประกอบด้วยไฟล์ที่แตกต่างกันเรียกว่าorg.apache.hadoop.fs.FileSystemในพวกเขาMETA-INFO/servicesไดเรกทอรี ไฟล์นี้แสดงชื่อคลาสที่ยอมรับได้ของการใช้งานระบบไฟล์ที่พวกเขาต้องการประกาศ (เรียกว่า Service Provider Interface ที่ใช้งานผ่าน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-assemblyใช้งานเวอร์ชันที่ผสานรวมของการFileSystemประกาศบริการทั้งหมดดูคำตอบของเขาด้านล่าง


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 และแก้ไขปัญหาได้แล้ว
บช.น.

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
Harish คุณเคยเห็นอะไรมาบ้าง? ปัญหาเดียวกันที่นี่ แต่กับ intellij
ThommyH

นอกจากคำตอบที่ยอดเยี่ยม: หากมีใครใช้ hadoop JARS แต่ทำงานในคลัสเตอร์ที่ไม่ใช่ hadoop "" "hadoopConfig.set (" fs.hdfs.impl ..... "" "" จะไม่ งานในกรณีนี้เราจะกลับไปจัดการโครงสร้างการประกอบเช่นใน sbt เราสามารถทำการผสานกลยุทธ์ของ concat หรือแม้แต่ filterDistinctLines
มนุษย์

62

สำหรับผู้ที่ใช้ปลั๊กอิน shade ตามคำแนะนำของ david_p คุณสามารถรวมบริการใน jar ที่แรเงาได้โดยเพิ่ม ServicesResourceTransformer ไปยังการกำหนดค่าปลั๊กอิน:

  <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
ฉันชอบวิธีนี้ที่สุด แก้ไขปัญหาที่ต้นทาง (ตัวสร้าง) แทนที่จะแก้ไขด้วยการเปลี่ยนแปลง config หลังจากข้อเท็จจริง
Kevin Pauli

1
คำตอบที่ดี แก้ไขข้อผิดพลาดที่คล้ายกันของฉัน พยายามใช้ maven-assembly-plugin รวมทั้ง maven-jar-plugin / maven-dependency-plugin แต่ไม่ได้ผล โซลูชันนี้ทำให้แอป Spark ของฉันใช้งานได้ ขอบคุณมาก!
โสมนาถจักรมารตี

ตอบโจทย์มาก! ขอบคุณมาก!
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

สมมติว่าคุณใช้ mvn และการแจกแจง cloudera ของ hadoop ฉันใช้ 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: เพิ่มการผสาน META-INF ใน build.sbt ของคุณ

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

ขั้นตอนที่ 2: เพิ่ม hadoop-hdfs lib ใน build.sbt

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

ขั้นที่ 3: sbt สะอาด; การประกอบ sbt

หวังว่าข้อมูลข้างต้นจะช่วยคุณได้


16
ทางออกที่ดีกว่าอาจรวมเข้าด้วยกันเช่นcase PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.filterDistinctLinesนี้จะเก็บระบบไฟล์ที่ลงทะเบียนไว้ทั้งหมด
rav

ขอบคุณที่ @ravwojdyla วิธีแก้ปัญหาสวย ๆ คุณช่วยผมของฉัน สำหรับวิญญาณที่หลงทางค้นพบคำตอบนี้สำหรับประกายไฟ Apache เพิ่มสิ่งนี้ใน build.sbt เมื่อ sbt-assembly ทำงานได้อย่างถูกต้อง
Greedy Coder

โซลูชันที่จัดทำโดย @ravwojdyla เป็นวิธีเดียวที่เหมาะกับฉัน
Sergey Kovalev

3
วิธีแก้ปัญหาโดย @ravwojdyla เหมาะอย่างยิ่ง ฉันทำการตั้งค่าที่คล้ายกันใน build.sbt และใช้: `` assemblyMergeStrategy ในแอสเซมบลี: = {case PathList ("META-INF", "MANIFEST.MF") => MergeStrategy.discard case PathList ("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => กรณี MergeStrategy.concat _ => MergeStrategy.first} ``
มนุษย์

2

ฉันถือว่าคุณสร้างตัวอย่างโดยใช้ maven

โปรดตรวจสอบเนื้อหาของ JAR ที่คุณพยายามเรียกใช้ โดยเฉพาะอย่างยิ่งไดเรกทอรีไฟล์META-INFO/services org.apache.hadoop.fs.FileSystemควรมีรายการคลาสการใช้งานระบบฟิลม์ บรรทัดตรวจสอบorg.apache.hadoop.hdfs.DistributedFileSystemอยู่ในรายการสำหรับ HDFS และorg.apache.hadoop.fs.LocalFileSystemสำหรับโครงร่างไฟล์ในเครื่อง

หากเป็นกรณีนี้คุณต้องลบล้างทรัพยากรที่อ้างอิงในระหว่างการสร้าง

ความเป็นไปได้อื่น ๆ คือคุณไม่มีhadoop-hdfs.jarใน classpath ของคุณ แต่มีความเป็นไปได้ต่ำ โดยปกติแล้วหากคุณมีการhadoop-clientพึ่งพาที่ถูกต้องจะไม่ใช่ทางเลือก


สวัสดีโรมัน .. ฉันมีปัญหาเดียวกันและ 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);

หากคุณไม่โหลดค่าเริ่มต้นคุณจะไม่ได้รับการตั้งค่าเริ่มต้นสำหรับสิ่งต่างๆเช่นการ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

สำหรับ SBT ให้ใช้ด้านล่าง mergeStrategy ใน build.sbt

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 ด้วยตนเอง:

เปิดไฟล์ jar ด้วย WinRar (หรือเครื่องมือที่คล้ายกัน) ไปที่ 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 คุณต้องดาวน์โหลดPre-รวม Hadoop/opt/flink/libและใส่ไว้ใน


-1

ฉันก็เจอปัญหาที่คล้ายกัน เพิ่ม core-site.xml และ hdfs-site.xml เป็นทรัพยากรของ conf (object)

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.