MR之SequenceFile详解

package com.leaf.hadoop.second;

import java.util.Random;

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;
//$ hadoop jar SequenceWriteSample.jar SequenceWriteSample
public class SequenceWriteSample {

	private static String meg = "hello world";
	public static void main(String[] args) throws Exception{
		Configuration conf = new Configuration();//获取环境变量
		FileSystem fs = FileSystem.get(conf);//获取文件系统
		Path path = new Path("sequenceFile");//定义路径
		Random rand = new Random();
		SequenceFile.Writer write = new SequenceFile.Writer(fs, conf, path, IntWritable.class, Text.class);
		for(int i=0;i<100;i++){
			write.append(new IntWritable(rand.nextInt(100)), new Text(meg));//写操作,隐藏的为每一行添加一个偏移量
			//System.out.println(write.getLength());
		}
		IOUtils.closeStream(write);//将写出流关闭
	}

	/*
	 * createWriter()方法的源码;
	 * public static Writer createWriter(FileSystem fs,Configuration conf,Path name,Class keyClass,Class valClass)throws IOException{
		return createWriter(fs,conf,name,keyClass,valClass,getCompressionType(conf));
	}
	*CompressionType类用以对SequenceFile写入的文件设定是否进行压缩处理
	*
	*CompressionType.NONE:表示不对任何数据进行压缩从而直接进行存储
	*CompressionType.RECORD:表示仅仅压缩key而对value不进行压缩
	*CompressionType.BLOCK:表示对所有的key与value都进行压缩
	*/

	/**
	 * write实例还隐藏的为每一行添加一个偏移量,用于获取当前文件的移动位置,
	 * 并按一定顺序生成相应的"同步位置"(Sync position),同步位置是
	 * 生成在SequenceFile文件的内部划分位置处,同步位置具体用法见SequenceFile.Reader
	 */
}
class SequenceReaderSample{//运行命令:$ hadoop jar SequenceReaderSample.jar SequenceReaderSample
	public static void main(String[] args)throws Exception{
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(conf);//获取文件系统
		Path path = new Path("cool.txt");//定义输出路径
		SequenceFile.Reader reader = new SequenceFile.Reader(fs, path, conf);//创建实例

		IntWritable key = new IntWritable();//创建待读入Key实例
		Text value = new Text();//创建待读入value实例
		while(reader.next(key,value)){
			System.out.println(key+"======"+value);//打印已读取键值对
		}
		IOUtils.closeStream(reader);//关闭读入流
	}
	/**
	 * 相对于SequenceFile.Writer方法
	 * SequenceFile.Reader提供了查找同步位置的方法,通过返回一个布尔值确认是否已经读取到偏移位置
	 * public boolean syncSeen(){return syncSeen}
	 *
	 * 同步位置(Sync Position)的作用:
	 *
	 *
	 */

	/*
	 * reader中源码
	 * public synchronized boolean next(Writable key, Writable val)
			throws IOException {
			boolean more = next(key);                //判断下一个值是否存在
			if (more)                        //存在则进行操作
			getCurrentValue(val);                  //获得对应的值
			return more;
			}
			keyIn = new DataInputStream(keyInFilter);            //创建输入流
			public synchronized boolean next(Writable key) throws IOException {
			…
			key.readFields(keyIn);                    //用读方法进行数据读取
			…
			}
			*
			*/
	/**
	 * 继续查看reader方法:
	 * …
	 *key.readFields(valBuffer);                    //通过 key 读入数据
	 *valBuffer.mark(0);                      //标记
	 *if (valBuffer.getPosition() != keyLength)              //判断已读取位置
	 *throw  new  IOException(key  +  "  read  "  +  valBuffer.getPosition()   +  "  bytes,  should  read  " +
	 *keyLength);                        //抛出异常
	 *}
	 *…
	 *解析:首先key的对象读取一个偏移位置,根据其二进制生成具体事例,然后将位置归零,
	 *	如果此时偏移位置与key的长度不相同则抛出错误。注:next进行键值读取的时候,必须有一个给定偏移量,
	 *	而同时如果偏移量大于key的长度则产生异常。而解决办法是通过获取文件的偏移位置后,从偏移的边界
	 *	开始读取,然后将整个值读入key中。
	 *
	 *	Reader同时还提供了一个sync(long position)方法,将位置定位到当前位置的下一个同步位置开始读取。
	 *	案例代码如下:
	 */
}
class SyncPositionSample{
	public static void main(String[] args)throws Exception{
		Configuration conf = new Configuration();//获取环境变量
		FileSystem fs = FileSystem.get(conf);//获取文件系统
		Path path = new Path("leaf.txt");//获取路径
		SequenceFile.Reader reader = new SequenceFile.Reader(fs,path,conf);//创建reader实例
		IntWritable key = new IntWritable();//设置存放实例
		Text value = new Text();
		reader.sync(0);//读取同步点
		while(reader.next(key,value)){//将数据读入实例中
			System.out.println(key+"-"+value);
		}
	}
}

MR之SequenceFile详解

