hadoop Tidak Ada Sistem File untuk skema: file


97

Saya mencoba menjalankan sederhana NaiveBayesClassifermenggunakan hadoop, mendapatkan kesalahan ini

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)

Kode:

    Configuration configuration = new Configuration();
    NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelPath), configuration);// error in this line..

modelPathmenunjuk ke NaiveBayes.binfile, dan objek konfigurasi sedang dicetak -Configuration: core-default.xml, core-site.xml

Saya pikir ini karena toples, ada ide?


Perlu info lebih lanjut ...
Tariq

2
Saya sendiri tidak tahu, tetapi sekilas melihat google menunjukkan bahwa ada beberapa masalah di sekitar toples yang tidak dirujuk seperti yang Anda sarankan. Mungkin tautan berikut akan memberikan jawaban. groups.google.com/a/cloudera.org/forum/#!topic/scm-users/… grokbase.com/t/cloudera/cdh-user/134r64jm5t/…
Emile

Saya menambahkan hadoop-common-2.0.0-cdh4.3.0-sources.jar dan hadoop-core-0.20.2.jar ke jalur kelas, saya hapus dulu dan berhasil tidak tahu mengapa.
Mahender Singh

1
Hmm..Bisakah Anda ceritakan tentang lingkungan Anda? Juga, tolong tunjukkan saya pesan pengecualian lengkap.
Tariq

Apa nilai modelPath? sudahkah Anda mencobafile:///path/to/dir
Chris White

Jawaban:


175

Ini adalah kasus umum maven-assemblyplugin merusak sesuatu.

Mengapa ini terjadi pada kami

JAR berbeda ( hadoop-commonsuntuk LocalFileSystem, hadoop-hdfsuntuk DistributedFileSystem) masing-masing berisi file berbeda yang disebut org.apache.hadoop.fs.FileSystemdalam META-INFO/servicesdirektorinya. File ini mencantumkan nama kelas kanonik dari implementasi sistem file yang ingin mereka deklarasikan (Ini disebut Antarmuka Penyedia Layanan yang diimplementasikan melalui java.util.ServiceLoader, lihat org.apache.hadoop.FileSystem#loadFileSystems).

Saat kami menggunakannya maven-assembly-plugin, ini menggabungkan semua JAR kami menjadi satu, dan semuanya META-INFO/services/org.apache.hadoop.fs.FileSystemmenimpa satu sama lain. Hanya satu dari file ini yang tersisa (yang terakhir ditambahkan). Dalam kasus ini, FileSystemdaftar dari hadoop-commonsmenimpa daftar dari hadoop-hdfs, sehingga DistributedFileSystemtidak lagi dideklarasikan.

Bagaimana kami memperbaikinya

Setelah memuat konfigurasi Hadoop, tetapi sebelum melakukan sesuatu yang FileSystemberhubungan, kami menyebutnya:

    hadoopConfig.set("fs.hdfs.impl", 
        org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()
    );
    hadoopConfig.set("fs.file.impl",
        org.apache.hadoop.fs.LocalFileSystem.class.getName()
    );

Pembaruan: perbaikan yang benar

Telah menjadi perhatian saya krookedkingbahwa ada cara berbasis konfigurasi untuk maven-assemblymenggunakan versi gabungan dari semua FileSystemdeklarasi layanan, lihat jawabannya di bawah ini.


13
Berikut kode setara yang diperlukan untuk melakukan hal yang sama di 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
Sebenarnya, saya baru saja menambahkan ketergantungan maven ini http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.2.0ke maven dan masalah diselesaikan.
B.Mr.W.

6
Saya telah mencoba menambahkan hadoop-hdfs, hadoop-core, hadoop-common, hadoop-client, Aslo mencoba menambahkan hadoopConfig.set ("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName () ); hadoopConfig.set ("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName ()); tetapi tidak berfungsi, ketika menjalankan dari eclipse itu berjalan dengan baik tetapi ketika dijalankan dari perintah java -cp itu menunjukkan kesalahan di atas
Harish Pathak

1
Harish, apa yang kamu lihat? Masalah yang sama di sini tetapi dengan intellij
ThommyH

Hanya tambahan untuk jawaban yang bagus: jika seseorang menggunakan hadoop JARS tetapi menjalankan pekerjaan di cluster non-hadoop, "" "hadoopConfig.set (" fs.hdfs.impl ..... "" "" tidak akan bekerja. Dalam hal ini kami akan kembali mengelola build assembly. misalnya di sbt, kami dapat melakukan mergeStrategy dari concat atau bahkan filterDistinctLines
human

62

Bagi mereka yang menggunakan plugin shade, dengan mengikuti saran david_p, Anda dapat menggabungkan layanan di stoples berbayang dengan menambahkan ServicesResourceTransformer ke konfigurasi plugin:

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

Ini akan menggabungkan semua layanan org.apache.hadoop.fs.FileSystem dalam satu file


3
Saya paling suka solusi ini. Perbaiki masalah di sumber (build) daripada menambalnya dengan perubahan konfigurasi setelah dilakukan.
Kevin Pauli

1
Jawaban yang bagus. Memperbaiki kesalahan serupa saya. Telah mencoba dengan kombinasi maven-assembly-plugin serta maven-jar-plugin / maven-dependency-plugin tetapi tidak berhasil. Solusi ini membuat aplikasi Spark saya berfungsi. Terima kasih banyak!
somnathchakrabarti

Jawaban yang bagus! Terima kasih banyak!
andrea.lagala

Ini harus ditandai sebagai jawaban yang diterima. ServicesResourceTransformer diperlukan ketika file jar memetakan antarmuka ke implementasi dengan menggunakan direktori META-INF / services. Informasi lebih lanjut dapat ditemukan di sini: maven.apache.org/plugins/maven-shade-plugin/examples/…
Mario

Jawaban yang sangat bagus.
Niranjan Subramanian

9

Sebagai catatan, hal ini masih terjadi di hadoop 2.4.0. Sangat membuat frustasi ...

Saya dapat mengikuti petunjuk di tautan ini: http://grokbase.com/t/cloudera/scm-users/1288xszz7r/no-filesystem-for-scheme-hdfs

Saya menambahkan yang berikut ini ke core-site.xml saya dan berhasil:

<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

terima kasih 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);

