1.5、FileFormats
1.5.1、FileFormat
对比:
1.5.1.1、Text File
每一行都是一条记录,每行都以换行符(\ n)结尾。数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。
缺点:
1、磁盘开销大
2、解析不方便,如JSON/Xml,比二进制格式解析更消耗资源
3、不具备类型和模式,如数值或者日期类型的数据,无法使用mr排序,需要转换为有模式的二进制文件。
1.5.1.2、SequenceFile
Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。每个Key-Value被看作是一条记录,支持三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩。
缺点:
1、不支持append操作,序列化后存储的kv数据不是按照key的某个顺序存储的。
2、需要合并文件,且合并后不方便查看
优点:
1、可切分
2、难度低,因为是Hadoop框架提供的API,所以业务侧修改比较简单。
1.5.1.3、RCFile
行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block,那么一个块上可能存在多个行组。其次,块数据列式存储,有利于数据压缩和快速的列存取。
一个行组包括三个部分。第一部分是行组头部的同步标识,主要用于分隔HDFS块中的两个连续行组;第二部分是行组的元数据头部,用 于存储行组单元的信息,包括行组中的记录数、每个列的字节数、列中每个域的字节数;第三部分是表格数据段,即实际的列存储数据。 在该部分中,同一列的所有域顺序存储。从图可以看出,首先存储了列A的所有域,然后存储列B的所有域等。
注意:
1、采用先水平划分、再垂直划分的思想。
2、RCFile对于重复的数据不会重复压缩,大大节约了存储空间。
3、RCFile默认的行组大小是4MB。
1.5.1.4、Avro Files
Avro是一个基于二进制数据传输高性能的中间件。在Hadoop的其他项目中例如HBase(Ref)和Hive(Ref)的Client端与服务端的数据传输 也采用了这个工具。Avro是一个数据序列化的系统。Avro 可以将数据结构或对象转化成便于存储或传输的格式。Avro设计之初就用来支 持数据密集型应用,适合于远程或本地大规模数据的存储和交换。
Avro的数据格式总是以易于处理的形式存储数据结构与数据。Avro可以在运行时使用这些定义以通用的方式向应用程序呈现数据,而不 是需要代码生成。
代码生成在Avro中是可选的。它在一些编程语言有时使用特定的数据结构,对应于经常序列化的数据类型是非常好用的。但是在像Pig和 Hive这样的脚本系统中,代码生成将是一种负担,所以Avro不需要它。
存储全部的数据结构定义和数据的另外一个优势是允许数据被更快更简洁的写入。Protocol Buffere 为数据添加注解,因此即使定义和数 据不完全匹配,数据仍有可能被处理。然而这些注释使得数据更大和更慢的被处理。Avro不需要这些注释,使得Avro数据比其他序列化 系统更小和更快地处理。
注意:不支持通过CTAS语法写入Avro文件,必须要先有Schema。
CREATE TABLE kst
PARTITIONED BY (ds string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.avro.AvroserDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
TBLPROPERTIES (
'avro.schema.url'='http://schema provider/kst.avsc');
-- hive9.14之后写法
CREATE TABLE kst (
string1 string,
string2 string,
int1 int,
boolean1 boolean,
long1 bigint,
float1 float,
double1 double,
inner_record1 struct<int in inner_recordl:int,string in inner recordl:string>,
enum1 string,
arrayl array<string>,
map1 map<string,string>,
union1 uniontype<float boolean ,string>,
fixed1 binary,
null1 void,
unionnullint int,
bytes1 binary)
PARTITIONED BY (ds string)
STORED AS AVRO;
1.5.1.5、ORC (Optimized Row Columnar) Files
高效的行列存储格式。使用ORC格式,在读写方面性能都会有很大的提升。在一定程度上扩展了RCFile,并进行了优化(主要在压缩编码、查询性能方面)。相对于RCFile格式,ORC好处如下:
1、单个文件作为每个任务的输出,降低了 NameNode 的负载
2、支持Hive类型中的 datetime, decimal和复杂类型(List,Map,Struct)
3、文件存储采用了轻量级索引(稀疏索引,默认是跳过10000行)。
4、基于数据类型的块模式压缩
5、使用独立的RecordReaders并发读取同一个文件
6、无需扫描标记就可以拆分文件
7、限制读取或写入所需的内存量
8、使用协议缓冲区存储的元数据,允许添加和删除字段
存储结构:
注意点:
1、Stripes默认大小是250MB.
2、File Footer包含这个文件的strips列表以及每个stripe中的行数和列类型。包含列级别的聚合计数,如sum/count/max/min
3、Stripe footer包含文件目录信息。
4、Index data包含每列的最大值和最小值。以及每列所在的行位置(还包括Bloom Filter和位字段)
三种指定文件类型
--1、参数指定
SET hive.default.fileformat=Orc;
--2、创建表时指定
CREATE TABLE ... STORED AS ORC
--3、修改表存储类型
ALTER TABLE ...[PARTITION partition_spec] SET FILEFORMAT ORC
1.5.1.6、Parquet
基于Dremel数据模型算法实现的,即“record shredding and assembly algorithm”,面向列的二进制文件格式,不能直接读取。Parquet对于大型查询的类型是高效的。对于扫描特定表格中的特定列的查询,Parquet特别有用。Parquet支持压缩Snappy,gzip;目前Snappy默认。
组件交互架构:
查询引擎:Hive,Impala,Pg,Presto,Drill,HAWQ
计算框架:MR,Spark,Crunch,Kite,Cascading
数据模型:Avro,Thrif,Protocol Buffers,POJOS
数据模型:
支持嵌套数据模型,每个模型的Schema(可以理解为树结构)包含多个字段,每个字段由可以包含多个字段,每个字段有三个属性:重复数、类型、字段名
1、重复数:required(出现1次),repeated(出现0次或多次),optional(出现0次或1次)
2、类型:group(复杂类型),primitive(基本类型)
Parquet文件格式:
parquet文件由一个文件头(header),紧随一个或多个文件块(block),以及一个结尾文件(footer)构成。
1、文件头header包括每个文件块存储一个行组,一个行组的大小通常是一个块的大小,这个一个mapper就可以处理一个行组,增大任务执行度。
2、行组由列块构成,每个列块存储一个列的数据。
3、每个列块中的数据以页为单位,页是最小为编码单位,不同页可能用不用的编码方式。
4、parquet文件存在三种不同页:数据页、字典页、索引页
4.1、数据页用来存储当前行组中该列的值
4.2、字典页存储该列值的编码字典,每个列块最多包含一个字典页
4.3、索引页存储当前行组下列的索引。
5、parquet文件格式对于谓词下推的优化方法在于对每个行组中的每个列块,在存储的时候都会去计算对应的统计信息,比如列块的最大值、最小值和空值个数,通过这些信息可以判断该行组是否需要扫描;同时也引入了布隆过滤器以及索引等优化手段。
Metadata文件格式:
文件首位是存储的Magic Code,用来校验是否为一个Parquet文件
和ORC对比
1、Parquet支持复杂嵌套结构
2、Parquet不支持ACID和update
3、两者压缩性能差不多
4、Parquet支持的查询引擎相对丰富些。orc和hive适配性高。
1.5.1.7、JSONFILE (Hive4.0.0+)
通过hive.default.fileformat 参数配置,默认使用的是Text file.