Saya mencoba untuk menjalankan sebuah 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 NaiveBayes.bin
file, dan konfigurasi objek printing - Konfigurasi: core-default.xml, core-site.xml
Saya pikir karena botol, ada ide?
Ini adalah kasus yang khas dari maven-majelis
plugin melanggar hal-hal.
Stoples yang berbeda (hadoop-commons
untuk LocalFileSystem
, hadoop-hdfs
untuk DistributedFileSystem
) masing-masing berisi file yang berbeda yang disebut org.apache.hadoop.fs.FileSystem
mereka META-INFO/jasa
direktori. File ini berisi daftar kanonik classnames dari filesystem implementasi mereka ingin menyatakan (Ini disebut Penyedia Layanan Interface yang diimplementasikan melalui jawa.util.ServiceLoader
, seperti org.apache.hadoop.FileSystem
line 2622).
Ketika kita menggunakan maven-perakitan-plugin
, ini menggabungkan semua Botol menjadi satu, dan semua META-INFO/jasa/org.apache.hadoop.fs.FileSystem
menimpa masing-lain. Hanya satu dari file-file ini tetap (yang terakhir yang ditambahkan). Dalam hal ini, File
daftar hadoop-commons
menimpa daftar dari hadoop-hdfs
, jadi DistributedFileSystem
tidak lagi menyatakan.
Setelah loading konfigurasi Hadoop, tapi sebelum melakukan apa-apa FileSystem
terkait, kita sebut ini:
hadoopConfig.set("fs.hdfs.impl",
org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()
);
hadoopConfig.set("fs.file.impl",
org.apache.hadoop.fs.LocalFileSystem.class.getName()
);
Itu telah dibawa ke perhatian saya oleh krookedking
yang ada berdasarkan konfigurasi cara untuk membuat maven-majelis
menggunakan gabungan versi dari semua File
jasa deklarasi, check out jawaban di bawah ini.
Bagi mereka yang menggunakan warna plugin, berikut david_p's saran, anda dapat menggabungkan layanan dalam berbayang jar dengan menambahkan ServicesResourceTransformer untuk plugin config:
<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 org.apache.hadoop.fs.FileSystem jasa dalam satu file
Butuh waktu lama untuk mencari tahu dengan Percikan 2.0.2, tapi di sini's my bit:
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 membangun.sbt
:
scalaVersion := "2.11.8"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.0.2"
Saya harap ini dapat membantu!
Sebagai catatan, ini masih terjadi di hadoop 2.4.0. Jadi frustasi...
Saya mampu mengikuti petunjuk di link ini: http://grokbase.com/t/cloudera/scm-users/1288xszz7r/no-filesystem-for-scheme-hdfs
Saya menambahkan baris berikut ke saya core-site.xml dan itu bekerja:
<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>
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>
Dengan asumsi bahwa anda menggunakan mvn dan cloudera distribusi hadoop. I'm menggunakan cdh4.6 dan menambahkan dependensi ini bekerja untuk saya.Saya pikir anda harus memeriksa versi hadoop dan mvn dependensi.
<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>
don't lupa untuk menambahkan cloudera mvn repositori.
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
Saya menggunakan sbt perakitan untuk paket proyek saya. Saya juga bertemu dengan masalah ini. Solusi saya adalah di sini. Langkah 1: menambahkan META-INF mergestrategy dalam membangun.sbt
case PathList("META-INF", "MANIFEST.MF") => MergeStrategy.discard
case PathList("META-INF", ps @ _*) => MergeStrategy.first
Langkah 2: tambahkan hadoop-hdfs lib untuk membangun.sbt
"org.apache.hadoop" % "hadoop-hdfs" % "2.4.0"
Step3: sbt bersih; sbt perakitan
Harapan informasi di atas dapat membantu anda.
Saya asumsikan anda membangun sampel menggunakan maven.
Silahkan periksa isi TOPLES anda're mencoba untuk menjalankan. Terutama META-INFO/jasa
direktori, file org.apache.hadoop.fs.FileSystem
. Harus ada daftar filsystem implementasi kelas-kelas. Cek line org.apache.hadoop.hdfs.DistributedFileSystem
hadir di daftar untuk HDFS dan org.apache.hadoop.fs.LocalFileSystem
untuk file lokal skema.
Jika hal ini terjadi, anda harus mengganti disebut sumber daya selama membangun.
Kemungkinan lain adalah anda hanya don't memiliki hadoop-hdfs.jar
dalam classpath anda tapi ini memiliki probabilitas rendah. Biasanya jika anda telah benar hadoop-klien
ketergantungan itu bukan pilihan.
Penyebab lain yang mungkin (meskipun OPs pertanyaan doesn't itu sendiri menderita dari ini) jika anda membuat konfigurasi instance yang tidak memuat default:
Configuration config = new Configuration(false);
Jika anda don't load default maka anda tidak't mendapatkan pengaturan default untuk hal-hal seperti FileSystem
implementasi yang mengarah ke identik kesalahan seperti ini ketika mencoba untuk mengakses HDFS. Beralih ke parameterless konstruktor yang lewat di benar
untuk memuat default dapat mengatasi hal ini.
Selain itu jika anda adalah menambahkan konfigurasi kustom lokasi (misalnya pada sistem file) ke Konfigurasi
objek berhati-hati yang berlebihan dari addResource()
yang anda gunakan. Misalnya jika anda menggunakan addResource(String)
maka Hadoop mengasumsikan bahwa string adalah kelas jalan daya, jika anda perlu untuk menentukan file lokal coba yang berikut ini:
File configFile = new File("example/config.xml");
config.addResource(new Path("file://" + configFile.getAbsolutePath()));
Butuh beberapa waktu untuk mencari tahu fix dari jawaban yang diberikan, karena saya newbieness. Ini adalah apa yang saya datang dengan, jika orang lain membutuhkan bantuan dari 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 aku punya ini bagian dalam membangun.sbt
assemblyMergeStrategy in assembly := {
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x => MergeStrategy.first
}
Untuk SBT gunakan di bawah ini mergeStrategy dalam membangun.sbt
mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) => {
case PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.filterDistinctLines
case s => old(s)
}
}
Saya menghadapi masalah yang sama. Saya menemukan dua solusi: (1) Mengedit file jar secara manual:
Buka file jar dengan WinRar (atau alat sejenis). Pergi ke Meta-info > pelayanan , dan edit "org.apache.hadoop.fs.FileSystem" dengan menambahkan:
org.apache.hadoop.fs.LocalFileSystem
(2) Mengubah urutan saya dependensi 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>
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
)
Saya juga menemukan masalah serupa. Ditambahkan core-site.xml dan hdfs-site.xml sebagai sumber daya conf (objek)
Configuration conf = new Configuration(true);
conf.addResource(new Path("<path to>/core-site.xml"));
conf.addResource(new Path("<path to>/hdfs-site.xml"));
Juga versi yang diedit konflik di pom.xml. (misalnya Jika dikonfigurasi versi hadoop adalah 2.8.1, tapi di pom.xml file, dependancies memiliki versi 2.7.1, maka perubahan itu untuk 2.8.1) Menjalankan Maven install lagi.
Ini soal kesalahan bagi saya.
Menggunakan 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>