hadoop Không có FileSystem cho lược đồ: tệp


96

Tôi đang cố gắng chạy đơn giản NaiveBayesClassiferbằng hadoop, gặp lỗi này

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)

Mã:

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

modelPathđang trỏ tới NaiveBayes.bintệp và đối tượng cấu hình đang in -Configuration: core-default.xml, core-site.xml

Tôi nghĩ rằng đó là do lọ, bất kỳ ý tưởng?


Cần thêm một số thông tin ...
Tariq

2
Tôi không biết bản thân tôi, nhưng một cái nhìn nhanh trên google cho thấy rằng có một số vấn đề xung quanh lọ không được tham chiếu như bạn đề xuất. Có lẽ các liên kết sau đây sẽ mang lại câu trả lời. groups.google.com/a/cloudera.org/forum/#!topic/scm-users/… grokbase.com/t/cloudera/cdh-user/134r64jm5t/…
Emile

Tôi đã thêm hadoop-common-2.0.0-cdh4.3.0-sources.jar và hadoop-core-0.20.2.jar vào đường dẫn lớp, trước tiên tôi đã xóa và nó hoạt động không biết tại sao.
Mahender Singh

1
Hmm..Bạn có thể vui lòng cho tôi biết về môi trường của bạn không? Ngoài ra, vui lòng cho tôi xem thông báo ngoại lệ hoàn chỉnh.
Tariq

Giá trị của modelPath là gì? Bạn đã thửfile:///path/to/dir
Chris trắng

Câu trả lời:


174

Đây là một trường hợp điển hình của việc maven-assemblyplugin phá vỡ mọi thứ.

Tại sao điều này lại xảy ra với chúng tôi

Các JAR khác nhau ( hadoop-commonscho LocalFileSystem, hadoop-hdfscho DistributedFileSystem) mỗi tệp chứa một tệp khác nhau được gọi org.apache.hadoop.fs.FileSystemtrong META-INFO/servicesthư mục của chúng . Tệp này liệt kê các tên lớp chuẩn của các triển khai hệ thống tệp mà chúng muốn khai báo (Đây được gọi là Giao diện nhà cung cấp dịch vụ được triển khai thông qua java.util.ServiceLoader, xem org.apache.hadoop.FileSystem#loadFileSystems).

Khi chúng ta sử dụng maven-assembly-plugin, nó sẽ hợp nhất tất cả các JAR của chúng ta thành một và tất cả đều META-INFO/services/org.apache.hadoop.fs.FileSystemghi đè lên nhau. Chỉ còn lại một trong những tệp này (tệp cuối cùng đã được thêm vào). Trong trường hợp này, FileSystemdanh sách từ hadoop-commonsghi đè danh sách từ hadoop-hdfs, do đó, DistributedFileSystemkhông còn được khai báo nữa.

Chúng tôi đã sửa nó như thế nào

Sau khi tải cấu hình Hadoop, nhưng ngay trước khi thực hiện bất kỳ điều gì FileSystemliên quan, chúng tôi gọi đây là:

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

Cập nhật: bản sửa lỗi chính xác

Tôi đã chú ý đến krookedkingrằng có một cách dựa trên cấu hình để maven-assemblysử dụng phiên bản hợp nhất của tất cả các FileSystemkhai báo dịch vụ, hãy xem câu trả lời của anh ấy bên dưới.


13
Đây là mã tương đương cần thiết để thực hiện điều tương tự trong 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. Ngày

8
Trên thực tế, tôi chỉ thêm phụ thuộc maven này vào http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.2.0maven và vấn đề đã được giải quyết.
B.Mr.W.

6
Tôi đã thử thêm hadoop-hdfs, hadoop-core, hadoop-common, hadoop-client, Aslo đã thử thêm hadoopConfig.set ("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName () ); hadoopConfig.set ("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName ()); nhưng không làm việc, khi chạy từ nhật thực nó đang chạy tốt nhưng khi chạy từ java -cp lệnh nó show trên lỗi
Harish Pathak

1
Harish, bạn đã thấy gì? Cùng một vấn đề ở đây nhưng với intellij
ThommyH

Chỉ là một bổ sung cho câu trả lời tuyệt vời: nếu một người đang sử dụng các JARS của hadoop nhưng đang chạy công việc trong một cụm không phải hasoop, "" "hadoopConfig.set (" fs.hdfs.impl ..... "" "" sẽ không . trong trường hợp công việc mà chúng tôi sẽ rơi trở lại vào quản lý lắp ráp xây dựng ví dụ như trong SBT chúng ta có thể làm một mergeStrategy của concat hoặc thậm chí filterDistinctLines.
con người

62

Đối với những người sử dụng plugin bóng râm, theo lời khuyên của david_p, bạn có thể hợp nhất các dịch vụ trong jar bóng mờ bằng cách thêm ServicesResourceTransformer vào cấu hình 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>

Điều này sẽ hợp nhất tất cả các dịch vụ org.apache.hadoop.fs.FileSystem trong một tệp


3
Tôi thích giải pháp này nhất. Khắc phục sự cố tại nguồn (bản dựng) thay vì vá nó bằng các thay đổi cấu hình sau thực tế.
Kevin Pauli

1
Câu trả lời chính xác. Đã sửa lỗi tương tự của tôi. Đã thử với maven-assembly-plugin cũng như kết hợp maven-jar-plugin / maven-dependency-plugin nhưng không hoạt động. Giải pháp này đã làm cho ứng dụng Spark của tôi hoạt động. Cảm ơn rất nhiều!
somnathchakrabarti

Câu trả lời chính xác! Cảm ơn rất nhiều!
andrea.lagala

Đây phải được đánh dấu là câu trả lời được chấp nhận. ServicesResourceTransformer cần thiết khi các tệp jar ánh xạ giao diện với các triển khai bằng cách sử dụng thư mục META-INF / services. Bạn có thể tìm thêm thông tin tại đây: maven.apache.org/plugins/maven-shade-plugin/examples/…
Mario

Câu trả lời xuất sắc.
Niranjan Subramanian

9

Đối với hồ sơ, điều này vẫn đang xảy ra trong hadoop 2.4.0. Rất bực bội...

Tôi đã có thể làm theo hướng dẫn trong liên kết này: http://grokbase.com/t/cloudera/scm-users/1288xszz7r/no-filesystem-for-scheme-hdfs

Tôi đã thêm phần sau vào core-site.xml của mình và nó hoạt động:

<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

cảm ơn 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);