atau

<property>
 <name>fs.hdfs.impl</name>
 <value>org.apache.hadoop.hdfs.DistributedFileSystem</value>
</property>

1
Baru setelah saya membaca ini saya menyadari bahwa conf di sini adalah Konfigurasi Hadoop: brucebcampbell.wordpress.com/2014/12/11/…
Sal

8

Butuh waktu lama bagi saya untuk mengetahuinya dengan Spark 2.0.2, tapi inilah sedikit saya:

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)

Dan bagian yang relevan dari saya build.sbt:

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

Saya harap ini bisa membantu!



5

Dengan asumsi bahwa Anda menggunakan mvn dan cloudera distribusi hadoop. Saya menggunakan cdh4.6 dan menambahkan dependensi ini berhasil untuk saya. Saya pikir Anda harus memeriksa versi dependensi hadoop dan 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>

jangan lupa untuk menambahkan repositori mvn cloudera.

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

4

Saya menggunakan perakitan sbt untuk mengemas proyek saya. Saya juga menemui masalah ini. Solusi saya ada di sini. Langkah 1: tambahkan strategi META-INF di build.sbt Anda

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

Langkah2: tambahkan hadoop-hdfs lib ke build.sbt

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

Step3: sbt bersih; perakitan sbt

Semoga informasi diatas dapat membantu anda.


15
Solusi yang lebih baik mungkin dengan menggabungkan seperti: case PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.filterDistinctLinesIni akan menyimpan semua sistem file yang terdaftar
ravwojdyla

Terima kasih di @ravwojdyla, solusi yang cukup rapi. Anda menyelamatkan rambut saya. Untuk jiwa-jiwa yang terhilang yang menemukan jawaban ini untuk percikan Apache. Tambahkan ini ke build.sbt ketika sbt-assembly, bekerja dengan benar.
Greedy Coder

