hadoop Şema için Dosya Sistemi Yok: dosya


97

NaiveBayesClassiferHadoop kullanarak basit bir çalıştırmaya çalışıyorum , bu hatayı alıyorum

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)

Kod:

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

modelPathNaiveBayes.bindosyaya işaret ediyor ve yapılandırma nesnesi yazdırıyor -Configuration: core-default.xml, core-site.xml

Sanırım kavanozlar yüzünden, herhangi bir fikrin var mı?


Daha fazla bilgiye ihtiyacım var ...
Tarık

2
Kendimi bilmiyorum, ancak Google'a hızlı bir bakış, önerdiğiniz gibi kavanozlara atıfta bulunulmayan bazı sorunlar olduğunu gösteriyor. Belki aşağıdaki bağlantılar bir cevap verecektir. groups.google.com/a/cloudera.org/forum/#!topic/scm-users/… grokbase.com/t/cloudera/cdh-user/134r64jm5t/…
Emile

Sınıf yoluna hadoop-common-2.0.0-cdh4.3.0-sources.jar ve hadoop-core-0.20.2.jar ekliyordum, önce kaldırdım ve işe yaradı nedenini bilmiyorum.
Mahender Singh

1
Hmm .. Lütfen bana çevrenizden bahseder misiniz? Ayrıca lütfen bana tam istisna mesajını gösterin.
Tarık

ModelPath'in değeri nedir? denedin mifile:///path/to/dir
Chris White

Yanıtlar:


177

Bu, maven-assemblyeklenti bozmanın tipik bir örneğidir .

Bu neden bize oldu

Farklı JAR'ların ( hadoop-commonsfor LocalFileSystem, hadoop-hdfsfor DistributedFileSystem) her biri org.apache.hadoop.fs.FileSystemkendi META-INFO/servicesdizinlerinde adlandırılan farklı bir dosya içerir . Bu dosya, bildirmek istedikleri dosya sistemi uygulamalarının kurallı sınıf adlarını listeler (Buna, aracılığıyla uygulanan Servis Sağlayıcı Arayüzü denir java.util.ServiceLoader, bkz. org.apache.hadoop.FileSystem#loadFileSystems).

Kullandığımızda maven-assembly-plugin, tüm JAR'larımızı bir araya getirir ve hepsi META-INFO/services/org.apache.hadoop.fs.FileSystembirbirinin üzerine yazar. Bu dosyalardan yalnızca biri kaldı (son eklenen). Bu durumda, FileSystemlisteden gelen listenin hadoop-commonsüzerine yazılır hadoop-hdfs, dolayısıyla DistributedFileSystemartık bildirilmemiştir.

Nasıl düzelttik

Hadoop yapılandırmasını yükledikten sonra, ancak FileSystemilgili herhangi bir şey yapmadan hemen önce şunu diyoruz:

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

Güncelleme: doğru düzeltme

Tüm hizmet bildirimlerinin birleştirilmiş bir versiyonunu kullanmanın krookedkingkonfigürasyona dayalı bir yolu olduğu dikkatimi çekti , aşağıdaki cevabına göz atın.maven-assemblyFileSystem


13
Spark'ta aynı şeyi yapmak için gereken eşdeğer kod 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
Aslında, bu maven bağımlılığını maven'e ekledim http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.2.0ve problem çözüldü.
B.Mr.W.

6
Hadoop-hdfs, hadoop-core, hadoop-common, hadoop-client eklemeyi denedim, Aslo hadoopConfig.set ("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName () eklemeyi denedim ); hadoopConfig.set ("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName ()); ancak çalışmıyor, tutulmadan çalıştırıldığında iyi çalışıyor ancak java -cp komutundan çalıştırıldığında yukarıdaki hatayı gösteriyor
Harish Pathak

1
Harish, ne gördün? Burada da aynı sorun ancak intellij ile
ThommyH

