1. 程式人生 > >hadoop sequenceFile詳解

hadoop sequenceFile詳解

hadoop不僅可以處理文字資訊,還可以處理二進位制格式資料,sequenceFile就是這樣的檔案。有以下特點:

  1. 可分割
  2. 支援壓縮
  3. 每一行都是一個key value對
  4. 可以設定同步點

SequenceFile的格式是由一個header 跟隨一個或多個記錄組成。前三個位元組是一個Bytes SEQ代表著版本號,同時header也包括key的名稱,value class , 壓縮細節,metadata,以及Sync markers。Sync markers的作用在於可以讀取任意位置的資料。

使用以下方法生成一個seqFile,其中的key是年份value是溫度。

     @Test
    public void testWrite() throws Exception {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","file:///");
        FileSystem fs = FileSystem.get(conf);
        Path p = new Path("/home/hadoop/seq/1.seq");
        SequenceFile.Writer writer = null;


        writer = SequenceFile.createWriter(conf,SequenceFile.Writer.file(p),//設定檔案輸出路徑
                SequenceFile.Writer.keyClass(IntWritable.class),//設定輸出key的型別
                SequenceFile.Writer.valueClass(IntWritable.class)//設定輸出value的型別
        );
        IntWritable year;//年份
        IntWritable temperature;//溫度
        for (int i = 0;i<8000;i++){
            year = new IntWritable();
            year.set(1970 + new Random().nextInt(100));
            temperature = new IntWritable();
            temperature.set(new Random().nextInt(100)-30);
            writer.append(year,temperature);
        }
        writer.close();
    }
使用命令檢視生成檔案的內容:
hdfs dfs -text 1.seq
寫seqFile的時候生成壓縮後的檔案:
    /**
     * 壓縮後的seqFile
     */
    @Test
    public void testWriteZipSeqFile() throws Exception {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","file:///");
        FileSystem fs = FileSystem.get(conf);
        Path p = new Path("/home/hadoop/seq/2.seq");
        SequenceFile.Writer writer = null;

        writer = SequenceFile.createWriter(conf,SequenceFile.Writer.file(p),
                SequenceFile.Writer.keyClass(IntWritable.class),
                SequenceFile.Writer.valueClass(IntWritable.class),
                SequenceFile.Writer.compression(SequenceFile.CompressionType.BLOCK,new DefaultCodec())//採取塊壓縮的方式,defaultCodec的壓縮編碼
                );
        IntWritable year;//年份
        IntWritable temperature;//溫度
        for (int i = 0;i<8000;i++){
            year = new IntWritable();
            year.set(1970 + new Random().nextInt(100));
            temperature = new IntWritable();
            temperature.set(new Random().nextInt(100)-30);
            writer.append(year,temperature);
            if(i % 400 == 0){
                writer.sync();//每四百條記錄新增一個同步點
            }
        }
        writer.close();
    }

壓縮方式有三種:塊壓縮"BLOCK",記錄壓縮(壓縮value)“RECORD”,還有就是不壓縮。壓縮方式有:DeflateCodecGzipCodecBZip2CodecLz4CodecLZOSnappyCodec。lzo snappyCodec需要你機器本地有響應的庫支援。

讀操作,讀取所有的記錄,不管是壓縮還是非壓縮檔案都可以直接讀取

    /**
     * 讀操作,迴圈輸出所有key-value
     */
    @Test
    public void readSeqFile() throws Exception {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","file:///");
        FileSystem fs = FileSystem.get(conf);
        Path p = new Path("/home/hadoop/seq/1.seq") ;
        SequenceFile.Reader reader = null;
        reader = new SequenceFile.Reader(conf,SequenceFile.Reader.file(p)//路徑
                );
        IntWritable key = new IntWritable();
        IntWritable value = new IntWritable() ;
        while(reader.next(key,value)){
            System.out.println(key.get() + " : " + value.toString());
        }
        reader.close();
    }
