2013-03-21 3 views
0

Я использую следующие коды для записи некоторых данных в файл формата SequenceFile. когда программа запускается некоторое время, я прерываю программу с помощью красной кнопки на консоли eclipse. однако, когда я проверяю файл данных на hdfs, размер файла последовательности равен нулю. а также не может использовать команду «hadoop fs -text filename» для просмотра файла. когда я использую SequenceFile.Reader, прочитав ранее созданный файл, я встречаю исключение «Исключение в потоке» основного исключения «java.io.EOFException». В этом случае, как это сделать? моя среда разработки - eclipse3.7 (на окнах 7) и кластер hadoop (версия 1.0.0) для CentOS 6.use SequenceFile класс записать файл

класс Sequence расширяет тему {

private String uri = "hdfs://172.20.11.60:9000"; 
private String filePath = "/user/hadoop/input/"; 
private String fileName = "Sequence-01.seq"; 
public SequenceFile.Writer writer; 
private static int cnt = 0; 

private void init() { 
    Configuration conf = new Configuration(); 
    try { 
     FileSystem fs = FileSystem.get(URI.create(uri), conf); 
     writer = SequenceFile.createWriter(fs, conf, new Path(filePath 
       + fileName), LongWritable.class, Text.class); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public Sequence() { 
    init(); 
} 

@Override 
public void run(){ 
    while(true){ 
     try { 
      writer.append(new LongWritable(100), new Text("hello,world")); 
      cnt++; 
      if(cnt%100 == 0){ 
       System.out.println("flush current data to file system"); 
       writer.syncFs(); 
      } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      System.out.println("append data error"); 
      e.printStackTrace(); 
     } 

     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      System.out.println("thread interupted"); 
      e.printStackTrace(); 
     } 
    } 
} 

}

класса TestSequenceFile общественности {

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    new Sequence().start(); 
} 

}

ответ

0

Общий совет: не прерывать процесс.

Решение: Для меня следующий код работал нормально.

import java.io.IOException; 
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; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.SequenceFile; 

import org.apache.hadoop.io.Text; 


public class SequenceFileWriteDemo { 
private static final String[] DATA = { 
"One, two, buckle my shoe", 
"Three, four, shut the door", 
"Five, six, pick up sticks", 
"Seven, eight, lay them straight", 
"Nine, ten, a big fat hen"}; 

public static void main(String[] args) throws IOException { 
//String uri = "/home/Desktop/inputSort.txt"; 
String uri = "hdfs://localhost:9900/out1.seq"; 

Configuration conf = new Configuration(); 
FileSystem fs = FileSystem.get(URI.create(uri), conf); 
Path path = new Path(uri); 
IntWritable key = new IntWritable(); 
Text value = new Text(); 
SequenceFile.Writer writer = null; 



try { 
writer = SequenceFile.createWriter(fs, conf, path, 
    key.getClass(), value.getClass()); 


    for (int i = 0; i < 130; i++) { 
    key.set(100 - i); 
    value.set(DATA[i % DATA.length]); 


    System.out.printf("[%s]\t%s\t%s\n", writer.getLength(), key, value, key.getClass(), value.getClass()); 

    writer.append(key, value); 
    } 
    } finally { 
    IOUtils.closeStream(writer); 
    } 
}} 

Пожалуйста, обратитесь к книге Hadoop-The Definitive Guide (публикации O'Reilly) для получения подробной информации о записи в файл последовательности.

0

Да, Hadoop Окончательное руководство лучше всего для этого здесь, это пример для чтения и записи файлов последовательности.

На самом деле файл последовательности образует последовательность байтов или hasoop Writables, которые в основном используются для объединения различных небольших файлов для объединения и подачи в функцию карты.

http://javatute.com/javatute/faces/post/hadoop/2014/creating-sequence-file-using-hadoop.xhtml

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