Sadece harika yanıta bir ekleme: hadoop JARS kullanılıyorsa ancak işi hadoop olmayan bir kümede çalıştırıyorsa, "" "hadoopConfig.set (" fs.hdfs.impl ..... "" "" çalışmayacaktır Bu durumda, montaj yapısını yönetmeye geri döneceğiz. Örneğin, sbt'de concat veya hatta filterDistinctLines bir birleştirmeStratejisi yapabiliriz
insan

62

Shade eklentisini kullananlar için, david_p'nin tavsiyesine uyarak, ServicesResourceTransformer'ı eklenti yapılandırmasına ekleyerek gölgeli kavanozdaki hizmetleri birleştirebilirsiniz:

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

Bu, tüm org.apache.hadoop.fs.FileSystem hizmetlerini tek bir dosyada birleştirir


3
Bu çözümü en çok seviyorum. Sorunu, daha sonra yapılandırma değişiklikleriyle yamamak yerine kaynakta (derlemede) düzeltin.
Kevin Pauli

1
Mükemmel cevap. Benzer hatamı düzelttim. Maven-assembly-eklentisinin yanı sıra maven-jar-eklentisi / maven-bağımlılık-eklenti kombinasyonu ile denendi ancak çalışmadı. Bu çözüm Spark uygulamamı çalıştırdı. Çok teşekkürler!
somnathchakrabarti

Mükemmel cevap! Çok teşekkürler!
andrea.lagala

Bu, kabul edilen cevap olarak işaretlenmelidir. ServicesResourceTransformer, jar dosyaları arabirimleri bir META-INF / services dizini kullanarak uygulamalara eşlediğinde gereklidir. Daha fazla bilgi burada bulunabilir: maven.apache.org/plugins/maven-shade-plugin/examples/…
Mario

Mükemmel cevap.
Niranjan Subramanian

9

Kayıt için, bu hala hadoop 2.4.0'da oluyor. Çok sinir bozucu ...

Bu bağlantıdaki talimatları takip edebildim: http://grokbase.com/t/cloudera/scm-users/1288xszz7r/no-filesystem-for-scheme-hdfs

Aşağıdakileri core-site.xml dosyama ekledim ve işe yaradı:

<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

teşekkürler 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);

veya

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

1
Okuduğum Sadece sonra bu Farkındayım yaptım conf : Burada Hadoop Yapılandırma oldu brucebcampbell.wordpress.com/2014/12/11/...
Sal

8

Spark 2.0.2 ile bunu anlamam yaşlarımı aldı, ama işte benim parçam:

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)

Ve ilgili kısımlarım build.sbt:

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

Umarım bu yardımcı olabilir!



5

Hadoop'un mvn ve cloudera dağılımını kullandığınızı varsayarsak. Cdh4.6 kullanıyorum ve bu bağımlılıkları eklemek benim için çalıştı. Hadoop ve mvn bağımlılıklarının sürümlerini kontrol etmelisiniz.

<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 deposunu eklemeyi unutmayın.

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

4

Projemi paketlemek için sbt derlemesini kullanıyorum. Ben de bu problemle karşılaşıyorum. Benim çözümüm burada. Adım 1: build.sbt dosyanıza META-INF birleştirme stratejisi ekleyin

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

Adım 2: hadoop-hdfs lib dosyasını build.sbt'ye ekleyin

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

Adım 3: sbt temiz; sbt montajı

Umarım yukarıdaki bilgiler size yardımcı olabilir.


16
Daha iyi bir çözüm gibi birleştirme nedeniyle olabilir: case PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.filterDistinctLinesBu, tüm kayıtlı dosya sistemlerini tutacak
Rav

@Ravwojdyla için teşekkürler, oldukça temiz bir çözüm. Saçımı kurtardın. Apaçi kıvılcımı için bu cevabı keşfeden kayıp ruhlar için. Sbt-assembly düzgün çalıştığı zaman bunu build.sbt'ye ekleyin.
Greedy Coder

@Ravwojdyla tarafından sağlanan çözüm, benim için çalışan tek çözümdür.
Sergey Kovalev