时间: 2024-09-30 15:42:37

MR之SequenceFile详解的相关文章

Hadoop Hive sql语法详解

Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行,通过自己的SQL 去查询分析需要的内容,这套SQL 简称Hive SQL,使不熟悉mapreduce 的用户很方便的利用SQL 语言查询,汇总,分析数据.而mapreduce开发人员可以把己写的mapper 和reducer 作为插件来支持

Hive的配置详解和日常维护

Hive的配置详解和日常维护 一.Hive的参数配置详解 1>.mapred.reduce.tasks  默认为-1.指定Hive作业的reduce task个数,如果保留默认值,则Hive 自己决定应该使用多少个task. 2>.hive.mapred.mode  2.x下的默认值为strict,1.x以及之前的版本默认值为nonstrict.如果 设为strict,Hive将禁止一些危险的查询:分区表未用分区字段筛选: order by语句后未跟limit子句:join后没有on语句从而形

keepalived的配置详解(非常详细)

keepalived的配置详解(非常详细) 2017-01-22 15:24 2997人阅读 评论(0) 收藏 举报  分类: 运维学习(25)  转载自:http://blog.csdn.net/u010391029/article/details/48311699 1. 前言 VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,最新协议在RFC3768中定义,原来的定义RFC2338被废除,新协议相对还简化了一些功能. 2. 协议说

python正则表达式详解

python正则表达式详解 正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能不一样,不过只要学会了任意一门语言的正则表达式用法,其他语言中大部分也只是换了个函数的名称而已,本质都是一样的.下面,我来介绍一下python中的正则表达式是怎么使用的. 首先,python中的正则表达式大致分为以下几部分: 元字符 模式 函数 re 内置对象用法 分组用

[持续交付实践] pipeline:pipeline 使用之语法详解

一.引言 jenkins pipeline语法的发展如此之快用日新月异来形容也不为过,而目前国内对jenkins pipeline关注的人还非常少,相关的文章更是稀少,唯一看到w3c有篇相关的估计是直接翻译软件翻的,读下来惨不忍睹.没办法,语法详解这章我干脆把jenkins官网上的语法说明全部翻译了一遍,并更新了陈旧的内容(可怜了我大学四级的英语水平~),英语好的朋友也可以直接到官网阅读. 二.语法简介 Pipeline最基本的部分是"step".基本上,step告诉Jenkins 要

EasyPR--开发详解

我正在做一个开源的中文车牌识别系统,Git地址为:https://github.com/liuruoze/EasyPR. 我给它取的名字为EasyPR,也就是Easy to do Plate Recognition的意思.我开发这套系统的主要原因是因为我希望能够锻炼我在这方面的能力,包括C++技术.计算机图形学.机器学习等.我把这个项目开源的主要目的是:1.它基于开源的代码诞生,理应回归开源:2.我希望有人能够一起协助强化这套系统,包括代码.训练数据等,能够让这套系统的准确性更高,鲁棒性更强等等

Hadoop 2.6.0 HA高可用集群配置详解

1 Hadoop HA架构详解 1.1 HDFS HA背景 HDFS集群中NameNode 存在单点故障(SPOF).对于只有一个NameNode的集群,如果NameNode机器出现意外情况,将导致整个集群无法使用,直到NameNode 重新启动. 影响HDFS集群不可用主要包括以下两种情况:一是NameNode机器宕机,将导致集群不可用,重启NameNode之后才可使用:二是计划内的NameNode节点软件或硬件升级,导致集群在短时间内不可用. 为了解决上述问题,Hadoop给出了HDFS的高

机器学习经典算法详解及Python实现---朴素贝叶斯分类及其在文本分类、垃圾邮件检测中的应用

摘要: 朴素贝叶斯分类是贝叶斯分类器的一种,贝叶斯分类算法是统计学的一种分类方法,利用概率统计知识进行分类,其分类原理就是利用贝叶斯公式根据某对象的先验概率计算出其后验概率(即该对象属于某一类的概率),然后选择具有最大后验概率的类作为该对象所属的类.总的来说:当样本特征个数较多或者特征之间相关性较大时,朴素贝叶斯分类效率比不上决策树模型:当各特征相关性较小时,朴素贝叶斯分类性能最为良好.另外朴素贝叶斯的计算过程类条件概率等计算彼此是独立的,因此特别适于分布式计算.本文详述了朴素贝叶斯分类的统计学

YDB基本使用详解(转)

第七章YDB基本使用详解 一.如何与YDB对接(交互) 目前延云YDB提供如下几种方式 l命令行的方式 lWeb http接口的方式 lJDBC接口的方式 通过Java编程接入 通过可视化SQL分析统计接入 通过报表分析工具接入 二.命令行接入 进入ya100的安装目录的bin目录 1.直接执行 ./conn.sh 即可. 2.通过./sql.sh -f xxx.sql 直接执行文件中的SQL 三.WEB接入 WEB接口主要是为了给那些不支持HDBC访问的程序提供接口支持,如PHP. 1.图形S