mapreduce 程式設計SequenceFile類的使用
原: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。
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。
下面是我練習時除錯的程式碼:
- import java.io.IOException;
- import java.net.URI;
- import java.util.Random;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.fs.FileSystem;
- import org.apache.hadoop.fs.Path;
- import org.apache.hadoop.io.IntWritable;
- import org.apache.hadoop.io.SequenceFile;
- import org.apache.hadoop.io.Text;
- public class sequence {
- /**
- * @param args
- */
- public static FileSystem fs;
- public static final String Output_path="/home/hadoop/test/A.txt";
- public static Random random=new Random();
- 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 Configuration conf=new Configuration();
- public static void write(String pathStr) throws IOException{
- Path path=new Path(pathStr);
- FileSystem fs=FileSystem.get(URI.create(pathStr), conf);
- SequenceFile.Writer writer=SequenceFile.createWriter(fs, conf, path, Text.class, IntWritable.class);
- Text key=new Text();
- IntWritable value=new IntWritable();
-
for(int i=0;i
- key.set(DATA[i]);
- value.set(random.nextInt(10));
- System.out.println(key);
- System.out.println(value);
- System.out.println(writer.getLength());
- writer.append(key, value);
- }
- writer.close();
- }
- public static void read(String pathStr) throws IOException{
- FileSystem fs=FileSystem.get(URI.create(pathStr), conf);
- SequenceFile.Reader reader=new SequenceFile.Reader(fs, new Path(pathStr), conf);
- Text key=new Text();
- IntWritable value=new IntWritable();
- while(reader.next(key, value)){
- System.out.println(key);
- System.out.println(value);
- }
- }
- public static void main(String[] args) throws IOException {
- // TODO Auto-generated method stub
- write(Output_path);
- read(Output_path);
- }
- }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29754888/viewspace-1257226/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何在MapReduce中使用SequenceFile資料格式?
- mapreduce的程式設計模型,計數器程式設計模型
- MapReduce--程式設計模板程式設計
- 【轉載】MapReduce程式設計 Intellij Idea配置MapReduce程式設計環境程式設計IntelliJIdea
- MapReduce 程式設計模型 & WordCount 示例程式設計模型
- MapReduce程式設計(四) 求均值程式設計
- 詳解MapReduce中的五大程式設計模型程式設計模型
- MapReduce程式設計例項之倒排索引 1程式設計索引
- MapReduce程式設計例項之自定義排序程式設計排序
- java併發程式設計:Thread類的使用Java程式設計thread
- MapReduce程式設計例項之資料去重程式設計
- MapReduce程式設計例項之自定義分割槽程式設計
- MapReduce原理與設計思想
- MapReduce設計模式學習設計模式
- 類程式設計的WAF(上)程式設計
- Java網路程式設計之使用URL類Java程式設計
- Java併發程式設計:Thread類的使用介紹Java程式設計thread
- MapReduce1架構設計架構
- 簡單的計算最值的MapReduce程式
- 好程式設計師大資料培訓分享MapReduce理解程式設計師大資料
- MapReduce程式設計實踐之自定義資料型別程式設計資料型別
- Hadoop SequenceFile、HFileHadoop
- Python中的類超程式設計Python程式設計
- Python類的基礎--設計、使用Python
- [程式碼結構設計]根據不同條件使用不同實現類的業務程式碼設計
- 好程式設計師大資料學習路線分享MAPREDUCE程式設計師大資料
- MapReduce框架-Join的使用框架
- 使用SequenceFile儲存BytesWritable型別時要注意型別
- Mongodb MapReduce使用MongoDB
- 好程式設計師大資料學習路線之mapreduce概述程式設計師大資料
- 好程式設計師大資料培訓教你快速學習MapReduce程式設計師大資料
- 物件導向的程式設計在遊戲開發中使用(一):類物件程式設計遊戲開發
- 設計模式-模版設計模式概述和使用-抽象類設計模式抽象
- java程式設計之:Unsafe類Java程式設計
- 程式設計師垃圾程式碼分類指南程式設計師
- 好程式設計師Java培訓分享Java程式設計師常用的工具類庫程式設計師Java
- ABAP 程式語言中 Class(類)的設計原理剖析
- VC的另類資料庫程式設計(轉)資料庫程式設計