hoặc là

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

1
Chỉ sau khi tôi đọc điều này, tôi mới nhận ra rằng conf ở đây là Cấu hình Hadoop: brucebcampbell.wordpress.com/2014/12/11/…
Sal

8

Tôi đã mất nhiều thời gian để tìm ra nó với Spark 2.0.2, nhưng đây là chút của tôi:

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)

Và các phần có liên quan của tôi build.sbt:

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

Tôi hy vọng điều này có thể giúp đỡ!



5

Giả sử rằng bạn đang sử dụng phân phối mvn và cloudera của hadoop. Tôi đang sử dụng cdh4.6 và việc thêm các phụ thuộc này đã làm việc cho tôi. Tôi nghĩ bạn nên kiểm tra các phiên bản của phụ thuộc hadoop và 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>

đừng quên thêm kho cloudera mvn.

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

4

Tôi sử dụng lắp ráp sbt để đóng gói dự án của mình. Tôi cũng gặp vấn đề này. Giải pháp của tôi là ở đây. Bước 1: Thêm META-INF mergestrategy vào build.sbt của bạn

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

Bước 2: Thêm hadoop-hdfs lib vào build.sbt

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

Bước 3: Sbt sạch; lắp ráp sbt

Hy vọng những thông tin trên có thể giúp ích cho bạn.


15
Một giải pháp tốt hơn có thể là để hợp nhất như: case PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.filterDistinctLinesĐiều này sẽ giữ tất cả các hệ thống tập tin đăng ký
ravwojdyla

Cảm ơn @ravwojdyla, giải pháp khá gọn gàng. Bạn đã cứu mái tóc của tôi. Đối với những linh hồn đã mất khám phá câu trả lời này cho tia lửa Apache. Thêm điều này vào build.sbt khi sbt-assembly hoạt động chính xác.
Greedy Coder

Giải pháp được cung cấp bởi @ravwojdyla là giải pháp duy nhất phù hợp với tôi.
Sergey Kovalev

