`

Hadoop基于文件的数据结构

 
阅读更多

 

1 SequenceFile的理解 

  (1)SequenceFile是Hadoop用来存储二进制形式的对而设计的一种平面文件(Flat File);
  (2)可以把SequenceFile当做一个容器,把所有文件打包到SequenceFile类中可以高效的对小文件进行存储和处理;
  (3)SequenceFile文件并不按照其存储的key进行排序存储,SequenceFile的内部类Writer提供了append功能;
  (4)SequenceFile中的key和value可以是任意类型Writable或者是自定义的Writable类型;

 

 2 SequenceFile:支持数据压缩(记录压缩,块压缩)

  

    a.无压缩类型:如果没有启用压缩(默认设置),那么每个记录就由他的记录长度(字节数)、键的长度、
    键和值组成。长度字段为四字节。
    b.记录压缩类型:记录压缩格式与无压缩格式基本相同,不同的是值字节是用定义在头部的编码器来压缩的。
    注意,键是不压缩的。
    c.块压缩类型:块压缩一次压缩多个记录,因此它比记录压缩更紧凑,而且一般优先选择。
    当记录的字节数达到最小大小,才会添加到块。改最小值由io.seqfile.compress.blocksize中的属性定义。默认值是1000000字节。格式为记录数、键长度、键、值长度、值。

 

 3 优缺点

   缺点:需要一个合并文件过程,并且合并后的文件不方便查看 

 

 

SequenceFile写过程:

(1)创建Configuration;(2)获取FileSystem;(3)创建文件输出路径Path;
(4)调用SequenceFile.createWriter得到SequenceFile.Writer对象;
(5)调用SequenceFile.Writer.append追加写入文件;(6)关闭流; 

 

SequenceFile读过程:

(1)创建Configuration;(2)获取FileSystem;(3)创建文件输出路径Path;
(4)new一个SequenceFile Reader进行读取;(5)得到keyClass和valueClass;(6)关闭流; 

 

二、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 SequentceFile 的读写 

package org.tony.file;
 
public class SequenceFileWriter {
	public static String uri = "hdfs://192.168.102.136:9000";
	public static String[] data = { "one,two", "three,four", "five,six",
			"seven,eight", "night,ten" };

	public static void main(String[] args) throws IOException {
		write();
		read();
		
	}
	
	/**
	* @Title: write 
	* @Description: (1)创建Configuration;(2)获取FileSystem;(3)创建文件输出路径Path;
					(4)调用SequenceFile.createWriter得到SequenceFile.Writer对象;
					(5)调用SequenceFile.Writer.append追加写入文件;(6)关闭流; 
	* @return void    返回类型 
	* @throws
	 */
	public static void write() throws IOException {

		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()); 采用压缩,用BZip2压缩算法
		for (int i = 0; i < 100; i++) { // 写入100次
			key.set(100 - i);
			value.set(data[i % data.length]);
			writer.append(key, value);
		}
		IOUtils.closeStream(writer);
		
	}
	
	/**
	* @Title: read 
	* @Description: (1)创建Configuration;(2)获取FileSystem;(3)创建文件输出路径Path;
					(4)new一个SequenceFile Reader进行读取;(5)得到keyClass和valueClass;(6)关闭流; 
	* @return void    返回类型 
	* @throws
	 */
	public static void read() throws IOException {
		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使用

  

package org.tony.file;
 
public class MapFileTest {
	public static String uri = "hdfs://192.168.102.136:9000"; //访问hdfs 的uri 
	public static String[] data = { "one,two", "three,four", "five,six",
			"seven,eight", "night,ten" };

	public static void main(String[] args) throws Exception {
//		write(); 
//		read();
		seqToMapFile();
	}
	
	/**用Mapfile写文件
	* @Title: write 
	* @Description: (1)创建Configuration;(2)获取FileSystem;(3)创建文件输出路径Path;
					(4)new一个MapFile.Writer对象;(5)调用MapFile.Writer.append追加写入文件;(6)关闭流; 
	* @return void    返回类型 
	* @throws
	 */
	public static void write() throws IOException {
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(uri), conf);
		
		Path path = new Path("/tmpdata.map");
		IntWritable key = new IntWritable();
		Text value = new Text();
		
		MapFile.Writer writer = new MapFile.Writer(conf, fs, path.toString(),
				key.getClass(), value.getClass());
		
		for (int i = 0; i < 100; i++) {
			key.set(i + 1);
			value.set(data[i % data.length]);
			writer.append(key, value);
		}
		IOUtils.closeStream(writer);

	}
	/**用Mapfile读文件
	* @Title: read 
	* @Description: (1)创建Configuration;(2)获取FileSystem;(3)创建文件输出路径Path;
					(4)new一个MapFile.Reader对象;(5)得到keyClass和valueClass;(6)关闭流; 
	* @return void    返回类型 
	* @throws
	 */
	public static void read() throws IOException {
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(uri), conf);
		
		Path path = new Path("/tmpdata.map");
		MapFile.Reader reader = new MapFile.Reader(fs, path.toString(), conf);
		
		WritableComparable key = (WritableComparable) 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);
		}
		IOUtils.closeStream(reader);
	}
	
	/**将sequence文件转换为MapFile文件 
	* @Title: seqToMapFile 
	* @Description: TODO 
	* @return void    返回类型 
	* @throws
	* 1 创建tmp1.map文件夹 
	* 2 复制tmp1.seq  SequenceFile文件到tmp1.map文件夹下面,并重命名data $./hadoop fs -mv /tmp1.seq /tmp1.map/data
	* 3 运行程序 
	 */
	public static void seqToMapFile() throws Exception{
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(uri), conf);
		
		Path map = new Path("/tmp1.map"); //文件夹位置
		
		//MapFile.DATA_FILE_NAME 为seq文件移动到tmp1.map文件夹下面的文件名称 
		Path mapData = new Path(map,MapFile.DATA_FILE_NAME);
		SequenceFile.Reader reader = new SequenceFile.Reader(fs,mapData,conf);
		Class key = reader.getKeyClass();
		Class value = reader.getValueClass();
		reader.close();
		
		long entries = MapFile.fix(fs, map, key, value, false, conf);
		System.out.printf("Created MapFile %s with %d entries\n",map,entries);
	}
}

 

 

 

 

 

分享到:
评论

相关推荐

    基于Hadoop技术的大数据就业岗位数据分析.docx

    基于Hadoop技术的大数据就业岗位数据分析 作者:梁天友 邱敏 来源:《电脑知识与技术》2021年第31期 基于Hadoop技术的大数据就业岗位数据分析全文共10页,当前为第1页。 基于Hadoop技术的大数据就业岗位数据分析全文...

    一、Hadoop简介 和 Hadoop结构介绍

    Hadoop是现阶段数据开发的基础,Hadoop通常是指一个更广泛的概念—-Hadoop生态圈(基于或关于Hadoop的大数据开发的各种软件环境) 是Apache公司使用Java语言编写的开源的,分布式系统的基础架构 分布式就是,当储存...

    基于Hadoop的大数据处理系统.pdf

    ⼤数据时代给我们带来的不仅是数据量的爆炸式增长、数据结构的复杂多样,⽽且也使处理这些数据信息的⼿段变的 复杂起来。海量数据的存储以及分布式计算是⼤数据分析与处理的⾸要问题。 ⽬前⼤数据的处理平台以Hadoop...

    hadoop3.3.3-winutils

    hadoop基于linux开发和布署运行,故不能将hadoop环境原始运行在windows上。 操作系统环境差异说明 因为模拟linux环境,所以在linux原生环境中就不需要他了 在windows环境中需要配置 如何配置: 配置到运行环境当前目录...

    hadoop 大数据集 数据并行挖掘

    基于 [:分布式计算平台,给出一种适用于大数据集的并行挖掘算法%该算法对非结构化的原始大数据集以 及中间结果文件进行垂直划分以确保能够获得完整的频繁项集,将各个垂直分块数据分配给不同的 [:计算节点进 行处理...

    基于Hadoop的数据仓库Hive基础知识

    Hive是基于Hadoop的数据仓库工具,可对存储在HDFS上的文件中的数据集进行数据整理、特殊查询和分析处理,提供了类似于SQL语言的查询语言–HiveQL,可通过HQL语句实现简单的MR统计,Hive将HQL语句转换成MR任务进行...

    基于 Hadoop 的海量小文件处理技术研究

    基于 Hadoop 的海量小文件处理技术研究 ,主要工作包括两个方面: 1) 基于多层索引的小文件读写策略的研究与实现。本文根据 Hadoop 平台现 有小文件处理的思想,对海量小文件进行合并然后建立索引。其中索引结构的设...

    Hadoop分布式架构下大数据集的并行挖掘

    该算法对非结构化的原始大数据集以及中间结果文件进行垂直划分以确保能够获得完整的频繁项集,将各个垂直分块数据分配给不同的Hadoop计算节点进行处理,以减少各个计算节点的存储数据,进而减少各个计算节点执行交集...

    Hadoop实战中文版

    3.1 HDFS 文件操作 3.1.1 基本文件命令 3.1.2 编程读写HDFS 3.2 剖析MapReduce 程序 3.2.1 Hadoop数据类型 3.2.2 Mapper 3.2.3 Reducer 3.2.4 Partitioner:重定向Mapper输出 3.2.5 Combiner:本地reduce ...

    《数据算法Hadoop Spark大数据处理技巧》PDF 带目录!!

    《数据算法:Hadoop/Spark大数据处理技巧》介绍了很多基本设计模式、优化技术和数据挖掘及机器学习解决方案,以解决生物信息学、基因组学、统计和社交网络分析等领域的很多问题。这还概要介绍了MapReduce、Hadoop和...

    项目源码:基于Hadoop+Spark招聘推荐可视化系统 大数据项目

    数据存储与处理:系统利用Hadoop分布式文件系统(HDFS)存储采集到的招聘数据,并使用Hadoop生态圈中的工具(如Hive、HBase等)进行数据处理和管理。Spark作为数据处理引擎,提供高性能的批处理和实时计算能力,对...

    项目源码:基于Hadoop+Spark招聘推荐可视化系统 大数据项目 计算机毕业设计

    数据存储与处理:系统利用Hadoop分布式文件系统(HDFS)存储采集到的招聘数据,并使用Hadoop生态圈中的工具(如Hive、HBase等)进行数据处理和管理。Spark作为数据处理引擎,提供高性能的批处理和实时计算能力,对...

    基于Hadoop+Spark招聘推荐可视化系统 大数据项目 毕业设计(源码下载)

    数据存储与处理:系统利用Hadoop分布式文件系统(HDFS)存储采集到的招聘数据,并使用Hadoop生态圈中的工具(如Hive、HBase等)进行数据处理和管理。Spark作为数据处理引擎,提供高性能的批处理和实时计算能力,对...

    (hadoop HDFS 和 Mapreduce 架构浅析

    Hadoop 是一个基于 Java 的分布式密集数据处理 和数据分析的软件框架。Hadoop 在很大程度上是受 Google 在 2004 年白皮书中阐述的 MapReduce 技术的 启发。MapReduce 工作原理是将任务分解为成百上千 个小任务,然后...

    大数据课程的期末项目基于spark、hadoop hdfs、mongodb,使用scala,进行电影推荐+源代码+文档说明

    本次项目基于Python爬虫与Movielens数据集作为数据来源,获取CSV格式的数据,使用Hadoop HDFS作为数据的分布式存储平台,使用MongoDB作为数据结构化、规范化的处理并对运算结果进行存储,使用Spark暴露对外SQL接口,...

    一种Hadoop小文件存储和读取的方法.

    提出一种基于小文件合并的方法 HIFM( Hierarchy Index File Merging) ,综合考虑小文件之间的相关性和数据的目录结构,来辅助将小文件合并成大文件,并生成分层索引。采用集中存储和分布式存储相结合的方式管理索引...

    基于Hadoop实现的的图像检索之人脸识别系统+源代码+文档说明.

    Hadoop的设计初衷在于处理海量的结构化的文本数据,故无法处理非结构化的视频和图像数据。本文在研究Hadoop的输入输出和数据类型的基础上,实现了图像和视频数据的处理,即使用FFmpeg对视频进行格式转换以及将视频按...

    Hadoop实战(第2版)

    数据科学.7 数据结构和算法的运用7.1 使用图进行数据建模和解决问题7.1.1 模拟图7.1.2 最短路径算法技术点52 找出两个用户间的最短距离7.1.3 friends-of-friends(FoF) 技术点53 计算FoF 7.1.4 ...

    研究论文-基于Hadoop的抄袭检测的源检索方法研究.pdf

    本文分析了传统抄袭检测系统源检索模块的优缺点,结合分布式系统的特点,提出基于索引分片的源检索体系结构,在大规模数据集上进行抄袭检测研究,以便快速的检测出可疑文档的备选文集。通过实验证明,基于索引分片的源...

Global site tag (gtag.js) - Google Analytics