2013-07-10 84 views
3

我正在嘗試使用Java API訪問HDFS中的文件,但是每次我都收到File Not Found。我使用的代碼是: -使用Java在HDFS中訪問文件

Configuration conf = new Configuration(); 
    conf.addResource(FileUtilConstants.ENV_HADOOP_HOME + FileUtilConstants.REL_PATH_CORE_SITE); 
    conf.addResource(FileUtilConstants.ENV_HADOOP_HOME + FileUtilConstants.REL_PATH_HDFS_SITE); 

    try { 
     FileSystem fs = FileSystem.get(conf); 
     Path hdfsfilePath = new Path(hdfsPath); 
     logger.info("Filesystem URI : " + fs.getUri()); 
     logger.info("Filesystem Home Directory : " + fs.getHomeDirectory()); 
     logger.info("Filesystem Working Directory : " + fs.getWorkingDirectory()); 
     logger.info("HDFS File Path : " + hdfsfilePath); 
     if (!fs.exists(hdfsfilePath)) { 
      logger.error("File does not exists : " + hdfsPath); 
     } 

而這裏是從代碼的命令行輸出。

[[email protected] ~]# java -jar /tmp/thetus-incendiary-koverse-extension-fileutils-1.0-SNAPSHOT.jar 
13/07/10 02:47:18 INFO fileutils.HadoopFileChecksumUtils: Filesystem URI : file:/// 
13/07/10 02:47:18 INFO fileutils.HadoopFileChecksumUtils: Filesystem Home Directory : file:/root 
13/07/10 02:47:18 INFO fileutils.HadoopFileChecksumUtils: Filesystem Working Directory : file:/root 
13/07/10 02:47:18 INFO fileutils.HadoopFileChecksumUtils: HDFS File Path : /usr/hadoop/sample/sample.txt 
13/07/10 02:47:18 ERROR fileutils.HadoopFileChecksumUtils: File does not exists : /usr/hadoop/sample/sample.txt 

我是hadoop的新手,所以我不知道發生了什麼問題。

感謝, 拿煙

+0

您是否檢查過HDFS中有這樣的文件?如果該文件位於本地系統上,則不表示它存在於HDFS中。您可以使用Web界面(通常爲http:// YOUR_IP:50070/dfshealth.jsp)來檢查這一點。 – yatul

+0

是Yatul它存在於HDFS中。 #root#koversevms〜]#hadoop fs -ls /usr/hadoop/sample/sample.txt 找到1項目 -rw-r - r-- 1 root supergroup 27848 2013-07-04 03:37/usr/hadoop/sample/sample.txt – Nayan

+0

我解決了它。我修改了代碼使用路徑而不是字符串,而添加xmls,它的工作。 更早: - conf.addResource(FileUtilConstants.ENV_HADOOP_HOME + FileUtilConstants.REL_PATH_CORE_SITE); Now conf.addResource(new Path(FileUtilConstants.ENV_HADOOP_HOME + FileUtilConstants.REL_PATH_CORE_SITE)); – Nayan

回答

6

這裏是最初發布在回答的情況下,以this question代碼片段。儘管原始問題的意圖不同,它也應該解決你的問題。你的代碼中的主要問題是你有從計劃開始的問題(file://)。請在您的配置中檢查fs.defaultFS變量。

package org.myorg; 

import java.security.PrivilegedExceptionAction; 

import org.apache.hadoop.conf.*; 
import org.apache.hadoop.security.UserGroupInformation; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.FileStatus; 

public class HdfsTest { 

    public static void main(String args[]) { 

     try { 
      UserGroupInformation ugi 
       = UserGroupInformation.createRemoteUser("hbase"); 

      ugi.doAs(new PrivilegedExceptionAction<Void>() { 

       public Void run() throws Exception { 

        Configuration conf = new Configuration(); 
        conf.set("fs.defaultFS", "hdfs://1.2.3.4:8020/user/hbase"); 
        conf.set("hadoop.job.ugi", "hbase"); 

        FileSystem fs = FileSystem.get(conf); 

        fs.createNewFile(new Path("/user/hbase/test")); 

        FileStatus[] status = fs.listStatus(new Path("/user/hbase")); 
        for(int i=0;i<status.length;i++){ 
         System.out.println(status[i].getPath()); 
        } 
        return null; 
       } 
      }); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

謝謝羅馬。我已經解決了我的問題。它正在工作.. – Nayan

+0

你好,我可以問你兩個問題嗎?你使用哪個版本的hadoop HDFS?你在哪裏下載HDFS客戶端java jar包?我無法爲2.7.1 hadoop HDFS找到有效的hadoop HDFS客戶端jar包。 – linrongbin

+0

這有什麼問題? http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client/2.7.1 當然,大多數實際的代碼都帶有依賴關係,而不是hadoop-client-XXX.jar本身。 –