hadoop基于文件的数据结构
来源:互联网 发布:网络平台代理 编辑:程序博客网 时间:2024/05/17 11:36
基于文件的数据结构
两种文件格式
1)SequenceFile
SequenceFile
1、SequenceFile文件是Hadoop用来存储二进制形式的(key,value)对而设计的一种平面文件(Flat File)。
2、可以把SequenceFile当作一个容器,把所有文件打包到SequenceFile类中可以高效的对小文件进行存储和处理
3、SequenceFile文件并不按照其存储的key进行排序存储,SequenceFile的内部类Writer提供了append功能
4、SequenceFile中的key和value可以是任意类型Writable或者是自定义Writable类型
SequenceFile压缩
1、SequenceFile的内部格式取决于是否启用压缩,如果是:要么是记录压缩,要么是块压缩
2、有以下三种类型:
A、无压缩类型:如果没有启用压缩(默认设置),那么每个记录就由它的记录长度(字节数)、键的长度、键和值组成,长度字段为四字节
B、记录压缩类型:记录压缩格式与无压缩格式基本相同,不同的是值字节是用定义在头部的编码器来压缩。注意,键是不压缩的。
C、块压缩类型:块压缩一次压缩多个记录,因此它比记录压缩更紧凑,而且一般优先选择。当记录的字节数达到最小大小,才会添加到块。该最小值由io.seqfile.compress.blocksize中的属性定义。默认值是1000000字节。格式为记录数、键长度、键、值长度、值。
SequenceFile文件格式的好处:
A、支持基于记录(Record)或块(Block)的数据压缩
B、支持splittable,能够作为MapReduce的输入分片
C、修改简单:主要负责修改相应的业务逻辑,而不用考虑具体的存储格式
SequenceFile文件格式的坏处
坏处是需要一个合并文件的过程,且合并后的文件将不方便查看
读写SequenceFile
写过程
1、创建Configuration
2、获取FileSystem
3、创建文件输出路径Path
4、调用SequenceFile.createWriter得到SequenceFile.Writer对象
5、调用SequenceFile.Writer.append追加写入文件
6、关闭流
例子如下:
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;import org.apache.hadoop.io.SequenceFile.CompressionType;import org.apache.hadoop.io.compress.BZip2Codec;public class SequenceFileWrite { public static String uri = "hdfs://10.13.33.218:9000" ; public static String[] data = { "one,two" , "three,four" , "five,six" , "seven,eight" , "nine,ten" } ; public static void main(String args[])throws Exception{ Configuration conf = new Configuration() ; FileSystem fs = FileSystem.get(URI.create(uri),conf) ;// Path path = new Path("/tmp.seq") ; Path path = new Path("/tmp1.seq") ; IntWritable key = new IntWritable() ; Text value = new Text() ; //SequenceFile.Writer writer = SequenceFile.createWriter(fs, conf,path, key.getClass(), value.getClass()) ; SequenceFile.Writer writer = SequenceFile.createWriter(fs, conf,path, key.getClass(), value.getClass(),CompressionType.RECORD,new BZip2Codec()) ;//对SequenceFile进行记录压缩 for(int i=0;i<100;i++){ key.set(100-i) ; value.set(data[i%data.length]) ; writer.append(key, value) ; } IOUtils.closeStream(writer) ; }}
读过程
1、创建Configuration
2、获取FileSystem
3、创建文件输出路径Path
4、new一个SequenceFile.Reader进行读取
5、得到keyClass和valueClass
6、关闭流
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.SequenceFile;import org.apache.hadoop.io.Writable;import org.apache.hadoop.util.ReflectionUtils;public class SequenceFileRead { public static String uri = "hdfs://10.13.33.218:9000" ; public static String[] data = { "one,two" , "three,four" , "five,six" , "seven,eight" , "nine,ten" } ; public static void main(String[] args) throws Exception{ Configuration conf = new Configuration() ; FileSystem fs = FileSystem.get(URI.create(uri),conf) ; //Path path = new Path("/tmp.seq") ; Path path = new Path("/tmp1.seq") ; SequenceFile.Reader reader = new SequenceFile.Reader(fs, path, conf) ; Writable key = (Writable)ReflectionUtils.newInstance(reader.getKeyClass(), conf) ; Writable value = (Writable)ReflectionUtils.newInstance(reader.getValueClass(), conf) ; while(reader.next(key,value)){ System.out.println("key = " + key ) ; System.out.println("value = " + value) ; System.out.println("position = " + reader.getPosition()) ;//同步标识的偏移量 } IOUtils.closeStream(reader) ; }}
2)MapFile
1、MapFile是经过排序的索引的SequenceFile,可以根据key进行查找
2、MapFile的key是WritableComparable类型的,而value是Writable类型的
3、可以使用MapFile.fix()方法来重建索引,把SequenceFile转换成MapFile
4、它有两个静态成员变量
static String DATA_FILE_NAME
static String INDEX_FILE_NAME
写过程:
1、创建Configuration
2、获取FileSystem
3、创建文件输出路径Path
4、new一个MapFile.Writer对象
5、调用MapFile.Writere.append追加写入文件
6、关闭流
读过程
1、创建Configuration
2、获取FileSystem
3、创建文件输出路径Path
4、new一个MapFile.Reader进行读取
5、得到keyClass和valueClass
6、关闭流
- hadoop基于文件的数据结构
- Hadoop基于文件的数据结构
- Hadoop基于文件的数据结构及实例
- Hadoop基于文件的数据结构及实例
- Hadoop IO基于文件的数据结构详解【列式和行式数据结构的存储策略】
- 基于文件的数据结构
- 基于JFinal+AngularJs+Hadoop的WEB文件管理系统
- Hadoop中基于文件的数据格式(1)SequenceFile
- hadoop2.x之IO:基于文件的数据结构
- 基于Hadoop的应用程序开发
- 基于Hadoop的应用程序开发
- 基于Hadoop的数据挖掘
- 基于Hadoop的MR开发
- 基于Hadoop的云存储系统
- hive (基于hadoop的数据仓库)
- 基于yarn的Hadoop调优
- 安装spark,基于hadoop的
- 基于hadoop的BI架构
- ubuntu16.04 nodejs 安装 node指令无效
- ZooKeeper实战(四)-ZooKeeper API使用
- 一个中国工程师的写照.
- 实用知识:iOS5.0前加速计的方法使用(了解)
- Android 权限
- hadoop基于文件的数据结构
- MongoDB 性能优化:分析执行计划
- CSS的两个class选择器紧挨在一起
- 水波纹
- 事件绑定与事件委托
- 移动小球和彩色波纹
- 实现无锁的栈与队列(4)
- java---正则表达式应用实例
- 查找旋转数组的最小值