從seqFile中定位偏移量,讀取檔案
    /**
     * 讀操作,迴圈輸出所有key-value
     * 根據定位到某個位元組,來讀取檔案
     */
    @Test
    public void readSeqFileFromSeek() throws Exception {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","file:///");
        FileSystem fs = FileSystem.get(conf);
        Path p = new Path("/home/hadoop/seq/2.seq") ;
        SequenceFile.Reader reader = null;
        reader = new SequenceFile.Reader(conf,SequenceFile.Reader.file(p)//路徑
        );
        IntWritable key = new IntWritable();
        IntWritable value = new IntWritable() ;
        reader.seek(25130);//從這個偏移量的下一個同步點開始讀,偏移量必須是準確的
        while(reader.next(key,value)){
            System.out.println(reader.getPosition() + "   " +key.get() + " : " + value.toString());
        }
        reader.close();
    }
/**
     * 讀操作,迴圈輸出所有key-value
     * 根據同步點,來讀取檔案
     */
    @Test
    public void readSeqFileFromSync() throws Exception {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS","file:///");
        FileSystem fs = FileSystem.get(conf);
        Path p = new Path("/home/hadoop/seq/2.seq") ;
        SequenceFile.Reader reader = null;
        reader = new SequenceFile.Reader(conf,SequenceFile.Reader.file(p)//路徑
                );
        IntWritable key = new IntWritable();
        IntWritable value = new IntWritable() ;
        reader.sync(23810);//從這個偏移量的下一同步點開始讀
        while(reader.next(key,value)){
            System.out.println(reader.getPosition() + "   " +key.get() + " : " + value.toString());
        }
        reader.close();
    }


相關推薦

hadoop sequenceFile

hadoop不僅可以處理文字資訊,還可以處理二進位制格式資料,sequenceFile就是這樣的檔案。有以下特點:可分割支援壓縮每一行都是一個key value對可以設定同步點SequenceFile的格式是由一個header 跟隨一個或多個記錄組成。前三個位元組是一個Byt

hadoop框架

