`

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);
	}
}

 

 

 

 

 

分享到:
评论

相关推荐

    2022毕业设计,基于 Hadoop 的游戏数据分析系统源码.zip

    【标题】:“2022毕业设计,基于 Hadoop 的游戏数据分析系统源码” 这个毕业设计项目主要聚焦于使用Hadoop框架开发一个游戏数据分析系统。Hadoop是Apache软件基金会的一个开源分布式计算平台,专为处理和存储大规模...

    基于Hadoop豆瓣电影数据分析实验报告

    2. **数据导入**:将数据文件(如data.txt)复制到Hadoop环境,创建Hive数据库和表结构,字段包括电影ID、名称、投票人数、类型、产地、上映时间、时长、年代、评分和首映地点。使用LOAD DATA命令将数据加载到Hive表...

    基于hadoop的电信客服数据分析+文档

    在这个基于Hadoop的电信客服数据分析项目中,我们重点探讨如何利用Hadoop生态系统来解析和分析电信行业的客户通话记录,从而获取有价值的洞察。 首先,Hadoop是Apache基金会开发的一个分布式计算框架,其核心包括...

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

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

    基于Hadoop的数据仓库Hive学习指南.doc

    1. **Hadoop数据仓库Hive**:Hive是由Facebook开发的一种基于Hadoop的数据仓库工具,它允许SQL熟悉的用户对存储在Hadoop分布式文件系统(HDFS)上的大规模数据进行分析。Hive将结构化的数据文件映射为数据库表,提供了...

    基于Hadoop的大数据处理技术及发展.pdf

    基于Hadoop的大数据处理技术及发展 大数据处理技术是当今IT行业中最热门的技术之一,其应用范围非常广泛,涉及到数据存储、数据分析、数据挖掘等多个方面。在本文中,我们将详细介绍基于Hadoop的大数据处理技术及...

    基于hadoop的数据分析系统.zip

    DAPlant可能是本文压缩包中的一个数据分析项目实例,它可能包含了实现上述功能的源代码和文档,帮助读者更好地理解和实践基于Hadoop的数据分析系统。通过研究这个项目,我们可以学习到如何在实际环境中应用Hadoop...

    基于大数据Hadoop框架的数据处理流程研究与案例实践.pdf

    Hadoop的核心设计包括Hadoop分布式文件系统(HDFS),用于存储海量数据,以及MapReduce编程模型,用于计算海量数据。 本文主要围绕Hadoop框架及其数据处理流程展开研究,并提供了实际案例实践。Hadoop不仅在存储...

    烟草企业基于Hadoop的数据处理研究.pdf

    本文主要研究了烟草企业基于Hadoop的数据处理研究,讨论了Hadoop平台的技术架构和项目结构,以及在烟草企业中的应用。 一、Hadoop简介 Hadoop是一个开源分布式计算平台,具有高容错性、高伸缩性等优点,允许用户将...

    基于Hadoop的海量数据存储平台设计与开发

    ### 基于Hadoop的海量数据存储平台设计与开发 #### 摘要与背景 随着北部湾海洋生态资源的开发与利用,《北部湾经济区发展规划》的实施催生了一系列重大的基础研究专项和科学研究项目。这些项目在推进的过程中产生...

    基于Hadoop的大数据处理关键技术综述.pptx

    【基于Hadoop的大数据处理关键技术综述】 大数据,作为一种新兴的技术架构,旨在经济有效地从高频、海量、多结构和类型的复杂数据中挖掘价值。其主要特征包括高并发读写需求、海量数据的高效存储与访问以及高可扩展...

    Hadoop文件存储结构

    ### Hadoop文件存储结构:深入理解HDFS #### 引言与目标设定 Hadoop分布式文件系统(HDFS)作为一款专为运行在廉价硬件上的分布式文件系统设计,其架构和功能设定旨在应对大规模数据集的高效管理和处理。不同于...

    基于Hadoop的股票大数据分析系统.zip

    Hive则是基于Hadoop的数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,使得非编程背景的用户也能方便地操作大数据。 综合这些信息,我们可以推断这个系统可能的工作流程如下: 1. ...

    基于hadoop的云盘系统

    5. **HBase**: HBase是一个非关系型数据库,基于Google的Bigtable模型,设计用于处理和存储海量结构化数据。在云盘系统中,HBase可以作为HDFS上的索引层,提供高效的数据查询和检索,比如根据文件名、时间戳等属性...

    基于hadoop平台hive数据库处理电影数据(8965字数32页).doc

    通过Hadoop,可以处理海量的电影数据,而Hive则作为一个基于Hadoop的数据仓库工具,提供了一种结构化数据的查询和分析方式,简化了大数据处理的复杂性。参考链接提供了更详尽的搭建过程和技术细节。 【标签】:涉及...

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

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

Global site tag (gtag.js) - Google Analytics