尝试从中获取数据时,HDFS API会引发错误

时间:2017-04-30 11:05:13

标签: java hadoop hdfs

我是hadoop的新手并尝试使用java中的HDFS API从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不支持哪种方法以及如何迁移到正确的版本以使其以最佳方式工作而不会破坏我当前的配置?

我正在使用 hadoop 1.2.1 。很高兴在需要时分享我的代码。如果有人可以帮助我,我们将不胜感激。 :)

2 个答案:

答案 0 :(得分:0)

1)“如何检查当前版本的hadoop不支持哪种方法” 以编程方式,您可以捕获java.lang.NoSuchMethodError。 因此,如果您怀疑某个方法可能没有在您正在使用的软件中实现,请在try / catch中包围该调用,并在catch中执行您想要执行的操作。

2)“如何迁移到正确的版本,以便在不破坏我当前配置的情况下以最佳方式工作?”只需检查不同版本的hadoop API文档,一个接一个,并使用您需要的版本。我去过那里,Hadoop发生了很大变化(可能不是Spark,但仍然如此),这是唯一的解决方案。

一条建议,一旦找到所需的版本,坚持下去。未来的版本可能会附带补充功能,但除非你真的需要更新的版本,否则不要升级。 (经验教训很难)。

答案 1 :(得分:0)

1)正如 Matei Florescu 在下面的回答中所建议的,我使用try..catch来查找当前版本不支持哪种方法。 感谢Matei

2)对于第二个问题,我只是更改了jar文件版本以匹配我的hadoop系统配置(不更改它)。我按照以下步骤操作:

  1. 通过在终端中键入$http({ url: '/home/my-api', method: "GET", headers: { 'Content-type': 'application/json' }, data: JSON.stringify(request) }).success(function(data, status, headers, config) { }).error(function(data, status, headers, config) { return null; }); 来检查hadoop版本,或者您可以通过浏览HadoopRootDir(在我的案例中为usr / local / hadoop)手动检查它,您可以在其中找到带有版本的jar文件。
  2. 通过在pom.xml文件中编辑来更改maven hadoop依赖版本。在我的例子中,它是hadoop-hdfs,hadoop-yarn&amp; hadoop-mapred与版本2.7.2已更改为1.2.1。
  3. 下载并重构所有依赖项。在我的情况下,我无法通过maven下载依赖项,因此我只下载了一个jar文件,即hadoop-core.jar,其中涵盖了我的版本的所有内容(1.2.1)
  4. 我已从pom.xml中删除了所有条目,并且只为hadoop-core添加了一个条目。 这是我最后的pom.xml:

    public function register(Request $request) { $this -> validate($request,[ 'useremail' =>'required', ]); $res = StandardUser::where('useremail', Input::get('useremail'))->first(); $email = $request->useremail; if ($res) { $userid = json_decode($res)->id; $firstname = json_decode($res)->firstname; $lastname = json_decode($res)->lastname; $managerfirstname = json_decode($res)->manager_firstname; $managerlastname = json_decode($res)->manager_lastname; $manageremail = json_decode($res)->manager_email; return back() ->withCookie(cookie('uemail', $email)) ->cookie('uid', $userid) ->cookie('ufn', $firstname) ->cookie('uln', $lastname) ->cookie('mfn', $managerfirstname) ->cookie('mln', $managerlastname) ->cookie('memail', $manageremail); }else{ $standarduser = StandardUser::create($request->all()); $userid = $standarduser->id; return back() ->withCookie(cookie('uemail', $email)) ->cookie('uid', $userid); } }