2017-08-02 4 views
-1

Ich kann auf hdfs im Terminal über hdfs dfs -ls / zugreifen und ich bekomme die Adresse und den Port des Clusters von hdfs getconf -confKey fs.defaultFS (ich beziehe mich auf Adresse und Port in Code unten).Zugriff auf hdfs in Java-Würfe Fehler

Der Versuch, Dateien auf hdfs in Java zu lesen, gab mir ähnliche Fehler wie beschrieben here (auch in diesem diskutiert). Mit der Adresse in Java den folgend Ich versuche

 FileSystem fs; 
     BufferedReader br; 
     String line; 
     Path path = new Path("hdfs://<address>:<port>/somedata.txt"); 
     try 
     { 
      /* -------------------------- 
      * Option 1: Gave 'Wrong FS: hdfs://..., Expected file:///' error 
      Configuration configuration = new Configuration(); 
      configuration.addResource(new Path("/etc/hadoop/conf/core-site.xml")); 
      configuration.addResource(new Path("/etc/hadoop/conf/hdfs-site.xml")); 
      fs = FileSystem.get(configuration); 
      * --------------------------- 
      */ 

      // -------------------------- 
      // Option 2: Gives error stated below 
      Configuration configuration = new Configuration(); 
      fs = FileSystem.get(new URI("hdfs://<address>:<port>"),configuration); 
      // -------------------------- 

      LOG.info(fs.getConf().toString()); 

      FSDataInputStream fsDataInputStream = fs.open(path); 
      InputStreamReader inputStreamReader = new InputStreamReader(fsDataInputStream); 
      BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
      while((line=bufferedReader.readLine())!=null){ 
      // some file processing code here. 
      } 
      bufferedReader .close(); 
     } 
     catch (Exception e) 
     { 
      fail(); 
     } 

Der Fehler, die Option me 2 gibt, ist

java.lang.NoSuchMethodError: org.apache.hadoop.hdfs.server.namenode.NameNode.getAddress(Ljava/lang/String;)Ljava/net/InetSocketAddress; 
at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:99) 
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1446) 
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:67) 
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1464) 
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:263) 
at fwt.gateway.Test_Runner.checkLocationMasterindicesOnHDFS(Test_Runner.java:76) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

Die Tatsache, dass ich die Dateien vom Terminal zugreifen kann für mich einen Hinweis darauf ist, dass core-site.xml und hdfs-site.xml muss korrekt sein.

Danke für die Hilfe!

EDIT 1: Die Maven Abhängigkeiten I unten für den Code verwenden, sind die folgenden

<dependency> 
    <groupId>org.apache.hadoop</groupId> 
    <artifactId>hadoop-hdfs</artifactId> 
    <version>3.0.0-alpha4</version> 
    </dependency> 

    <dependency> 
    <groupId>org.apache.hadoop</groupId> 
    <artifactId>hadoop-core</artifactId> 
    <version>1.2.1</version> 
    </dependency> 

    <dependency> 
    <groupId>org.apache.hadoop</groupId> 
    <artifactId>hadoop-client</artifactId> 
    <version>3.0.0-alpha4</version> 
    </dependency> 
+0

Sieht aus wie Sie einige Abhängigkeiten fehlen könnten. Wenn Sie Maven o.ä. verwenden, können Sie die Hadoop-Importe teilen, die Sie gerade machen? – StefanE

+0

danke, wird aktualisiert. Warum runtergestimmt? – tenticon

+0

Wahrscheinlich, weil Sie nicht wissen, was ein "NoSuchMethodDefError" ist ... und dass es in der Regel auf einen Konflikt mit der Versionierung ** verweist. Bibliothek A möchte eine Methode aus Bibliothek B aufrufen ... aber diese Methode in B ist nicht (mehr) vorhanden. In diesem Sinne: Haben Sie vorher schon einmal nach dieser Ausnahmebotschaft gesucht? – GhostCat

Antwort

0

Aktualisieren Sie Ihre POM folgende:

<dependency> 
    <groupId>org.apache.hadoop</groupId> 
    <artifactId>hadoop-client</artifactId> 
    <version>2.8.1</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.hadoop</groupId> 
    <artifactId>hadoop-core</artifactId> 
    <version>2.6.0-mr1-cdh5.4.2.1</version> 
    <type>pom</type> 
</dependency> 
<dependency> 
    <groupId>org.apache.hadoop</groupId> 
    <artifactId>hadoop-hdfs</artifactId> 
    <version>2.8.1</version> 
</dependency> 

nie Alpha-Versionen verwenden, da sie wahrscheinlich einen Bug haben.

+0

Vielen Dank! Mußte das CDH 5-Repository enthalten, um die Gläser herunterzuladen – tenticon

0

Sie können dies in pom.xml-Datei verwenden

<dependency> 
     <groupId>org.apache.hadoop</groupId> 
     <artifactId>hadoop-common</artifactId> 
     <version>2.6.0</version> 
    </dependency> 

Ich habe Version verwendet 2.6.0. Sie können jede aktualisierte Version ausprobieren.

Verwandte Themen