这里建议hadoop hive mysql都启动正常
- 模拟大数据 重新一个个压缩形式大小进行测试
- 下面比较乱 可能看不懂 先总结说明一下最终成功版本
- 重命名为job.dat
- 默认格式 textfile
- 数据准备
- 开始测试
- 看文件大小(du及count(1)形式)
- 下面仅介绍 没有自己动手安
这里建议hadoop hive mysql都启动正常
这篇一定要跟前面接起来下图所示处
本来配置环境变量直接 hive 就能启动 出现了毛病用下面方法启动(先启动hadoop)
参考地址
下面这样是会报错 的换方式
这样来做
命令hdfs dfs -du -h /data
结果102.3 M 307.0 M /data/
第一列标示该目录下总文件大小
第二列标示该目录下所有文件在集群上的总存储大小和你的副本数相关,我的副本数是3,所以第二列的是第一列的三倍(第二列内容=文件大小副本数)
第三列标示你查询的目录
textfile SequenceFile这两个格式进10倍差距
对应apache项目地址
用第二种建表
执行下面报错 建表 ZLIB要大写 上面是小写
好像建表 ZLIB要大写 上面是小写 先删除表 在新建
这次成功
这里注意这里按道理是压缩的越来越少的 但是这里有点问题
参考地址
parquet 简介
Parquet 如何与组件协作
数据从内存到 Parquet 文件或者反过来的过程主要由以下三个部分组成:
- 存储格式 (storage format) parquet-format项目定义了 Parquet 内部的数据类型、存储格式等。
- 对象模型转换器 (object model converters) 这部分功能由parquet-mr项目来实现,主要完成外部对象模型与 Parquet 内部数据类型的映射。
- 对象模型 (object models) 对象模型可以简单理解为内存中的数据表示,Avro, Thrift, Protocol Buffers, Hive SerDe, Pig Tuple, Spark SQL InternalRow 等这些都是对象模型。Parquet 也提供了一个example object model 帮助大 家理解。
例如parquet-mr项目里的 parquet-pig 项目就是负责把内存中的 Pig Tuple 序列化并按列存储成 Parquet 格式,以及反过来把 Parquet 文件的数据反序列化成 Pig Tuple。
这里需要注意的是 Avro, Thrift, Protocol Buffers 都有他们自己的存储格式,但是 Parquet 并没有使用 他们,而是使用了自己在parquet-format项目里定义的存储格式。所以如果你的应用使用了 Avro 等对 象模型,这些数据序列化到磁盘还是使用的parquet-mr定义的转换器把他们转换成 Parquet 自己的存 储格式。
Parquet 数据模型
理解 Parquet 首先要理解这个列存储格式的数据模型。我们以一个下面这样的 schema 和数据为例来 说明这个问题。
这个 schema 中每条记录表示一个人的 AddressBook。
有且只有一个 owner,
owner 可以有 0 个或者多个 ownerPhoneNumbers,
owner 可以有 0 个或者多个 contacts。
每个 contact 有且只有一个 name,
这个 contact 的 phoneNumber 可有可无。
Parquet 文件在磁盘上的分布
所有的数据被水平切分成 Row group,
一个 Row group 包含这个 Row group 对应的区间内的所有列的 column chunk。
一个 column chunk 负责存储某一列的数据,这些数据是这一列的 Repetition levels,
Definition levels 和 values(详见后文)。
一个 column chunk 是由 Page 组成的,Page 是压缩和编码的单元,对数据模型来说是透明的。
Row group 是数据读写时候的缓存单元,所以推荐设置较大的 Row group 从而带来较大的并行度,当然 也需要较大的内存空间作为代价。
一般情况下推荐配置一个 Row group 大小 1G,一个 HDFS 块大小 1G,一个 HDFS 文件只含有一个
块。
一个 Parquet 文件最后是 Footer,存储了文件的元数据信息和统计信息。
数据测试 语法格式
上面这块是没有经过压缩的 下面来个对应压缩版
模拟大数据 重新一个个压缩形式大小进行测试
下面比较乱 可能看不懂 先总结说明一下最终成功版本
# 概要说明 首先我从数据库导出了一个数据比较多的表city.txt 并且上传到~/data下 (当然数据你也可以自己定义去)
#其数据字段及其内容为(tab键分割)
#ID Name CountryCode District Population
#"1" "Kabul" "AFG" "Kabol" "1780000"
#(注意 下面一直追加 却还是188k没变化 所以建议 在本机的时候把city.txt里内容多复制几次,最好好几兆 然后再上传上来,或者通过load形式(去掉覆盖)这里采用的load形式)
create table hive_city(id string,name string,countrycode string,district string,population string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
stored as textfile;
#load多次
load data local inpath '/home/hadoop/data/city.txt' into table hive_city;
================textfile 最原始的数据 下面都可以复制他表中的数据======================
#like表 这张表才是load多次后的数据都在这表里头 所以后面都以此表为模板复制其数据
create table like as select * from hive_city;
===============sequencefile===================
create table test_city(id string,name string,countrycode string,district string,population string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
stored as sequencefile;
insert into table test_city select * from like;
===============rcfile===================
create table test_city_rc(id string,name string,countrycode string,district string,population string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
stored as rcfile;
insert into table test_city_rc select * from like;
===============orcfile===================
create table test_city_orc(id string,name string,countrycode string,district string,population string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
stored as orc tblproperties("orc.compress"="NONE");
insert into table test_city_orc select * from like;
===============parquet===================
create table test_city_parquet(id string,name string,countrycode string,district string,population string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
stored as parquet;
insert into table test_city_parquet select * from like;
===============parquet-gzip压缩版的===================
set parquet.compress=GZIP;
create table test_city_parquet_gz(id string,name string,countrycode string,district string,population string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
stored as parquet;
insert into table test_city_parquet_gz select * from like;
====文件大小比较 textfile>sequencefile>rcfile>orcfile>parquet>parquet-gzip======
[hadoop@hadoop000 data]$ hadoop fs -du -h /user/hive/warehouse/like
290.8 K 290.8 K /user/hive/warehouse/like/000000_0.bz2
[hadoop@hadoop000 data]$ hadoop fs -du -h /user/hive/warehouse/test_city
5.3 M 5.3 M /user/hive/warehouse/test_city/000000_0
[hadoop@hadoop000 data]$ hadoop fs -du -h /user/hive/warehouse/test_city_rc
206.6 K 206.6 K /user/hive/warehouse/test_city_rc/000000_0
[hadoop@hadoop000 data]$ hadoop fs -du -h /user/hive/warehouse/test_city_orc
627.6 K 627.6 K /user/hive/warehouse/test_city_orc/000000_0
[hadoop@hadoop000 data]$ hadoop fs -du -h /user/hive/warehouse/test_city_parquet
107.3 K 107.3 K /user/hive/warehouse/test_city_parquet/000000_0
[hadoop@hadoop000 data]$ hadoop fs -du -h /user/hive/warehouse/test_city_parquet_gz
107.3 K 107.3 K /user/hive/warehouse/test_city_parquet_gz/000000_0
接下来我们把data下我们之前编写的job.txt下载到本地(或者本地新建(job.data)到时候上传到data下一样) 疯狂复制 模拟大量数据
重命名为job.data 并上传到 ~/data
重命名为job.dat
默认格式 textfile
按道理没问题啊 但是下面操作RCFfile等的时候却出了问题 这块内容作废 重新来
数据准备
我从数据库导出city(因为这里数据多 注意数据结构建表的时候字段–属性要对应好)
然后把city.txt上传到~/data下
(注意 下面一直追加 却还是188k没变化 所以建议 在本机的时候把city.txt里内容多复制几次,最好好几兆 然后再上传上来)
多追加几次 模拟大数据 但是下面追加没效果
可以通过下面建好表后这种方式追加也可以
load data local inpath ‘/home/hadoop/data/city.txt’ into table hive_city;
开始测试
注意字段的关联上 下面id 是string 不是int类型
删表从来
看文件大小(du及count(1)形式)
Parquet 文件的存储格式
下面仅介绍 没有自己动手安
下载个工具 下载安装snappy库 参考网址下载网址 按下面往里点
Hive中常用的数据压缩snappy