3
@Ravwojdyla tarafından verilen çözüm idealdir. Build.sbt'de benzer bir kurulum yaptım ve şunu kullandım: `` `` 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} ``
insan

2

Maven kullanarak örnek oluşturduğunuzu varsayıyorum.

Lütfen çalıştırmaya çalıştığınız JAR içeriğini kontrol edin. Özellikle META-INFO/servicesdizin, dosya org.apache.hadoop.fs.FileSystem. Filsystem uygulama sınıflarının bir listesi olmalıdır. org.apache.hadoop.hdfs.DistributedFileSystemHDFS ve org.apache.hadoop.fs.LocalFileSystemyerel dosya düzeni için listede kontrol satırı mevcuttur .

Bu durumda, derleme sırasında başvurulan kaynağı geçersiz kılmanız gerekir.

Diğer olasılık, hadoop-hdfs.jarsınıf yolunuzda yoktur, ancak bunun olasılığı düşüktür. Genellikle doğru hadoop-clientbağımlılığa sahipseniz bu bir seçenek değildir.


HI Roman ..i'de aynı sorun var ve META-INFO / services / org.apache.hadoop.fs.FileSystem'in hdfs hattı yok. Tek bağımlılık olarak 2.0.0-mr1-cdh4.4.0 var. Ne yapmaya ihtiyacım var? Bununla ilgili herhangi bir belge var mı? İnşa etmek için
Maven'i

2

Diğer bir olası neden (OPs sorusunun kendisi bundan etkilenmese de), varsayılanları yüklemeyen bir yapılandırma örneği oluşturmanızdır:

Configuration config = new Configuration(false);

Varsayılanları yüklemezseniz, FileSystemHDFS'ye erişmeye çalışırken bunun gibi aynı hatalara yol açan uygulamalar gibi şeyler için varsayılan ayarları alamazsınız . trueVarsayılanları yüklemek için parametresiz kurucuya geçmek bu sorunu çözebilir.

Ayrıca, Configurationnesneye özel yapılandırma konumları (örneğin dosya sisteminde) ekliyorsanız , hangi aşırı yüklemeyi addResource()kullandığınıza dikkat edin . Örneğin, kullanırsanız, addResource(String)Hadoop dizenin bir sınıf yolu kaynağı olduğunu varsayar, yerel bir dosya belirtmeniz gerekiyorsa aşağıdakileri deneyin:

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

1

Yeniliğimden dolayı verilen cevaplardan bir çözüm bulmam biraz zaman aldı. Başından beri başka birinin yardıma ihtiyacı olursa, bulduğum şey buydu:

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 kullanıyorum

Ve bu kısım bende var 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 benim için çalışıyor! Hadoop-2.8.1


1

SBT kullanımı için build.sbt'de mergeStrategy altında

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

0

Bu eklentiyi kullanın

<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 kullanıyorsanız :

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

Ben de aynı problemle karşılaştım. İki çözüm buldum: (1) Jar dosyasını manuel olarak düzenleme:

Jar dosyasını WinRar (veya benzer araçlar) ile açın. Meta-bilgi> hizmetler'e gidin ve ekleyerek "org.apache.hadoop.fs.FileSystem" dosyasını düzenleyin:

org.apache.hadoop.fs.LocalFileSystem

(2) Bağımlılıklarımın sırasını aşağıdaki gibi değiştirmek

<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

Ben de benzer bir sorunla karşılaştım. Conf (object) kaynakları olarak core-site.xml ve hdfs-site.xml eklendi

Configuration conf = new Configuration(true);    
conf.addResource(new Path("<path to>/core-site.xml"));
conf.addResource(new Path("<path to>/hdfs-site.xml"));

Ayrıca pom.xml'deki sürüm çakışmaları düzenlendi. (örn. hadoop'un yapılandırılmış sürümü 2.8.1 ise, ancak pom.xml dosyasında bağımlılıklar 2.7.1 sürümüne sahipse, bunu 2.8.1 olarak değiştirin) Maven kurulumunu tekrar çalıştırın.

Bu benim için hatayı çözdü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.