Hadoop下将大量小文件生成一个sequenceFile文件
来源:互联网 发布:大数据产业创新研究院 编辑:程序博客网 时间:2024/05/16 23:53
概念:SequenceFile是一个由二进制序列化过的key/value的字节流组成的文本存储文件,它可以在map/reduce过程中的input/output 的format时被使用。在map/reduce过程中,map处理文件的临时输出就是使用SequenceFile处理过的。 所以一般的SequenceFile均是在FileSystem中生成,供map调用的原始文件。
1.SequenceFile特点:是 Hadoop 的一个重要数据文件类型,它提供key-value的存储,但与传统key-value存储(比如hash表,btree)不同的是,它是appendonly的,于是你不能对已存在的key进行写操作。
2.SequenceFile 有三种压缩态:
1 Uncompressed – 未进行压缩的状
2.record compressed - 对每一条记录的value值进行了压缩(文件头中包含上使用哪种压缩算法的信息)
3. block compressed – 当数据量达到一定大小后,将停止写入进行整体压缩,整体压缩的方法是把所有的keylength,key,vlength,value 分别合在一起进行整体压缩
3.结构组成:
3.1 header数据:保存文件的压缩态标识;
3.2 Metadata数据:简单的属性/值对,标识文件的一些其他信息。Metadata 在文件创建时就写好了,所以也是不能更改
3.3 追加的键值对数据
3.4 流存储结构:流的存储头字节格式:
Header: *字节头”SEQ”, 后跟一个字节表示版本”SEQ4”,”SEQ6”.//这里有点忘了 不记得是怎么处理的了,回头补上做详细解释
*keyClass name
*valueClass name
*compression boolean型的存储标示压缩值是否转变为keys/values值了
*blockcompression boolean型的存储标示是否全压缩的方式转变为keys/values值了
*compressor 压缩处理的类型,比如我用Gzip压缩的Hadoop提供的是GzipCodec什么的..
*元数据 这个大家可看可不看的
Header: *字节头”SEQ”, 后跟一个字节表示版本”SEQ4”,”SEQ6”.//这里有点忘了 不记得是怎么处理的了,回头补上做详细解释
*keyClass name
*valueClass name
*compression boolean型的存储标示压缩值是否转变为keys/values值了
*blockcompression boolean型的存储标示是否全压缩的方式转变为keys/values值了
*compressor 压缩处理的类型,比如我用Gzip压缩的Hadoop提供的是GzipCodec什么的..
*元数据 这个大家可看可不看的
4.扩展实现:
4.1 MapFile 一个key-value 对应的查找数据结构,由数据文件/data 和索引文件 /index 组成,数据文件中包含所有需要存储的key-value对,按key的顺序排列。索引文件包含一部分key值,用以指向数据文件的关键位置
4.2 SetFile – 基于 MapFile 实现的,他只有key,value为不可变的数据。
4.3 ArrayFile – 也是基于 MapFile 实现,他就像我们使用的数组一样,key值为序列化的数字。
4.4 BloomMapFile – 他在 MapFile 的基础上增加了一个 /bloom 文件,包含的是二进制的过滤表,在每一次写操作完成时,会更新这个过滤表。
5.使用如下:主要是Writer和Reader对象完成文件的添加和读功能,应用demo参照下面链接,其中Map端以SequenceFileInputFormat格式接收,Map的key-value应为SequenceFile保持一致。
http://www.linuxidc.com/Linux/2012-04/57840.htm
1)遇到的问题,因为是在集群上运行,代码中String seqFsUrl = "hdfs://localhost:9000/user/mjiang/target-seq/sdfgz.seq";的localhost错误,
于是老是出现连接不上的问题,(Retrying connect to server: localhost/127.0.0.1:8020. Already tried 0 time(s).)
所以运行程序时出现连接不上Hadoop的问题时,考虑是不是程序写错了。
2)sequenceFile中虽然是按文件名(或其他任何值)为键,文件内容为值来存储的。但用SequenceFileAsTextInputFormat来读取时,键值还是会被读到文件的第一行
没分析源码,不清楚原因
3)sequenceFile可以处理.gz文件(没有实验出不行,按说.gz文件是不可以分块存储的???逻辑上还是一个)
- import java.io.BufferedInputStream;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.File;
- 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.NullWritable;
- import org.apache.hadoop.io.SequenceFile;
- import org.apache.hadoop.io.Text;
- public class sequeneceFile{
- public static void main(String[] args) throws IOException {
- //String seqFsUrl = "hdfs://localhost:9000/user/mjiang/target-seq/sdfgz.seq";
- String seqFsUrl = "user/mjiang/target-seq/sdfgz.seq";
- Configuration conf = new Configuration();
- //conf.set("fs.default.name", "hdfs://venus:9000");
- //conf.set("hadoop.job.user", "mjiang");
- //conf.set("mapred.job.tracker", "venus:9001");
- FileSystem fs = FileSystem.get(URI.create(seqFsUrl),conf);
- Path seqPath = new Path(seqFsUrl);
- //Text key = new Text();
- Text value = new Text();
- String filesPath = "/home/mjiang/java/eclipse/hadoop/sequenceFile/data/sdfgz/";
- File gzFilesDir = new File(filesPath);
- String[] gzFiles = gzFilesDir.list();
- int filesLen=gzFiles.length;
- SequenceFile.Writer writer = null;
- try {//返回一个SequenceFile.Writer实例 需要数据流和path对象 将数据写入了path对象
- writer = SequenceFile.createWriter(fs, conf, seqPath,NullWritable.class, value.getClass());
- //for (int i=0;i<2;i++){
- while (filesLen>0){
- File gzFile = new File(filesPath+gzFiles[filesLen-1]);
- InputStream in = new BufferedInputStream(new FileInputStream(gzFile));
- long len = gzFile.length();
- byte[] buff = new byte[(int)len];
- if ((len = in.read(buff))!= -1) {
- value.set(buff);
- writer.append(NullWritable.get(), value);//将每条记录追加到SequenceFile.Writer实例的末尾
- }
- //process
- System.out.println(gzFiles[filesLen-1]);
- //key.clear();
- value.clear();
- IOUtils.closeStream(in);
- filesLen--;//!!
- }
- //filesLen = 2; }
- } finally {
- IOUtils.closeStream(writer);
- }
- }
- }
0 0
- hadoop下将大量小文件生成一个sequenceFile文件
- Hadoop下将大量小文件生成一个sequenceFile文件
- Hadoop下将大量小文件生成一个sequenceFile文件
- SequenceFile 解决hadoop小文件问题
- Hadoop 上传小文件 合成sequencefile 记录
- hadoop处理sequenceFile文件
- hadoop生成序列化文件(SequenceFile)的程序
- Hadoop序列化文件SequenceFile
- Hadoop序列化文件SequenceFile
- Hadoop 写SequenceFile文件 源代码
- Hadoop的SequenceFile文件<转>
- sequencefile处理小文件实例
- sequencefile处理小文件实例
- Hadoop Archive管理大量小文件
- hadoop中mr处理大量小文件
- [Hadoop]大量小文件问题及解决方案
- hadoop大量小文件的优化策略
- Hadoop 大量小文件问题及解决方案
- Android ArrayAdapter 详解
- 建议123:程序集不必与命名空间同名
- 使用恶意USB设备解锁任意锁屏状态Windows、Mac(含工具、视频演示)
- Qt播放音视频文件
- android项目源码大全
- Hadoop下将大量小文件生成一个sequenceFile文件
- 建议124:考虑在命名空间中使用复数
- 用ListView实现下拉图片放大的效果
- FreeCMS视频教程 自定义表单
- 二叉树的遍历---栈实现
- 三种纯css实现三角形的方法
- 建议125:避免用FCL的类型名称命名自己的类型
- 项目经验分享——Java常用工具类集合
- Android中SwipeBack右滑返回(手势返回)的实现(带源码)