繁体   English   中英

从 HDFS 读取文件时出现错误 slf4j 和文件不存在

[英]Error slf4j and file does not exist while reading a file from HDFS

我正在尝试使用 Java 程序从 HDFS 读取文件(csv 文件)。 我搜索了多个来源解决了以下问题,但仍然无法解决。 请帮忙。

(注意:要求如上,所以我使用的是 java 而不是 python 或 scala 或 spark 或任何其他)

我尝试了如下方法:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;


public class hadoop2 {

    public static void main(String[] args) throws IOException {
        Configuration conf = new Configuration();
        conf.addResource(new Path("/etc/hadoop/conf/core-site.xml"));
        conf.addResource(new Path("/etc/hadoop/conf/hdfs-site.xml"));

        Path file = new Path("/usr1/myFile0.csv");

            try (FileSystem hdfs = FileSystem.get(conf)) {

                FSDataInputStream is = hdfs.open(file);
                BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));

                String lineRead = br.readLine();
                while (lineRead != null) {
                    System.out.println(lineRead);
                    lineRead = br.readLine();
                    //do what ever needed
                }

                br.close();
                hdfs.close();
            }
        }
} 

它输出错误:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/sigmoid/.m2/repository/org/slf4j/slf4j-reload4j/1.7.36/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/sigmoid/.m2/repository/org/slf4j/slf4j-log4j12/1.7.25/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" java.io.FileNotFoundException: File /usr1/myFile0.csv does not exist
    at org.apache.hadoop.fs.RawLocalFileSystem.deprecatedGetFileStatus(RawLocalFileSystem.java:779)
    at org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:1100)
    at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:769)
    at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:462)
    at org.apache.hadoop.fs.ChecksumFileSystem$ChecksumFSInputChecker.<init>(ChecksumFileSystem.java:160)
    at org.apache.hadoop.fs.ChecksumFileSystem.open(ChecksumFileSystem.java:372)
    at org.apache.hadoop.fs.FileSystem.open(FileSystem.java:976)
    at hadoop2.main(hadoop2.java:22)

我不明白这里到底出了什么问题。 以及如何应对。 我曾尝试使用从 maven SLF4J 导入,但它没有用。

程序还输出 File /usr1/myFile0.csv does not exist But the file is present。 正如您从屏幕截图中看到的那样。

在此处输入图像描述

更新:

我能够消除错误 slf4j。 我的做法是将 go 转换为项目的文件结构,在 maven 依赖项下列出了两个绑定,我错误地删除了两个绑定,然后我又添加了最新的一个。

现在显示错误。

Aug 17, 2022 1:40:35 AM org.apache.hadoop.util.NativeCodeLoader <clinit>
WARNING: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Exception in thread "main" java.lang.IllegalArgumentException: Wrong FS: hdfs:/usr1/myFile0.csv, expected: file:///
    at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:807)
    at org.apache.hadoop.fs.RawLocalFileSystem.pathToFile(RawLocalFileSystem.java:105)
    at org.apache.hadoop.fs.RawLocalFileSystem.deprecatedGetFileStatus(RawLocalFileSystem.java:774)
    at org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:1100)
    at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:769)
    at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:462)
    at org.apache.hadoop.fs.ChecksumFileSystem$ChecksumFSInputChecker.<init>(ChecksumFileSystem.java:160)
    at org.apache.hadoop.fs.ChecksumFileSystem.open(ChecksumFileSystem.java:372)
    at org.apache.hadoop.fs.FileSystem.open(FileSystem.java:976)
    at hadoop2.main(hadoop2.java:22)

能够解决它:

  1. SLF4J 错误。 解决方案:如问题更新中所述。 我能够消除错误 slf4j。 我的做法是将 go 转换为项目的文件结构,在 maven 依赖项下列出了两个绑定,删除其中一个。

  2. 读取时出错。 解决方案:删除配置并添加以下内容:

    从:

     conf.addResource(new Path("/etc/hadoop/conf/core-site.xml")); conf.addResource(new Path("/etc/hadoop/conf/hdfs-site.xml"));

    conf.set("fs.defaultFS", "hdfs://localhost:9000");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM