HDFS设计:
以流式数据访问模式来存储超大文件,“一次写入,多次读取”;
HDFS为高数据吞吐量应用优化的,低延迟的方位需求应选择HBase;
文件系统的元数据存储在namenode的内存中,所能存储的文件总数受限于内存容量;
HDFS的块(block)默认为64M(块大的目的为了最小化寻址开销,从磁盘传输时间可明显大于定位时间),以块存储而非文件可简化存储系统的设计
HDFS只是Hadoop文件系统的一个实现,在org.apache.hadoop包的fs以及hdfs子包中包含了多种其他文件系统
使用Java API操作Hadoop文件包括文件与目录的操作,创建、删除、读取、写入等。
数据流:
1. 文件读取剖析
2. 文件写入剖析
Hadoop IO:
1. 数据完整性:对写入的所有数据计算校验和并在读取数据是验证校验和。(LocalFileSystem,RawLocalFileSystem,ChecksumFileSystem)
2.压缩:减少存储文件磁盘空间+加速数据在网络和磁盘上的传输。
Hadoop中CompressionCodec接口的实现代表一个codec(压缩-解压缩算法),如DEFKATE,Gzip,bzip2(支持切分)以及LZO,需要在时间和空间取平衡。而压缩算法是否支持切分对于mapreduce处理非常重要,如1GB的压缩文件,分16个数据块存放,若压缩算法不支持切分,则map任务独立于其他任务进行数据读取是行不通的。[CompressionCodecFactory,,CodecPool]
conf.setBoolean("mapred.output.compress", true);
conf.setCalss("mapred.output.compress.codec",GzipCodec.class, CompressionCodec.class);
// mapred.output.compress.type=BLOCK(默认为RECORD)
3. 序列化:将结构化对象转化为字节流,以便在网络上传输或写道磁盘永久存储。
Hadoop中,系统结点上进行间的通信通过RPC实现的,其将消息序列化成二进制流后发送给远程结点,远程节点将二进制流反序列化成员是消息。Writable接口定义了write(DataOutput)和readFields(DataInput)两个方法;WritableComparable接口继承至Writable和Comparable接口,MapReduce中的key均需要实现该接口;
Writable类:org.apache.hadoop.io中,包括Java基本类型的Writable封装器(如Text,NullWritable,ObjectWritable)以及集合类(ArrayWritable,TwoDArrayWritable,MapWritable,SortedMapWritable)
Apache Avro是独立于变成语言的数据序列化系统,旨在解决Writable类型的不足:缺乏语言的可以执行。
4. 基于文件的数据结构:SequenceFile + MapFile(排好序的SequenceFile,已加入用于搜索间的索引)