从官方的WordCount中不难看出,Hadoop在读取文本时的至少要有两种分割的功能。即可以将一篇文档按行切割分离,同时可以将一行中的文本依据空格切割出来。这样,类似与Java的I/O操作,只不过是以单词为单位向下迭代。每次迭代时读出一个单词并取出。
Text word = new Text();然后word.set(itr.nextToken());context.write(word, one) (one是数值为1的整数型变量)。将word逐次编号,并将word的value设置为1表示独到的单词已经出现了一次。最后将全部读取结果保存到Context类型的文本上。
因此,从对文件读写要求的角度出发,Hadoop在文件系统包下建立了一些关乎I/O的接口。
org.apache.hadoop.fs.Seekable
该接口定义了三种方法。注意:以下方法是对任意文件的操作而非仅仅是针对文本的操作。
1.void seek(long pos)
从文件的开始处经过指定的步长pos到达新位置,read()指向新位置。步长不能超出文件。
2.void getPos(long pos)
返回当前位置的步长。
3.boolean seekToNewSource(long targPos)
判断在目标位置是否是当前内容的复本。
与此类似org.apache.hadoop.fs.PositioneReadable定义了一些可读的方法.
public int read(long position, byte[] buffer, int offset, int length) throws IOException;
将描述翻译成中文是从文件中的一个指定位置position开始读取直到指定字节串byte[]的位置offset,返回读取到的字节个数length。
貌似是要实现这样一个过程,仅是个人猜测:eg:I wish the wish you wish.
int length = 0;
String s = "you";
bytes = s.toByteArray();
read(7, bytes, 2, length);
从I wish the wish you wish.从t到u一共移动了11个字符。运行完毕后length = 11。
原文档中提到This dos not change the current offset of a file, and is thread-safe.估计就是用length的增加取代offset的偏移,实现线程安全。仅是个人猜想read的一种实现及运行,原文档没有对构造传入的变量进行描述。
public void readFully(long positon, byte[] buffer) throws IOException;
public void readFully(long position, byte[] buffer, int offset, int length) throws IOException;
根据文档的描述,其实现的思路和 public int read(long position, byte[] buffer, int offset, int length)是一致的。
实现了以上两个接口的I/O类:
org.apache.hadoop.io.compress.CompressionInputStream
该类在compress包下。在Hadoop集群中,为了保障通讯、存储的效益和质量,压缩操作的读写过程中时时进行,不难猜测,compress包实现了对I/O的压缩与解压功能。
提到压缩,应从 org.apache.hadoop.io.compress.Compressor 开始分析。
interface Compressor 的方法模仿java.util.zip.Deflater而来。
通过实例化Deflater对象,可以对数据进行公有zip算法压缩。
public void justATry() {
try {
String inputString = "blahblahblah??";
byte[] input = inputString.getBytes("UTF-8");
// Compress the bytes
byte[] output = new byte[100];
Deflater compresser = new Deflater();
compresser.setInput(input);
compresser.finish();
int compressedDataLength = compresser.deflate(output);
System.out.println(output);
// Decompress the bytes
Inflater decompresser = new Inflater();
decompresser.setInput(output, 0, compressedDataLength);
byte[] result = new byte[100];
int resultLength = decompresser.inflate(result);
decompresser.end();
for (int i = 0; i < result.length; i++) {
System.out.println(result[i]);
}
// Decode the bytes into a String
String outputString = new String(result, 0, resultLength, "UTF-8");
System.out.println(outputString);
} catch (java.io.UnsupportedEncodingException ex) {
} catch (java.util.zip.DataFormatException ex) {
}
以上方法为Deflater对数据的压缩解压过程。不难分析:interface Compressor 应有类似的public void setInput(byte[] input);public void finish();public int deflate(byte[] output)方法。同理可得:org.apache.hadoop.io.compress.Decompressor 的解压方法。
因此,可以猜测CompressionInputStream 实现PositionedReadable、Seekable 将数据读入。CompressionOnputStream 实现Compressor 对读入的内容进行压缩,输出压缩后的内容。同时可以猜测压缩输出的框架机制。
相关推荐
### Hadoop源代码分析知识点详解 #### 一、Hadoop背景与关键技术介绍 Hadoop作为一项重要的开源项目,其设计理念深受Google三大论文的影响——Google File System (GFS)、MapReduce以及BigTable。Hadoop的核心组件...
### Hadoop源代码分析核心知识点解析 #### 一、Hadoop与Google技术栈的关系 Hadoop作为开源领域的重要成员,其设计理念深受Google三大核心技术——GFS(Google File System)、MapReduce以及BigTable的影响。...
### Hadoop源代码分析——输出流机制解析 #### 一、概述 本篇文章将深入剖析Hadoop中的输出流机制,具体来说,我们将关注Hadoop输出流的核心组件——`OutputStream`及其派生类`FSOutputStream`与`DFSOutputStream`...
### Hadoop源代码分析 #### 一、Hadoop与Google的核心技术 Hadoop是一个开源的分布式计算框架,其设计初衷是为了模拟Google所采用的核心技术。Google通过一系列文章介绍了自己的技术栈,包括分布式集群管理...
2. **构建Hadoop源码**:下载Hadoop源代码,使用maven或ant构建系统来编译并生成本地库。这通常会生成libhadoop.so库文件。 3. **设置环境变量**:将生成的库文件路径添加到系统的LD_LIBRARY_PATH中,以便Java能够...
“OpportunityChhattisgarh2015-master”这个压缩文件名可能表示这是该活动的主要资源或源代码库。参与者可能获得了相关的课程材料、示例代码、讲座幻灯片或其他参考资料,帮助他们在活动后继续学习和实践Java技术。...
4. **数据处理与分析**:项目可能涉及大数据处理,使用如Hadoop或Spark进行数据清洗、分析和可视化。 5. **实时数据流处理**:实时监控电力、煤气、水的使用情况可能需要Apache Kafka或Spark Streaming等工具。 6....
- **Hadoop核心组成介绍**:详述Hadoop的两大核心组件——HDFS和MapReduce的工作原理。 - **Hadoop集群结构**:分析Hadoop集群的架构设计,包括NameNode、DataNode的角色与职责。 - **Hadoop独立模式安装与测试**:...
标题中提到的“基于开源框架的推荐搜索BI系统”指的是利用开放源代码的软件框架来构建一个能够提供个性化推荐和搜索功能的商业智能系统。商业智能(BI)系统是企业用于分析业务数据,以支持决策制定的解决方案,其...
首先,我们看到一个名为"transfert-master"的压缩包文件,这可能是某个项目或库的源代码仓库,用于处理Java中的转移操作。"master"通常表示这是主分支,包含了项目的核心功能和最新稳定版本的代码。 在Java中,文件...
这个项目的源代码可能包含了多个模块,比如数据处理模块、数据分析模块、报表生成模块等。每个模块都可能由一系列Java类组成,它们通过面向对象的设计原则和模式,如单例模式、工厂模式等,构建出清晰、可维护的代码...
在“NetU-main”这个压缩包中,我们很可能会找到一系列关于Java编程的教程、项目源代码和练习资料,旨在帮助学习者全面掌握Java技术。 首先,Java的基础知识是学习的起点。Java的语法结构与C++类似,但更加强调简单...