2013-07-10 3 views
3

Я пытаюсь получить доступ к файлу в HDFS с использованием Java API, но каждый раз, когда я получаю файл не найден. Код, который я использую для доступа:Доступ к файлам в HDFS с использованием Java

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, поэтому не знаю, что происходит не так.

Спасибо, Nayan

+0

Вы проверили, есть ли такой файл в HDFS? Если файл находится в вашей локальной системе, это не значит, что он существует в HDFS. Вы можете использовать веб-интерфейс (обычно 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 супергруппа 27848 2013-07-04 03:37/usr/hadoop/sample/sample.txt – Nayan

+0

Я решил это. Я изменил код для использования пути вместо String, добавив xmls, он сработал. Ранее: - conf.addResource (FileUtilConstants.ENV_HADOOP_HOME + FileUtilConstants.REL_PATH_CORE_SITE); conf.addResource (новый путь (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 вы используете? И где вы загружаете пакет java jar для клиента HDFS? Я не могу найти действительный пакет jar для клиента HD40 для 2.7.1 hadoop HDFS. – linrongbin

+0

Что в этом плохого? http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client/2.7.1 Конечно, у большинства реальных кодов есть зависимости, а не с hasoop-client-XXX.jar. –