1. 程式人生 > >hadoop SequenceFile

hadoop SequenceFile

SequenceFile是專為mapreduce設計的,是可分割的二進位制格式,以key/value對的形式儲存。在儲存日誌檔案時,每一行文字代表一條日誌記錄。純文字不合適記錄二進位制型別的資料。SequenceFile可以作為小檔案的容器。

write

先看下 在hadoop中如何寫SequenceFile。

 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 { Configuration configuration = new Configuration(); configuration.set("fs.defaultFS", "hdfs://hadoop:9000"); FileSystem fs = FileSystem.get
(configuration); Path path = new Path("hdfs://hadoop:9000/hadoop/seq/numbers.seq"); IntWritable key = new IntWritable(); Text value = new Text(); SequenceFile.Writer.Option valueOption = SequenceFile.Writer.valueClass(value.getClass()); SequenceFile.Writer.Option keyOption = SequenceFile.Writer
.keyClass(key.getClass()); SequenceFile.Writer.Option file = SequenceFile.Writer.file(path); //指定了 file optiona 就不需要指定 stream // SequenceFile.Writer.Option stream = SequenceFile.Writer.stream(fs.create(path)); SequenceFile.Writer writer = SequenceFile.createWriter(configuration,file,keyOption,valueOption); for (int i = 0; i <100; i++) { key.set(100 -i); value.set(DATA[i % DATA.length]); System.out.printf("[%s]\t%s\t%s\n", writer.getLength(), key, value); writer.append(key, value); } IOUtils.closeStream(writer); }

上面的程式碼基於hadoop 2.6.4,指定了 file option 就不能指定 stream option,否則會丟擲異常。原因如下:

      // check consistency of options
      if ((fileOption == null) == (streamOption == null)) {
        throw new IllegalArgumentException("file or stream must be specified");
      }

read

       Configuration configuration = new Configuration();

        configuration.set("fs.defaultFS", "hdfs://hadoop:9000");

        FileSystem fs = FileSystem.get(configuration);

        Path path = new Path("hdfs://hadoop:9000/hadoop/seq/numbers.seq");



        SequenceFile.Reader.Option file = SequenceFile.Reader.file(path);

        SequenceFile.Reader reader = new SequenceFile.Reader(configuration,file);
        Writable key = (Writable) ReflectionUtils.newInstance(reader.getKeyClass(),configuration);
        Writable value = (Writable)ReflectionUtils.newInstance(reader.getValueClass(),configuration);
        long position = reader.getPosition();

        while (reader.next(key,value)){
            String syncSeen = reader.syncSeen() ? "*" : "";
            System.out.printf("[%s%s]\t%s\t%s\n", position, syncSeen, key, value);
            position = reader.getPosition(); // beginning of next record
        }

        IOUtils.closeStream(reader);

輸出內容如下:

[128]   100 One, two, buckle my shoe
[173]   99  Three, four, shut the door
[220]   98  Five, six, pick up sticks
[264]   97  Seven, eight, lay them straight
[314]   96  Nine, ten, a big fat hen
[359]   95  One, two, buckle my shoe
[404]   94  Three, four, shut the door
[451]   93  Five, six, pick up sticks
[495]   92  Seven, eight, lay them straight
[545]   91  Nine, ten, a big fat hen
[590]   90  One, two, buckle my shoe
[635]   89  Three, four, shut the door
[682]   88  Five, six, pick up sticks
[726]   87  Seven, eight, lay them straight
[776]   86  Nine, ten, a big fat hen
[821]   85  One, two, buckle my shoe
[866]   84  Three, four, shut the door
[913]   83  Five, six, pick up sticks
[957]   82  Seven, eight, lay them straight
[1007]  81  Nine, ten, a big fat hen

The SequenceFile format

SequenceFile 內部儲存結構

一個SequenceFile是由一個head和 一條或者多條record組成。
SequenceFile頭三個位元組是SEQ ,用數字表示;其後是version number,如下圖,Header也包括其他欄位,key/value class,compress等資訊。Sync 標誌是否允許使用者從檔案的任何position同步的讀取記錄。
SequenceFile Header

SequenceFile 的record的格式化依賴於 是否開啟壓縮,如果壓縮,是record compression還是block compression。使用record compression的key不會被壓縮。

block compress

block 壓縮的有點是高效,整個塊被壓縮,而不是在記錄層進行壓縮。資料直到達到塊的大小時才被壓縮,在某一點上整個塊被壓縮,從而形成整體壓縮。預設情況下block的大小與HDFS的block的大小相同,可以使用 io.seqfile.compress.blocksize 設定。
block壓縮

使用壓縮,只要在write中新增 一行程式碼就可以,read 程式碼可以不變

SequenceFile.Writer.Option compression = SequenceFile.Writer.compression(SequenceFile.CompressionType.BLOCK,new DefaultCodec());

相關推薦

hadoop SequenceFile——大資料 儲存

SequenceFile是一個由二進位制序列化過的key/value的位元組流組成的文字儲存檔案。 基於壓縮型別CompressType,共有三種SequenceFile Writer: public static enum CompressionType { /

hadoop SequenceFile 簡介/優缺點

1. 什麼是SequenceFile 1.1.sequenceFile檔案是Hadoop用來儲存二進位制形式的[Key,Value]對而設計的一種平面檔案(Flat File)。 1.2.可以把SequenceFile當做是一個容器,把所有的檔案打包到SequenceFile類中可以

基於Hadoop Sequencefile的小檔案解決方案

基於Hadoop Sequencefile的小檔案解決方案 一、概述    小檔案是指檔案size小於HDFS上block大小的檔案。這樣的檔案會給hadoop的擴充套件性和效能帶來嚴重問題。首先,在HDFS中,任何block,檔案或者目錄在記憶體中均以物件的形式儲存,每個物件約佔150byte,如果有10

HadoopSequenceFile檔案的資料格式(1)

一: 概述 1 SequenceFile是Hadoop為例儲存二進位制的<k,v>而設計的一種平面檔案。 2 SequenceFile的key和value是writable或者writable子類。 3 SequenceFile的儲存不按照key排序,內部類Writer提供了

hadoop SequenceFile介紹 大資料 儲存

SequenceFile是一個由二進位制序列化過的key/value的位元組流組成的文字儲存檔案。 基於壓縮型別CompressType,共有三種SequenceFileWriter: 1 2 3 4 5 6 7 8 public static enum Co

hadoop sequenceFile詳解

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

hadoop SequenceFile

SequenceFile是專為mapreduce設計的,是可分割的二進位制格式,以key/value對的形式儲存。在儲存日誌檔案時,每一行文字代表一條日誌記錄。純文字不合適記錄二進位制型別的資料。SequenceFile可以作為小檔案的容器。 write 先

hadoop SequenceFile介紹

SequenceFile是一個由二進位制序列化過的key/value的位元組流組成的文字儲存檔案。 基於壓縮型別CompressType,共有三種SequenceFileWriter: 1 2 3 4

Hadoop IO操作之SequenceFile 和 MapFile

直接 修改 head ati rec key 情況 接口 用戶 一、SquenceFile   文件中每條記錄是可序列化,可持久化的鍵值對,提供相應的讀寫器和排序器,寫操作根據壓縮的類型分為3種。   ---Write 無壓縮寫數據  ---RecordCompressWr

Hadoop定義的SequenceFile和MapFile的程式設計實現

Hadoop定義了SequenceFile 和MapFile兩種型別的資料結構以適應Mapreduce程式設計框架的需要,Map輸出的中間結果就是由他們表示的。其中MapFile是經過排序並帶有索引的SequenceFile. SequenceFile記錄的是key/value對的列表,是序列化

Hadoop中的SequenceFile系統之一

SequenceFile是一個由二進位制序列化過的key/value的位元組流組成的文字儲存檔案。在Hadoop上利用來解決小檔案序列化的問題。 最近的專案之中,需要將伺服器內的日誌檔案壓縮成一個二進位制的序列化檔案,考慮到可以Hadoop中的HDFS

Hadoopsequencefile和mapfile的區別

原文網址:http://blog.csdn.net/javaman_chen/article/details/7241087 Hadoop的HDFS和MapReduce子框架主要是針對大資料檔案來設計的,在小檔案的處理上不但效率低下,而且十分消耗記憶體資源(每一個小檔

Hadoop中基於檔案的資料格式(1)SequenceFile

import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import o

HadoopSequenceFile的簡介

MapFile  一個key-value 對應的查詢資料結構,由資料檔案/data 和索引檔案 /index 組成,資料檔案中包含所有需要儲存的key-value對,按key的順序排列。索引檔案包含一部分key值,用以指向資料檔案的關鍵位置SetFile – 基於 MapFile 實現的,他只有key,va

hadoop 使用map合並小文件到SequenceFile

耗時 art 合並 next entity 繼承 name for each nes 上一例是直接用SequenceFile的createWriter來實現,本例采用mapreduce的方式。 1、把小文件整體讀入需要自定義InputFormat格式,自定義InputFor

Hadoop HDFS SequenceFile

SequenceFile 是一個由二進位制序列化過的 key/value 的位元組流組成的文字儲存檔案,它可以在map/reduce過程中的input/output 的format時被使用。在map/reduce過程中,map處理檔案的臨時輸出就是使用SequenceFile處理過的。 所以一般的Sequen

hadoop安裝

簡介 系統 官方文檔 lock tsl star tfs replica 控制 曾經的學習筆記 1.Hadoop簡介: a) 分布式存儲系統HDFS 分布式存儲系統 提供了高可靠性、高擴展性和高吞吐率的數據存儲服務 b) 分布式計算框架MapReduce 分布式計

全文索引-lucene,solr,nutch,hadoop之nutch與hadoop

aof java get 查詢 自己 結構 目的 strong 之間 全文索引-lucene。solr。nutch,hadoop之lucene 全文索引-lucene。solr,nutch,hadoop之solr 我在去年的時候,就想把lucene,sol

Hadoop化繁為簡-從安裝Linux到搭建集群環境

開始 協調 利用 html isa 同學 防火墻 右鍵 $path 簡介與環境準備   hadoop的核心是分布式文件系統HDFS以及批處理計算MapReduce。近年,隨著大數據、雲計算、物聯網的興起,也極大的吸引了我的興趣,看了網上很多文章,感覺還是雲裏霧裏,很多不必

Ubuntu14下Hadoop開發&lt;1&gt; 基礎環境安裝

oot jar包 臺式機 解壓 span ice href 安裝samba lan 準備了一臺淘汰的筆記本。單核CPU。3G內存。160G硬盤;準備一個2G的U盤在官網下載了64位的14.04版本號(麒麟)的ISO。下載UNetbootin(Ubuntu專用U盤安裝工