mapreduce 程式設計SequenceFile類的使用

破棉襖發表於2014-08-25
原:http://blog.csdn.net/zyj8170/article/details/7178371 

1.對於某些應用而言,需要特殊的資料結構來儲存自己的資料。對於基於MapReduce的資料處理,將每個二進位制資料的大物件融入自己的檔案中並不能實現很高的可擴充套件性,針對上述情況,Hadoop開發了一組更高層次的容器SequenceFile。


     2. 考慮日誌檔案,其中每一條日誌記錄是一行文字。如果想記錄二進位制型別,純文字是不合適的。這種情況下,Hadoop的SequenceFile類非常合適,因為上述提供了二進位制鍵/值對的永久儲存的資料結構。當作為日誌檔案的儲存格式時,可以自己選擇鍵,比如由LongWritable型別表示的時間戳,以及值可以是Writable型別,用於表示日誌記錄的數量。SequenceFile同樣為可以作為小檔案的容器。而HDFS和 MapReduce是針對大檔案進行最佳化的,所以透過SequenceFile型別將小檔案包裝起來,可以獲得更高效率的儲存和處理。
     3. SequenceFile類內部有兩個比較主要的內部類分別是SequenceFile.Reader和SequenceFile.Writer
      SequenceFile.Reader
      透過createWriter()靜態方法可以建立SequenceFile物件,並返SequenceFile.Writer例項。該靜態方法有多個過載版本,但都需要指定待寫入的資料流(FSDataOutputStream或FileSystem物件和Path物件),Configuration物件,以及鍵和值的型別。另外可選引數包括壓縮型別以及相應的codec,Progressable回撥函式用於通知寫入的進度,以及在SequenceFile標頭檔案中儲存的Metadata例項。儲存在SequenceFile中的鍵和值對並不一定是Writable型別。任意可以透過Serialization類實現序列化和反序列化的型別均可被使用。一旦擁有SequenceFile.Writer例項,就可以透過append()方法在檔案末尾附件鍵/值對。
    SequenceFile.Writer
    建立SequenceFile.Writer可以透過呼叫本身的建構函式 SequenceFile.Reader(FileSystem fs, Path file, Configuration conf) 來構造例項物件,從頭到尾讀取順序檔案的過程是建立SequenceFile.Reader例項後反覆呼叫next()方法迭代讀取記錄的過程。讀取的是哪條記錄與你使用的序列化框架相關。如果使用的是Writable型別,那麼透過鍵和值作為引數的Next()方法可以將資料流中的下一條鍵值對讀入變數中:
     public boolean next(Writable key,Writable val),如果鍵值對成功讀取,則返回true,如果已讀到檔案末尾,則返回false。

下面是我練習時除錯的程式碼:


[java] view plaincopy
  1. import java.io.IOException;  
  2. import java.net.URI;  
  3. import java.util.Random;  
  4.   
  5.   
  6.   
  7. import org.apache.hadoop.conf.Configuration;  
  8. import org.apache.hadoop.fs.FileSystem;  
  9. import org.apache.hadoop.fs.Path;  
  10. import org.apache.hadoop.io.IntWritable;  
  11. import org.apache.hadoop.io.SequenceFile;  
  12. import org.apache.hadoop.io.Text;  
  13.   
  14.   
  15. public class sequence {  
  16.   
  17.     /** 
  18.      * @param args 
  19.      */  
  20.     public static  FileSystem fs;  
  21.     public static final String Output_path="/home/hadoop/test/A.txt";  
  22.     public static Random random=new Random();  
  23.     private static final String[] DATA={  
  24.           "One,two,buckle my shoe",  
  25.           "Three,four,shut the door",  
  26.           "Five,six,pick up sticks",  
  27.           "Seven,eight,lay them straight",  
  28.           "Nine,ten,a big fat hen"  
  29.          };  
  30.     public static Configuration conf=new Configuration();  
  31.     public static void write(String pathStr) throws IOException{  
  32.         Path path=new Path(pathStr);  
  33.         FileSystem fs=FileSystem.get(URI.create(pathStr), conf);  
  34.         SequenceFile.Writer writer=SequenceFile.createWriter(fs, conf, path, Text.class, IntWritable.class);  
  35.         Text key=new Text();  
  36.         IntWritable value=new IntWritable();  
  37.         for(int i=0;i
  38.             key.set(DATA[i]);  
  39.             value.set(random.nextInt(10));  
  40.             System.out.println(key);  
  41.             System.out.println(value);  
  42.              
  43.             System.out.println(writer.getLength());  
  44.             writer.append(key, value);  
  45.              
  46.         }  
  47.         writer.close();  
  48.          
  49.     }  
  50.     public static void read(String pathStr) throws IOException{  
  51.         FileSystem fs=FileSystem.get(URI.create(pathStr), conf);  
  52.         SequenceFile.Reader reader=new SequenceFile.Reader(fs, new Path(pathStr), conf);  
  53.         Text key=new Text();  
  54.         IntWritable value=new IntWritable();  
  55.         while(reader.next(key, value)){  
  56.             System.out.println(key);  
  57.             System.out.println(value);  
  58.         }  
  59.          
  60.     }  
  61.      
  62.     public static void main(String[] args) throws IOException {  
  63.         // TODO Auto-generated method stub  
  64.         write(Output_path);  
  65.         read(Output_path);  
  66.     }     
  67.   
  68. }  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29754888/viewspace-1257226/,如需轉載,請註明出處,否則將追究法律責任。

相關文章