2014-06-30 3 views
1

Я изучаю, как читать/записывать файлы из/в hdfs.Не удается получить файлы из hadoop hdfs

Это код, который я использую для чтения:

import java.io.InputStream; 
import java.net.URI; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IOUtils; 

public class FileSystemCat { 
public static void main (String [] args) throws Exception { 

    String uri = "/user/hadoop/file.txt"; 
    Configuration conf = new Configuration(); 
    conf.addResource(new Path("/usr/local/hadoop/etc/hadoop/core-site.xml")); 
    conf.addResource(new Path("/usr/local/hadoop/etc/hadoop/hdfs-site.xml")); 

    FileSystem fs = FileSystem.get(URI.create(uri),conf); 

    InputStream in = null; 
    try{ 

     in = fs.open(new Path(uri)); 
     IOUtils.copyBytes(in, System.out, 4096,false); 
    }finally{ 
     IOUtils.closeStream(in); 
    }   
} 

}

Файл есть

hadoop cluster

Однако, я получаю следующее, когда я запускаю мой код eclipse

Exception in thread "main" java.io.FileNotFoundException: File /user/hadoop/file.txt does not exist 
at org.apache.hadoop.fs.RawLocalFileSystem.deprecatedGetFileStatus(RawLocalFileSystem.java:511) 
at org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:724) 
at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:501) 
at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:397) 
at org.apache.hadoop.fs.ChecksumFileSystem$ChecksumFSInputChecker.<init>(ChecksumFileSystem.java:137) 
at org.apache.hadoop.fs.ChecksumFileSystem.open(ChecksumFileSystem.java:339) 
at org.apache.hadoop.fs.FileSystem.open(FileSystem.java:764) 
at hadoop.FileSystemCat.main(FileSystemCat.java:22) 

я использовал в качестве пути как файла: ///user/hadoop/file.txt и HDFS: ///user/hadoop/file.txt

Для последней ошибки немного отличается:

Exception in thread "main" java.io.IOException: No FileSystem for scheme: hdfs 

ядро-site.xml

<configuration> 
    <property> 
    <name>fs.default.name</name> 
    <value>hdfs://localhost/</value> 
    </property> 
</configuration> 

HDFS-site.xml

<configuration> 
<property> 
    <name>dfs.replication</name> 
    <value>2</value> 
</property> 

<property> 
    <name>dfs.namenode.name.dir</name> 
    <value>file:///usr/local/hadoop_store/hdfs/namenode/</value> 
</property> 

<property> 
    <name>dfs.datanode.data.dir</name> 
    <value>file:///usr/local/hadoop_store/hdfs/datanode/,file:///mnt/hadoop/hadoop_store/hdfs/datanode/</value> 
</property> 

<property> 
    <name>dfs.webhdfs.enabled</name> 
    <value>true</value> 
</property> 
</configuration> 

Любые проблемы?

Благодаря

ответ

1

Добавить в XML-файлы с параметрами конфигурации HDFS:

Configuration conf = new Configuration(); 
conf.addResource(new Path("your_hadoop_path/conf/core-site.xml")); 
conf.addResource(new Path("your_hadoop_path/conf/hdfs-site.xml")); 
FileSystem fs = FileSystem.get(URI.create(uri),conf); 
+0

Я редактировал пост с вашими советами. Это все еще не работает. Посмотрите на hdfs-site.xls и core-site.xml – QGA

+0

Как вы запускаете приложение? Использование 'hadoop jar'? – Balduz

+0

Я добавил в путь сборки все файлы jar, содержащиеся в папке hadoop и вложенных папках (плохая практика, которую я знаю :)) – QGA

1

Если вы хотите прочитать данные файла HDFS, то этот код будет делать это.

package com.yp.util; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FSDataInputStream; 
import org.apache.hadoop.fs.FSDataOutputStream; 
import org.apache.hadoop.fs.FileStatus; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 


public class ReadHadoopFileData { 


public static void main(String[] args) throws IOException { 

    Configuration conf = new Configuration(); 
    FileSystem hdfs = FileSystem.get(conf); 

    Path hdfsFile = new Path(args[0]); 

    try { 
     BufferedReader br=new BufferedReader(new InputStreamReader(hdfs.open(hdfsFile))); 
     String line; 
     line=br.readLine(); 
     while (line != null){ 
       System.out.println(line); 
       line=br.readLine(); 
     } 

    }catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
    } 

} 

Когда вы запускаете с использованием командной строки, все ваши настройки окружающей среды будут соблюдаться хаопом.

Команда для запуска выше программы (предположим, что вы создали Read.jar и HDFS файл является частью-р-00000)

hadoop jar Read.jar com.yp.util.ReadHadoopFileData /MyData/part-r-00000 
3

Вы должны изменить строку

FileSystem fs = FileSystem.get(URI.create(uri),conf); 

что-то вроде этого

FileSystem fs = FileSystem.get(URI.create("hdfs://localhost"), conf); 

Это должно работать, если ваш путь uri находится в hdfs.

Чтобы увидеть, если ваш URI путь в HDFS, вы могли бы сделать hadoop fs -ls / в командной строке

Смежные вопросы