Java读取HDFS文件遇SLF4J冲突及FS路径错误求助
Java读取HDFS中CSV文件的问题排查
需求限定使用Java,不采用Python、Scala、Spark等其他语言,我尝试编写程序读取HDFS中的CSV文件,查阅多种资料仍无法解决问题,恳请帮助。
我编写的代码如下:
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: 类路径包含多个SLF4J绑定。 SLF4J: 在[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: 在[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: 请查看SLF4J文档了解解释。 SLF4J: 实际绑定类型为[org.slf4j.impl.Reload4jLoggerFactory] log4j:WARN 无法为logger(org.apache.hadoop.metrics2.lib.MutableMetricsFactory)找到appender。 log4j:WARN 请正确初始化log4j系统。 log4j:WARN 查看log4j文档获取更多信息。 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)
程序提示文件/usr1/myFile0.csv不存在,但该文件实际存在(见截图)。尝试通过Maven引入SLF4J无效。
更新后的错误信息
移除Maven依赖中的两个SLF4J绑定并重新添加最新版后,SLF4J错误消除,但出现新错误:
2022年8月17日 凌晨1:40:35 org.apache.hadoop.util.NativeCodeLoader <clinit> 警告: 无法为你的平台加载native-hadoop库... 在适用情况下使用内置Java类 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)
内容的提问来源于stack exchange,提问作者User9123
相关产品推荐
相关产品推荐