Solusi yang diberikan oleh @ravwojdyla adalah satu-satunya solusi yang berhasil untuk saya.
Sergey Kovalev

2
Solusi yang diberikan oleh @ravwojdyla sangat ideal. Saya melakukan penyiapan serupa di build.sbt dan menggunakan: `` assemblyMergeStrategy in assembly: = {case PathList ("META-INF", "MANIFEST.MF") => MergeStrategy.discard case PathList ("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.concat case _ => MergeStrategy.first} ``
manusia

2

Saya berasumsi bahwa Anda membuat sampel menggunakan maven.

Periksa konten JAR yang Anda coba jalankan. Terutama META-INFO/servicesdirektori, file org.apache.hadoop.fs.FileSystem. Harus ada daftar kelas implementasi filsystem. Garis periksa org.apache.hadoop.hdfs.DistributedFileSystemada dalam daftar untuk HDFS danorg.apache.hadoop.fs.LocalFileSystem untuk skema file lokal.

Jika demikian, Anda harus mengganti sumber daya yang dirujuk selama pembuatan.

Kemungkinan lainnya adalah Anda tidak memilikinya hadoop-hdfs.jardi classpath Anda, tetapi probabilitasnya rendah. Biasanya jika Anda memiliki hadoop-clientketergantungan yang benar , ini bukanlah pilihan.


HI Roman .. saya memiliki masalah yang sama dan META-INFO / services / org.apache.hadoop.fs.FileSystem tidak memiliki baris hdfs. Saya memiliki 2.0.0-mr1-cdh4.4.0 sebagai satu-satunya dependensi. Apa yang harus saya lakukan? Ada dokumentasi tentang ini? Menggunakan Maven untuk membangun
sethi

2

Penyebab lain yang mungkin (meskipun pertanyaan OP sendiri tidak menderita dari ini) adalah jika Anda membuat contoh konfigurasi yang tidak memuat default:

Configuration config = new Configuration(false);

Jika Anda tidak memuat default maka Anda tidak akan mendapatkan pengaturan default untuk hal-hal seperti FileSystemimplementasi yang mengarah ke kesalahan yang sama seperti ini ketika mencoba mengakses HDFS. Beralih ke konstruktor tanpa parameter dengan meneruskan trueke memuat default dapat menyelesaikan masalah ini.

Selain itu, jika Anda menambahkan lokasi konfigurasi khusus (misalnya pada sistem file) ke Configurationobjek, berhati-hatilah dengan kelebihan beban yang addResource()Anda gunakan. Misalnya jika Anda menggunakan addResource(String)maka Hadoop mengasumsikan bahwa string adalah sumber jalur kelas, jika Anda perlu menentukan file lokal, coba yang berikut ini:

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

1

Butuh beberapa saat bagi saya untuk mencari tahu perbaikan dari jawaban yang diberikan, karena kebaruan saya. Inilah yang saya temukan, jika ada orang lain yang membutuhkan bantuan sejak awal:

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)

Saya menggunakan Spark 2.1

Dan saya memiliki bagian ini di saya 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 bekerja untuk saya! Hadoop-2.8.1


1

Untuk penggunaan SBT di bawah ini mergeStrategy di 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

Gunakan plugin ini

<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

Jika Anda menggunakan 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

Saya menghadapi masalah yang sama. Saya menemukan dua solusi: (1) Mengedit file jar secara manual:

Buka file jar dengan WinRar (atau alat serupa). Buka Meta-info> layanan, dan edit "org.apache.hadoop.fs.FileSystem" dengan menambahkan:

org.apache.hadoop.fs.LocalFileSystem

(2) Mengubah urutan dependensi saya sebagai berikut

<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

Saya juga menemukan masalah serupa. Menambahkan core-site.xml dan hdfs-site.xml sebagai resource 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"));

Konflik versi yang juga diedit di pom.xml. (mis. Jika versi hadoop yang dikonfigurasi adalah 2.8.1, tetapi di file pom.xml, dependensi memiliki versi 2.7.1, lalu ubah ke 2.8.1) Jalankan instalasi Maven lagi.

Ini memecahkan kesalahan untuk saya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.