con 完成 shu ati 默認 logs 應用 sso 分布式存 Hadoop學習隨筆(參考:http://blog.csdn.net/mobanchengshuang/article/details/78786652) Hadoop項目主要包括以下四個模塊 ◆ Had

大數據hadoop入門之hadoop家族

集成 查詢工具 人員 進一步 容錯 基礎知識 不同的 ima nbsp 大數據hadoop入門之hadoop家族詳解 大數據這個詞也許幾年前你聽著還會覺得陌生,但我相信你現在聽到hadoop這個詞的時候你應該都會覺得“熟悉”!越來越發現身邊從事hadoop開發或者是正在學習

HADOOP IO——序列化(1)

什麼是IO? I:input 輸入 通常做讀取操作(將不同資料來源的資料讀入到記憶體中,也叫讀取流) O:output 輸出 通常做寫入操作(將記憶體中的資料寫入到不同的資料來源,也叫寫入流)(出記憶體到別的地方) 序列化的作用是什麼?1 資料通訊 2 持久化儲存 為什

HADOOP IO——序列化(2)舉列

package com.hadoop.tv; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import org.apache.hadoop.io.Writ

hadoop家族學習路線圖之hadoop產品

大資料這個詞也許幾年前你聽著還會覺得陌生,但我相信你現在聽到hadoop這個詞的時候你應該都會覺得“熟悉”!越來越發現身邊從事hadoop開發或者是正在學習hadoop的人變多了。作為一個hadoop入門級的新手,你會覺得哪些地方很難呢?執行環境的搭建恐怕就已經足夠讓新手頭疼

Hadoop原始碼之DBOutputFormat類

Hadoop 原始碼詳解之 DBOutputFormat 類 1. 類釋義 A OutputFormat that sends the reduce output to a SQL table. 一種將Reduce 輸出到一個SQL表中的輸出格式。 DB

Hadoop原始碼之Mapper類

Hadoop原始碼詳解之Mapper類 1. 類釋義 Maps input key/value pairs to a set of intermediate key/value pairs. 將輸入的鍵值對應成一系列的中間鍵值對 Maps are the

Hadoop原始碼之FileOutputFormat 類

Hadoop 原始碼詳解之FileOutputFormat 類 1. 類釋義 A base class for OutputFormats that read from FileSystems. 一個類從FileSystems讀取 用於OutputFormats 【實在翻

Hadoop 原始碼之FileInputFormat類

Hadoop 原始碼詳解之FileInputFormat類【updating…】 1. 類釋義 A base class for file-based InputFormats. 針對基於檔案的 InputFormats 一個基類 FileInputFo

Hadoop 原始碼之RecordReader介面

Hadoop 原始碼詳解之RecordReader介面 1. 類釋義 RecordReader reads <key, value> pairs from an InputSplit. RecordReader 從InputSplit中讀取<key,va

Hadoop原始碼之Job 類

Hadoop原始碼詳解之Job類 1. 原始碼 包:org.apache.hadoop.mapreduce 繼承的介面有:AutoCloseable,JobContext,org.apache.hadoop.mapreduce.MRJobConfig

Hadoop Operations(Hadoop操作) (二) HDFS

       最初,客戶機發出請求,使用Hadoop檔案系統api開啟指定的檔案。如果使用者有必要的許可權,則將請求傳送到namenode,以建立檔案元資料。新檔案的元資料條目;但是,它最初沒有相關的塊。對客戶機的響應表明開啟的請求是成功的,並且它現在可能開始寫入資料。在API級別,返回一個標準的Java流物

Hadoop RPC-RMI

Hadoop RPC 遠端過程呼叫是Hadoop中的核心概念。在深入研究RPC之前,先看看遠端呼叫的鼻祖Java RMI. 1.什麼是RMI Java遠端方法呼叫,即Java RMI(Java Remote Method Invocation)是Java程式語言

Mahout駕馭hadoop

            眾所周知,Mahout是基於Hadoop分散式系統的,要想看懂Mahout的原始碼,首先得明白mahout是如何使用hadoop的!             首先,在我的<<Hadoop執行原理詳解>>一篇中,詳細介紹了ha

雲端計算期末報告無圖 kmeans和最短路徑演算法hadoop實現

《雲端計算應用開發實驗》大作業報告 一.實驗環境與實驗工具 ubuntu 16.04真機 + hadoop2.6 + 本地偽分佈   二.實驗原理 以下內容為科普性內容,不過裡面還是有一些關鍵的解釋在配環境的時候用得上 Hadoop是一個

hadoop wordcount

mapreducehadoop中的分散式運算程式設計框架,只要按照其程式設計規範,只需要編寫少量的業務邏輯程式碼即可實現一個強大的海量資料併發處理程式 Demo開發——wordcount 1、需求 從大量(比如T級別)文字檔案中,統計出每一個單詞出現的總次數 2、map

Hadoop之WordCount

ride 開始 zookeepe ati 程序 form 數組 -c 狀態 花了好長時間查找資料理解、學習、總結 這應該是一篇比較全面的MapReduce之WordCount文章了 耐心看下去 1,創建本地文件 在hadoop-2.6.0文件夾下創建一個文件夾data,在其

008-Hadoop Hive sql語法3-DML 操作:元數據存儲

pan 查詢 寫入 所有 not insert語句 int 寫入文件 文件系統 一、概述 hive不支持用insert語句一條一條的進行插入操作,也不支持update操作。數據是以load的方式加載到建立好的表中。數據一旦導入就不可以修改。 DML包括:INSERT插入

hadoop生態圈的

hadoop生態圈 hadoop學習線路 hadoop件組 hadoop 學習和使用hadoop有一年了,這裏主要分享一下對hadoop整體上的理解,分門別類的介紹一下相關組件,最後提供了建議的學習路線,希望對hadoop的初學者有參考作用。 1. Hadoop核心件組有哪些? 廣義