2
Giải pháp được đưa ra bởi @ravwojdyla là lý tưởng. Tôi đã thực hiện một thiết lập tương tự trong build.sbt và sử dụng: `` assemblyMergeStrategy trong assembly: = {case PathList ("META-INF", "MANIFEST.MF") => MergeStrategy.discard case PathList ("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.concat case _ => MergeStrategy.first} `` `
con người

2

Tôi giả sử bạn xây dựng mẫu bằng maven.

Vui lòng kiểm tra nội dung của JAR mà bạn đang cố chạy. Đặc biệt là META-INFO/servicesthư mục, tập tin org.apache.hadoop.fs.FileSystem. Cần có danh sách các lớp thực hiện hệ thống lọc. Dòng kiểm tra org.apache.hadoop.hdfs.DistributedFileSystemcó trong danh sách cho HDFS và org.apache.hadoop.fs.LocalFileSystemcho lược đồ tệp cục bộ.

Nếu đúng như vậy, bạn phải ghi đè tài nguyên được giới thiệu trong quá trình xây dựng.

Khả năng khác là bạn không có hadoop-hdfs.jartrong classpath của mình nhưng điều này có xác suất thấp. Thông thường, nếu bạn có hadoop-clientphụ thuộc chính xác, nó không phải là một tùy chọn.


HI Roman .. tôi có cùng một vấn đề và META-INFO / services / org.apache.hadoop.fs.FileSystem không có dòng hdfs. Tôi có 2.0.0-mr1-cdh4.4.0 là phụ thuộc duy nhất. tôi cần phải làm gì? Bất kỳ tài liệu về điều này? Sử dụng Maven để xây dựng
sethi

2

Một nguyên nhân khác có thể xảy ra (mặc dù bản thân câu hỏi OP không mắc phải điều này) là nếu bạn tạo một phiên bản cấu hình không tải các giá trị mặc định:

Configuration config = new Configuration(false);

Nếu bạn không tải các giá trị mặc định thì bạn sẽ không nhận được cài đặt mặc định cho những thứ như FileSystemtriển khai, dẫn đến các lỗi giống hệt như thế này khi cố gắng truy cập HDFS. Việc chuyển sang phương thức khởi tạo không tham số của việc chuyển truesang mặc định tải có thể giải quyết vấn đề này.

Ngoài ra, nếu bạn đang thêm các vị trí cấu hình tùy chỉnh (ví dụ: trên hệ thống tệp) vào Configurationđối tượng, hãy cẩn thận xem addResource()bạn sử dụng quá tải nào. Ví dụ: nếu bạn sử dụng addResource(String)thì Hadoop giả định rằng chuỗi là tài nguyên đường dẫn lớp, nếu bạn cần chỉ định tệp cục bộ, hãy thử như sau:

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

1

Tôi đã mất một lúc để tìm ra cách khắc phục từ các câu trả lời đã cho, do tôi là người mới. Đây là những gì tôi đã nghĩ ra, nếu có ai khác cần giúp đỡ ngay từ đầu:

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)

Tôi đang sử dụng Spark 2.1

Và tôi có phần này trong 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);

đặt fs.defaultFS hoạt động cho tôi! Hadoop-2.8.1


1

Đối với SBT, sử dụng bên dưới mergeStrategy trong 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

Sử dụng plugin này

<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

Nếu bạn đang sử dụng 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

Tôi phải đối mặt với cùng một vấn đề. Tôi đã tìm thấy hai giải pháp: (1) Chỉnh sửa tệp jar theo cách thủ công:

Mở tệp jar bằng WinRar (hoặc các công cụ tương tự). Đi tới Meta-info> services và chỉnh sửa "org.apache.hadoop.fs.FileSystem" bằng cách thêm:

org.apache.hadoop.fs.LocalFileSystem

(2) Thay đổi thứ tự của các phụ thuộc của tôi như sau

<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

Điều này không liên quan đến Flink, nhưng tôi cũng tìm thấy vấn đề này trong Flink.

Đối với những người sử dụng Flink, bạn cần tải xuống Hadoop được gói sẵn và đặt nó vào bên trong /opt/flink/lib.


-1

Tôi cũng đã gặp vấn đề tương tự. Đã thêm core-site.xml và hdfs-site.xml làm tài nguyên của conf (đối tượng)

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

Cũng xung đột phiên bản đã chỉnh sửa trong pom.xml. (ví dụ: Nếu phiên bản đã định cấu hình của hadoop là 2.8.1, nhưng trong tệp pom.xml, các phụ thuộc có phiên bản 2.7.1, thì hãy thay đổi phiên bản đó thành 2.8.1) Chạy lại cài đặt Maven.

Lỗi này đã giải quyết cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.