我是hadoop的新手,尝试使用java中的hdfsapi从hdfs获取数据。我在运行程序时遇到这个错误。这是堆栈跟踪。
Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: org.apache.hadoop.tracing.SpanReceiverHost.get(Lorg/apache/hadoop/conf/Configuration;Ljava/lang/String;)Lorg/apache/hadoop/tracing/SpanReceiverHost;
at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:634)
at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:619)
at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:149)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2653)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:92)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2687)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2669)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:371)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:170)
at hdfstest1.HDFSTestGUI1.listDirectory(HDFSTestGUI1.java:663)
at hdfstest1.HDFSTestGUI1.homeBtnActionPerformed(HDFSTestGUI1.java:483)
at hdfstest1.HDFSTestGUI1.access$1200(HDFSTestGUI1.java:47)
at hdfstest1.HDFSTestGUI1$13.actionPerformed(HDFSTestGUI1.java:246)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
at javax.swing.AbstractButton.doClick(AbstractButton.java:356)
at hdfstest1.HDFSTestGUI1.<init>(HDFSTestGUI1.java:65)
at hdfstest1.HDFSTestGUI1$18.run(HDFSTestGUI1.java:571)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
在读了几篇文章之后,我发现我当前的版本不支持我正在使用的某些方法。我的问题是,如何检查当前版本的hadoop不支持哪种方法,以及如何迁移到正确的版本,以便在不破坏当前配置的情况下以最佳方式工作?
我正在使用hadoop1.2.1。如果需要,很乐意分享我的代码。如果有人能帮助我,我们将不胜感激。:)
2条答案
按热度按时间pengsaosao1#
1) “how to check which method is not supported by current version of hadoop”通过编程,您可以捕获java.lang.nosuchmethoderror。因此,如果您怀疑某个方法可能无法在您正在使用的软件中的中实现,请将该调用包围在try/catch中,并在catch中执行发生这种情况时打算执行的操作。
2) “如何迁移到正确的版本以使其以最佳方式工作而不破坏我当前的配置?”只需检查hadoopapi文档中的不同版本,一个接一个,并使用您需要的版本。我去过那里,hadoop变化很大(也许没有spark那么大,但仍然如此),这是唯一的解决方案。
有一条建议,一旦你找到了你需要的版本,就坚持下去。未来的版本可能会附带实现的补充功能,但除非您确实需要更新版本的内容,否则不要升级(从中吸取的教训)。
xmd2e60i2#
1) 正如matei florescu在下面的答案中所建议的,我使用try..catch来查找当前版本不支持的方法。谢谢你,伙计。
2) 对于第二个问题,我只是更改了jar文件的版本以匹配hadoop系统配置(没有更改它)。我遵循以下步骤:
通过键入
hadoop -version
或者您可以通过浏览hadooprootdir(在我的例子中是usr/local/hadoop)手动检查它,在这里您可以找到版本为的jar文件。通过在pom.xml文件中编辑来更改maven hadoop依赖项版本。在我的例子中,hadoop hdfs、hadoop yarn和hadoopMap到了版本2.7.2,已经更改为1.2.1。
下载并重构所有依赖项。在我的例子中,我无法下载maven的依赖关系,所以我只下载了一个jar文件,即hadoop-core.jar,它涵盖了我的版本(1.2.1)的所有内容
我已经从pom.xml中删除了所有条目,只为hadoop核心添加了一个条目。下面是我的最后一个pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany</groupId> <artifactId>HDFSTest1</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-core</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.jdesktop</groupId> <artifactId>beansbinding</artifactId> <version>1.2.1</version> </dependency> </dependencies> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> </project>