योजना के लिए कोई फ़ाइल सिस्टम नहीं: फ़ाइल


96

मैं NaiveBayesClassiferइस त्रुटि को प्राप्त करते हुए, हडूप का उपयोग करके एक सरल चलाने की कोशिश कर रहा हूं

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

modelPathNaiveBayes.binफ़ाइल को इंगित कर रहा है, और कॉन्फ़िगरेशन ऑब्जेक्ट मुद्रण कर रहा है -Configuration: core-default.xml, core-site.xml

मुझे लगता है कि जार, किसी भी विचार के कारण?


कुछ और जानकारी चाहिए ...
तारिक

2
अपने आप को नहीं जानते हैं, लेकिन Google पर एक त्वरित नज़र से पता चलता है कि जार के आसपास कुछ मुद्दे हैं जिन्हें आपके द्वारा सुझाए गए अनुसार संदर्भित नहीं किया जा रहा है। शायद निम्नलिखित लिंक से उत्तर मिलेगा। groups.google.com/a/cloudera.org/forum/#!topic/scm-users/... grokbase.com/t/cloudera/cdh-user/134r64jm5t/...
एमिल

मैं हैड-कॉमन-2.0.0-cdh4.3.0-source.jar और hadoop-core-0.20.2.jar को क्लास पाथ में शामिल कर रहा था, मैंने पहले हटा दिया और यह काम नहीं किया पता नहीं क्यों।
महेन्द्र सिंह

1
हम्म..क्या आप मुझे अपने पर्यावरण के बारे में बता सकते हैं? इसके अलावा, कृपया मुझे पूरा अपवाद संदेश दिखाएं।
तारिक

मॉडलपाथ का मूल्य क्या है? क्या आपने कोशिश कीfile:///path/to/dir
क्रिस व्हाइट

जवाबों:


174

यह maven-assemblyप्लगइन ब्रेकिंग चीजों का एक विशिष्ट मामला है ।

हमारे साथ ऐसा क्यों हुआ

विभिन्न जार ( hadoop-commonsके लिए LocalFileSystem, hadoop-hdfsके लिए DistributedFileSystemप्रत्येक) एक अलग बुलाया फ़ाइल में org.apache.hadoop.fs.FileSystemउनके में META-INFO/servicesनिर्देशिका। यह फ़ाइल उन फ़ाइल सिस्टम कार्यान्वयन के विहित वर्गनामों को सूचीबद्ध करती है, जिन्हें वे घोषित करना चाहते हैं (इसे सेवा प्रदाता इंटरफ़ेस कहा जाता है, जिसे 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
यहाँ स्पार्क में समान काम करने के लिए आवश्यक समान कोड है: 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)
फिलिप ओ।

8
दरअसल, मैंने इस मावेन पर निर्भरता http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.2.0को मावेन और समस्या के समाधान के लिए जोड़ा ।
B.Mr.W.

