Saya mencoba menjalankan sederhana NaiveBayesClassifer
menggunakan 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..
modelPath
menunjuk ke NaiveBayes.bin
file, dan objek konfigurasi sedang dicetak -Configuration: core-default.xml, core-site.xml
Saya pikir ini karena toples, ada ide?
file:///path/to/dir
Jawaban:
Ini adalah kasus umum
maven-assembly
plugin merusak sesuatu.Mengapa ini terjadi pada kami
JAR berbeda (
hadoop-commons
untukLocalFileSystem
,hadoop-hdfs
untukDistributedFileSystem
) masing-masing berisi file berbeda yang disebutorg.apache.hadoop.fs.FileSystem
dalamMETA-INFO/services
direktorinya. File ini mencantumkan nama kelas kanonik dari implementasi sistem file yang ingin mereka deklarasikan (Ini disebut Antarmuka Penyedia Layanan yang diimplementasikan melaluijava.util.ServiceLoader
, lihatorg.apache.hadoop.FileSystem#loadFileSystems
).Saat kami menggunakannya
maven-assembly-plugin
, ini menggabungkan semua JAR kami menjadi satu, dan semuanyaMETA-INFO/services/org.apache.hadoop.fs.FileSystem
menimpa satu sama lain. Hanya satu dari file ini yang tersisa (yang terakhir ditambahkan). Dalam kasus ini,FileSystem
daftar darihadoop-commons
menimpa daftar darihadoop-hdfs
, sehinggaDistributedFileSystem
tidak lagi dideklarasikan.Bagaimana kami memperbaikinya
Setelah memuat konfigurasi Hadoop, tetapi sebelum melakukan sesuatu yang
FileSystem
berhubungan, kami menyebutnya:Pembaruan: perbaikan yang benar
Telah menjadi perhatian saya
krookedking
bahwa ada cara berbasis konfigurasi untukmaven-assembly
menggunakan versi gabungan dari semuaFileSystem
deklarasi layanan, lihat jawabannya di bawah ini.sumber
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)
http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.2.0
ke maven dan masalah diselesaikan.Bagi mereka yang menggunakan plugin shade, dengan mengikuti saran david_p, Anda dapat menggabungkan layanan di stoples berbayang dengan menambahkan ServicesResourceTransformer ke konfigurasi plugin:
Ini akan menggabungkan semua layanan org.apache.hadoop.fs.FileSystem dalam satu file
sumber
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:
sumber
terima kasih david_p, scala
atau
sumber
Butuh waktu lama bagi saya untuk mengetahuinya dengan Spark 2.0.2, tapi inilah sedikit saya:
Dan bagian yang relevan dari saya
build.sbt
:Saya harap ini bisa membantu!
sumber
Untuk maven, cukup tambahkan dependensi maven untuk hadoop-hdfs (lihat tautan di bawah) akan menyelesaikan masalah.
http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.7.1
sumber
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.
jangan lupa untuk menambahkan repositori mvn cloudera.
sumber
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
Langkah2: tambahkan hadoop-hdfs lib ke build.sbt
Step3: sbt bersih; perakitan sbt
Semoga informasi diatas dapat membantu anda.
sumber
case PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.filterDistinctLines
Ini akan menyimpan semua sistem file yang terdaftarSaya berasumsi bahwa Anda membuat sampel menggunakan maven.
Periksa konten JAR yang Anda coba jalankan. Terutama
META-INFO/services
direktori, fileorg.apache.hadoop.fs.FileSystem
. Harus ada daftar kelas implementasi filsystem. Garis periksaorg.apache.hadoop.hdfs.DistributedFileSystem
ada 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.jar
di classpath Anda, tetapi probabilitasnya rendah. Biasanya jika Anda memilikihadoop-client
ketergantungan yang benar , ini bukanlah pilihan.sumber
Penyebab lain yang mungkin (meskipun pertanyaan OP sendiri tidak menderita dari ini) adalah jika Anda membuat contoh konfigurasi yang tidak memuat default:
Jika Anda tidak memuat default maka Anda tidak akan mendapatkan pengaturan default untuk hal-hal seperti
FileSystem
implementasi yang mengarah ke kesalahan yang sama seperti ini ketika mencoba mengakses HDFS. Beralih ke konstruktor tanpa parameter dengan meneruskantrue
ke memuat default dapat menyelesaikan masalah ini.Selain itu, jika Anda menambahkan lokasi konfigurasi khusus (misalnya pada sistem file) ke
Configuration
objek, berhati-hatilah dengan kelebihan beban yangaddResource()
Anda gunakan. Misalnya jika Anda menggunakanaddResource(String)
maka Hadoop mengasumsikan bahwa string adalah sumber jalur kelas, jika Anda perlu menentukan file lokal, coba yang berikut ini:sumber
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:
Saya menggunakan Spark 2.1
Dan saya memiliki bagian ini di saya
build.sbt
sumber
set fs.defaultFS bekerja untuk saya! Hadoop-2.8.1
sumber
Untuk penggunaan SBT di bawah ini mergeStrategy di build.sbt
sumber
Gunakan plugin ini
sumber
Jika Anda menggunakan sbt :
sumber
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:
(2) Mengubah urutan dependensi saya sebagai berikut
sumber
Ini tidak terkait dengan Flink, tapi saya juga menemukan masalah ini di Flink.
Untuk orang yang menggunakan Flink, Anda perlu mengunduh Hadoop yang sudah dibundel sebelumnya dan memasukkannya ke dalamnya
/opt/flink/lib
.sumber
Saya juga menemukan masalah serupa. Menambahkan core-site.xml dan hdfs-site.xml sebagai resource conf (object)
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.
sumber