一、Hadoop常用数据模型(文件存储格式)
1、Text:文本文件通常采用CSV、JSON等固度长度的纯文本格式
优点:
(1)便于与其他应用程序(生成或读取分隔文件)或脚本进行数据交换
(2)易读性好,便于理解
缺点:
(1)数据存储量非常庞大
(2)查询效率不高
(3)不支持块压缩
2、SequenceFile:
(1)SequenceFile按行存储二进制键值对数据,HDFS自带
1)二进制文件直接将<Key,Value>序列化到文件中
2)常用于在MapReduce作业之间传输数据
3)可用作Hadoop中小文件的打包存档(小文件合并)
4)即使在压缩数据时也支持分割、
(2)键值对类型
SequenceFile中的Key和Value可以是任意类型的Writable(org.apache.hadoop.io.Writable)
(3)Java API
org.apache.hadoop.io.SequenceFile
(4)存储结构
记录结构
块结构
0
ps:记录的内部结构取决于是否启用压缩。如果已经启用压缩,则取决于是记录压缩还是数据块压缩
(5)压缩
记录级(RECORD)
块级(BLOCK):一次压缩多条记录,利用记录间的相似性进行压缩,效率更高
(6)读写操作
SequenceFile.Writer (指定为块压缩)
SequenceFile.Reader(读取时能够自动解压)
(7)查看文件内容
hdfs dfs -text myseqfile.seq
(8)在Hive中使用SequenceFile
//1.方式一
STORED AS sequencefile
//2.方式二显示指定
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.SequenceFileInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat'
3、Avro:Apache Avro是一个数据序列化系统,出自Hadoop之父Doug Cutting
(1)Avro File:以JSON格式存储数据定义(Schema),以二进制格式存储数据
(2)特点
1)丰富的数据结构
2)快速可压缩的二进制数据格式
3)容器文件用于持久化数据
4)自带远程过程调用RPC
5)动态语言可以方便地处理Avro数据
(3)基本数据类型
null, boolean, int, long, float, double, bytes, string
(4)复杂数据类型
record、enum、array、map、union、fixed
(5)avro-tools应用
准备工作:user.json 、user.avsc 、avro-tools-1.8.2、 avro-tools-1.8.2.jar
//user.json
{"name": "Alyssa", "favorite_number": 256, "favorite_color": "black"}
{"name": "Ben", "favorite_number": 7, "favorite_color": "red"}
{"name": "Charlie", "favorite_number": 12, "favorite_color": "blue"}
//user.avsc定义了User对象的Schema
{
"namespace": "example.avro",
"type": "record",
"name": "User",
"fields": [
{"name": "name", "type": "string"},
{"name": "favorite_number", "type": "int"},
{"name": "favorite_color", "type": "string"}
]}
1)使用schema+data生成avro文件
java -jar avro-tools-1.8.2.jar fromjson --schema-file user.avsc user.json > user.avro
java -jar avro-tools-1.8.2.jar fromjson --codec snappy --schema-file user.avsc user.json > user.avro
2)avro转json
java -jar avro-tools-1.8.2.jar tojson user.avro
java -jar avro-tools-1.8.2.jar tojson user.avro --pretty
3)获取avro元数据
java -jar avro-tools-1.8.2.jar getmeta user.avro
(6)Avro文件存储结构
(7)在Hive中使用Avro
create table CUSTOMERS
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.literal'='{
"name": "customer", "type": "record",
"fields": [
{"name":"firstName", "type":"string"}, {"name":"lastName", "type":"string"},
{"name":"age", "type":"int"}, {"name":"salary", "type":"double"},
{"name":"department", "type":"string"}, {"name":"title", "type":"string"},
{"name": "address", "type": "string"}]}');
create external table user_avro_ext(
name string,
favorite_number int,
favorite_color string)
stored as avro location '/tmp/avro';
4、Parquet
(1)Apache Parquet是Hadoop生态系统中任何项目都可用的列式存储格式,由Twitter和Cloudera合作开发
Parquet格式是Spark SQL默认数据源
(2)列式存储优点
1)按需读取列
2)压缩编码可以降低磁盘存储空间
(3)Parquet文件结构
1)行组Row Group
2)列块Column Chunk
3)页Page
ps:按照行将数据物理上划分为多个组,每一个行组包含一定的行数,通常行组大小等于HDFS块大小
(4)Parquet Schema
(5)Parquet Java API
ParquetWriter、ParquetReader
5、RC & ORC
(1)RC(Record Columnar)由Facebook开源
1)存储行集合,并在集合中以列格式存储行数据
2)引入轻量级索引,允许跳过不相关的行块
3)可分割:允许并行处理行集合
4)可压缩
(2)ORC(Optimized Row Columnar)
RC优化版
(2)RCFile存储结构
1)集行存储与列存储的优点于一身
2)设计思想与Parquet类似,先按行水平切割为多个行组,再对每个行组内的数据按列存储
(3)ORCFile存储结构
1)Stripe
每个ORC文件首先会被横向切分成多个Stripe
每个stripe默认的大小是250MB
每个stripe由多组(Row Groups)行数据组成
2)IndexData
保存了该stripe上数据的位置,总行数
3)RowData
以stream的形式保存数据
4)Stripe Footer
包含该stripe统计结果:Max,Min,count等信息
5)FileFooter
该表的统计结果
各个Stripe的位置信息
6)Postscript
该表的行数,压缩参数,压缩大小,列等信息
(4)Java读写ORCFile
1)TypeDescription
2)VectorizedRowBatch
3)BytesColumnVector
4)LongColumnVector
5)Writer & Reader
(5)在Hive中使用ORCFile存储格式
方法一:
create external table user_orc_ext(
name string,
age int
)
stored as orc
location '/tmp/users/orc'
方法二:
文件存储格式比较