6
मैंने हैड-एचडीएफ़, हडूप-कोर, हडूप-कॉमन, हडूप-क्लाइंट को जोड़ने की कोशिश की है, एसो ने हैडकॉन्फ़िग.सेट ("fs.hdfs.impl", org.apache.hadoop.dfs.DistributedFileSystem.class.getName () को जोड़ने की कोशिश की है) ); hadoopConfig.set ("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName ()); लेकिन काम नहीं कर रहा है, जब ग्रहण से चल रहा है तो यह ठीक चल रहा है लेकिन जब जावा-कमांड से चल रहा है तो यह उपरोक्त त्रुटि से पता चलता है
हरीश पाठक

1
हरीश, तुमने क्या देखा है? यहाँ एक ही समस्या है, लेकिन intellij के साथ
ThommyH

अद्भुत उत्तर के अतिरिक्त: यदि कोई हैडऑप JARS का उपयोग कर रहा है, लेकिन गैर-हडप क्लस्टर में काम चला रहा है, तो "" "हैडऑकॉनफिग.सेट (" fs.hdfs.impl ..... "" "" नहीं चलेगा काम। किस मामले में हम विधानसभा के निर्माण का प्रबंधन करने से पीछे हट जाएंगे। उदाहरण के तौर पर sbt में हम कॉन्ट्रास्ट्रेगेटी ऑफ कॉनैट या फ़िल्टरडिस्टेनेलीन भी कर सकते हैं
मानव

62

छाया प्लगइन का उपयोग करने वालों के लिए, david_p की सलाह पर चलकर, आप प्लग इन के लिए 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
मुझे यह घोल सबसे अच्छा लगता है। तथ्य के बाद इसे कॉन्फ़िगर परिवर्तन के साथ पैच करने के बजाय स्रोत (बिल्ड) पर समस्या को ठीक करें।
केविन पाउली

1
बहुत बढ़िया जवाब। मेरी समान त्रुटि को ठीक किया। मावेन-असेंबली-प्लगइन के साथ-साथ मावेन-जार-प्लगइन / मावेन-निर्भरता-प्लगइन संयोजन की कोशिश की, लेकिन काम नहीं किया। इस समाधान ने मेरा स्पार्क ऐप काम कर दिया। आपका बहुत बहुत धन्यवाद!
सोमनाथचक्रवर्ती

बहुत बढ़िया जवाब! आपका बहुत बहुत धन्यवाद!
andrea.lagala

इसे स्वीकृत उत्तर के रूप में चिह्नित किया जाना चाहिए। ServicesResourceTransformer के लिए आवश्यक है जब जार फ़ाइलें META-INF / सेवा निर्देशिका का उपयोग करके कार्यान्वयन में हस्तक्षेप करती हैं। अधिक जानकारी यहां पाई जा सकती है: maven.apache.org/plugins/maven-shade-plugin/examples/…
मारियो

बहुत बढ़िया जवाब।
निरंजन सुब्रमण्यन

9

रिकॉर्ड के लिए, यह अभी भी हडॉप 2.4.0 में हो रहा है। कितना निराशाजनक...

मैं इस लिंक में दिए गए निर्देशों का पालन करने में सक्षम था: http://grokbase.com/t/cloudera/scm-users/1288xszz7r/no-filesystem-for-scheme-hdfs

मैंने अपने कोर- 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/...
साल

8

मुझे स्पार्क 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 और क्लाउडडर वितरण का उपयोग कर रहे हैं। मैं cdh4.6 का उपयोग कर रहा हूं और मेरे लिए इन निर्भरताओं को जोड़ रहा है। मुझे लगता है कि आपको हडूप और मावन निर्भरता के संस्करणों की जांच करनी चाहिए।

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

बादल मावन भंडार को जोड़ना मत भूलना।

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

4

मैं अपने प्रोजेक्ट को पैकेज करने के लिए sbt असेंबली का उपयोग करता हूं। मैं इस समस्या को भी पूरा करता हूं। मेरा समाधान यहाँ है। Step1: अपने build.sbt में META-INF mergestrategy जोड़ें

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

Step2: build.sbt के लिए hadoop-hdfs lib जोड़ें

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

चरण 3: एसबीटी साफ; एसबीटी विधानसभा

आशा है उपरोक्त जानकारी आपकी मदद कर सकती है।


15
विलय करने का एक बेहतर समाधान हो सकता है: case PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.filterDistinctLinesयह सभी पंजीकृत फाइल सिस्टम को बनाए रखेगा
ravwojdyla

@Ravwojdyla पर धन्यवाद, बहुत साफ समाधान। आपने मेरे बाल बचा लिए। अपाचे चिंगारी के लिए इस जवाब की खोज खो आत्माओं के लिए। Sbt- असेंबली में, build.sbt में इसे जोड़ें, सही तरीके से काम करता है।
लालची कोडर

@Ravwojdyla द्वारा प्रदान किया गया समाधान एकमात्र ऐसा है जो मेरे लिए काम करता है।
सर्गेई कोवलेव

2
@Ravwojdyla द्वारा दिया गया समाधान आदर्श है। मैंने build.sbt में एक समान सेटअप किया था और उपयोग किया था: विधानसभा में `` असेम्बलीमेयरस्ट्रेगेटी: = {केस पैथलिस्ट ("META-INF", "MANIFEST.MF") => MergeStrategy.discard केस PathList ("META-INF") "सेवाएं", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.concat case _ => MergeStrategy.first} `` `
मानव

2

मुझे लगता है कि आप मावेन का उपयोग कर नमूना बनाते हैं।

कृपया उस JAR की सामग्री की जाँच करें जिसे आप चलाने का प्रयास कर रहे हैं। विशेष रूप से META-INFO/servicesनिर्देशिका, फ़ाइल org.apache.hadoop.fs.FileSystem। फिल्म सिस्टम कार्यान्वयन कक्षाओं की सूची होनी चाहिए। चेक लाइन org.apache.hadoop.hdfs.DistributedFileSystemएचडीएफएस और org.apache.hadoop.fs.LocalFileSystemस्थानीय फ़ाइल योजना के लिए सूची में मौजूद है ।

यदि यह स्थिति है, तो आपको बिल्ड के दौरान संदर्भित संसाधन को ओवरराइड करना होगा।

अन्य संभावना यह है कि आप hadoop-hdfs.jarअपने वर्गपथ में नहीं हैं , लेकिन इसकी संभावना कम है। आमतौर पर यदि आपके पास सही hadoop-clientनिर्भरता है तो यह एक विकल्प नहीं है।


HI रोमन .. मेरे पास एक ही मुद्दा है और META-INFO / सेवाएं / org.apache.hadoop.fs.FileSystem में HDfs लाइन नहीं है। मेरे पास केवल निर्भरता के रूप में 2.0.0-mr1-cdh4.4.0 है। मुझे क्या करना चाहिये? इस बारे में कोई दस्तावेज? मावेन का उपयोग करने के लिए
सेठी

2

एक अन्य संभावित कारण (हालांकि ओपी प्रश्न खुद से ग्रस्त नहीं होता है) यदि आप एक कॉन्फ़िगरेशन उदाहरण बनाते हैं जो चूक को लोड नहीं करता है:

Configuration config = new Configuration(false);

यदि आप डिफॉल्ट्स को लोड नहीं करते हैं, तो आपको FileSystemकार्यान्वयन जैसी चीजों के लिए डिफ़ॉल्ट सेटिंग्स नहीं मिलेंगी जो एचडीएफएस तक पहुंचने की कोशिश करते समय इस तरह की समान त्रुटियों की ओर ले जाती हैं। trueडिफॉल्ट को लोड करने के लिए पास करने के पैरामीटर रहित निर्माता पर स्विच करने से यह हल हो सकता है।

इसके अतिरिक्त यदि आप Configurationऑब्जेक्ट में कस्टम कॉन्फ़िगरेशन स्थान (जैसे फ़ाइल सिस्टम पर) जोड़ रहे हैं, तो सावधान रहें कि आप किस ओवरलोड का addResource()उपयोग करते हैं। उदाहरण के लिए यदि आप उपयोग करते हैं addResource(String)तो Hadoop मानता है कि स्ट्रिंग एक क्लास पाथ रिसोर्स है, यदि आपको एक स्थानीय फ़ाइल निर्दिष्ट करने की आवश्यकता है, तो निम्नलिखित प्रयास करें:

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

1

यह मेरे newbieness के कारण दिए गए जवाबों से तय करने में मुझे कुछ समय लगा। यह वही है जिसके साथ मैं आया था, अगर किसी और को शुरुआत से ही मदद चाहिए:

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)

मैं स्पार्क 2.1 का उपयोग कर रहा हूं

और मेरे पास यह हिस्सा है 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);

मेरे लिए fs.defaultFS काम करता है! Hadoop-2.8.1


1

SBT के लिए build.sbt में mergeStrategy के नीचे उपयोग करें

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) जार फ़ाइल को मैन्युअल रूप से संपादित करना:

WinRar (या समान टूल) के साथ जार फ़ाइल खोलें। मेटा-जानकारी> सेवाओं पर जाएं, और "org.apache.hadoop.fs.FileSystem" को जोड़कर संपादित करें:

org.apache.hadoop.fs.LocalFileSystem

(२) मेरी निर्भरता के क्रम को अनुसरण के रूप में बदलना

<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 में भी पाई है।

फ्लिंक का उपयोग करने वाले लोगों के लिए, आपको पूर्व-बंडल किए गए Hadoop को डाउनलोड करने और इसे अंदर डालने की आवश्यकता है /opt/flink/lib


-1

मैं भी इसी तरह के मुद्दे पर आया था। जोड़े गए कोर- site.xml और hdfs-site.xml को संसाधनों के ऑब्जेक्ट (ऑब्जेक्ट) के रूप में जोड़ा गया

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 में संपादित संस्करण संघर्ष। (जैसे अगर हडूप का कॉन्फ़िगर किया गया संस्करण 2.8.1 है, लेकिन pom.xml फ़ाइल में, निर्भरता का संस्करण 2.7.1 है, तो उसे बदलकर 2.8.1 करें) रन मावेन को फिर से इंस्टॉल करें।

इससे मेरे लिए त्रुटि हल हो गई।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.