大数据实战第六课-压缩和存储

一、上次课回顾
二、压缩存储初识
三、常用压缩方式
四、hadoop2.6.0-cdh5.7.0配置使用
五、压缩在Hive中的使用
六、File Formats and Compression
七、总结

一、上次课回顾

https://blog.csdn.net/zhikanjiani/article/details/89284488

1、离线处理分析,使用的是MapReduce代码,不做过多要求,只要把流程跑通即可;后期使用Spark代码实现;要求:数据造出来,ETL流程跑出来。

2、ETL处理完后的数据存放在hdfs的目录上,使用了分区表,刷新分区就可以进行统计。

二、压缩存储初识

上次课使用MapReduce ===> ETL操作 ===> 数据存储HDFS (此时采用的还是普通的文本格式),没有任何的压缩和其它,这个操作在生产上市不行的。

案例1:一天生产上500T的数据,副本数是3,500T * 3 = 1500T的数据,所以在ETL ==Compression(压缩)=> HDFS的过程,可以添加压缩。

小结:
好处:压缩带来的第一个好处就是节省磁盘空间,提升磁盘利用率;
坏处:多了一步操作解压和压缩耗费CPU
在大数据中任何一种调优都不是万能的,一定要根据生产场景。

案例2:假设julia.mp4的大小是1.5G,现在我们把它拷贝到云盘或者移动硬盘,1.5G的视频压缩后还剩1.0G;压缩前和压缩后的视频上传云盘或移动硬盘;肯定是1.0G的上传快;
shuffle阶段的数据量

案例3:整体集群负载高,就不能使用压缩和解压。

常用压缩技术:

有损:
无损:生产上肯定选择是无损压缩。

压缩使用场景:
在这里插入图片描述
如上图中,哪几个场景中可以使用压缩,
1、输入端:Flume Sink HDFS < == Spark/MapReduce 节省集群的磁盘空间
2、temp:Sink DISK
3、输出端:Spark、MapReduce ==> Sink Hadoop

理论上来说如上三步都支持压缩:

三、常用压缩方式

使用hadoop checknative查看支持压缩方式
等待添加图片:

常用压缩方式:

Compression format(压缩格式)ToolAlgorithmFile execution(文件后缀名)
gzipgzipDEFALTE.gz
bzip2bzip2bzip2.bz2
LZOlzopLZO.lzo
SnappyN/ASnappy.snappy

测试压缩格式 - 常用压缩对比:

当前使用机型:阿里云机型配置:
PK哥配置:

  • 8 core i7CPU
  • 8GB memory
  • 64 bit CentOS
  • 1.4GB wikipedia corpus 2-gram text input

压缩格式-常用压缩格式对比(Compression Ratio)
此数据仅做参考:

No Compress(未压缩前数据大小)SnappyLZ4LZOGZIPBZIP2
1403M701M693M684M447M390M

小结:Snappy、LZ4、LZO的压缩比是50%左右,GZIP和BZIP2压缩比35%,压缩比越低,

eg:Julia.mp4 1.5G ,一个压缩到800M,一个是压缩到400M;
压缩的越小,耗费的时间就越长

压缩速度比:

TimeBZIP2GZIPLZOLZ4Snappy
Compress Time142857.66.456.41
UnCompress Time622111.12.3619.84

综合来看:压缩速度和压缩率肯定是成反比的,越省空间,耗费的时间更多;所以我们在选择压缩方式的话,选择LZO、LZ4、Snappy都可以。

重点:

压缩格式:
压缩比 VS 压缩速度综合考量
是否分片
在mapreduce处理过程中,一个text:200M ⇒ 2 InputSplit 128M + 72M
必然是 2个 MapTask

在我们所有的压缩格式中:
1)、在以上几种压缩格式中只有BZIP2支持分片;
2)、比如Snappy文件大小是1T,不管使用MapReduce/Spark只有1个Task来运行。
3)、LZO默认是不支持分片的,可以通过创建索引(Create Index)的方式来之支持分片。

在这里插入图片描述

  1. 输入:如果要采用压缩,需要采用可分片的(Splitable)
  2. 中间:速度快的压缩
  3. 输出:分场景使用:作为归档使用:采用高压缩比;reduce的作业输出作为下一个作业的输入:需要考虑分片(不然接下来的作业都是一个分片来处理这样是不行的)

四、hadoop配置使用

进入到这个目录:/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop

1、编辑core-site.xml
进入到hadoop.apache.org找到core-default.xml找到io.compression.codecs这个参数
配置如下:

<property>
                <name>io.compression.codecs</name>
                <value>org.apache.hadoop.io.compress.GzipCodec,
                org.apache.hadoop.io.compress.DefaultCodec,
                org.apache.hadoop.io.compress.BZip2Codec,</value>
        </property>

2、编辑mapred-site.xml
进入到mapred-default.xml中,找到mapreduce.output.fileoutputformat.compress,mapreduce.output.fileoutputformat.compress.codec参数进行配置;注意output与map的区别:一个是map端输出,另一个是最终输出端的。
在这里插入图片描述

<property>
                <name>mapreduce.output.fileoutputformat.compress</name>
                <value>true</value>
        </property>
        <property>
                <name>mapreduce.output.fileoutputformat.compress.codec</name>
                <value>org.apache.hadoop.io.compress.BZip2Codec</value>
        </property>

重启集群,等待安全模式关闭才能使用。

3、此时准备好数据:
在hdfs上创建目录把wordcount数据提交上去:

1、hdfs上创建目录:
hdfs dfs -mkdir -p /wordcount/input
hdfs dfs -put /home/hadoop/data/ruozeinput.txt

2、运行一个WordCount:
进入到这个目录:cd /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce
使用如下命令跑一个MapReduce:hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /wordcount/input/ruozeinput.txt /wordcount/output1

3、如下所示是生效的:输出文件是.bz2证明是成功的
在这里插入图片描述

遇到的问题:

1、运行这个wordcount出现报错:
19/08/06 13:40:23 INFO mapreduce.Job: The url to track the job: http://hadoop:8088/proxy/application_1565070010993_0001/
19/08/06 13:40:23 INFO mapreduce.Job: Running job: job_1565070010993_0001
19/08/06 13:40:30 INFO mapreduce.Job: Job job_1565070010993_0001 running in uber mode : false
19/08/06 13:40:30 INFO mapreduce.Job:  map 0% reduce 0%
19/08/06 13:40:31 INFO mapreduce.Job: Task Id : attempt_1565070010993_0001_m_000000_0, Status : FAILED
Container launch failed for container_1565070010993_0001_01_000002 : org.apache.hadoop.yarn.exceptions.InvalidAuxServiceException: The auxService:mapreduce_shuffle does not exist
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl.instantiateException(SerializedExceptionPBImpl.java:168)
        at org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl.deSerialize(SerializedExceptionPBImpl.java:106)
        at org.apache.hadoop.mapreduce.v2.app.launcher.ContainerLauncherImpl$Container.launch(ContainerLauncherImpl.java:159)
        at org.apache.hadoop.mapreduce.v2.app.launcher.ContainerLauncherImpl$EventProcessor.run(ContainerLauncherImpl.java:379)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)

------------------------------------------------------------------------------------------------------------

2、解决:在yarn-site.xml中进行如下配置
<property>

      <name>yarn.nodemanager.aux-services</name>

      <value>mapreduce_shuffle</value>

</property>


3、重新启动集群即可解决。

4、查看.bz2结尾的输出文件能否被读取
[hadoop@hadoop hadoop]$ hdfs dfs -text /wordcount/output1/part-r-00000.bz2
19/08/06 13:48:47 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
19/08/06 13:48:47 INFO compress.CodecPool: Got brand-new decompressor [.bz2]
hello   3
john    1
world   2


解释:从这个工厂去加载bzip2.Bzip2Factory,能够成功加载出来,所以这个hadoop作业是okay的。

小结:压不压缩对于用户而言是无感知的。

五、压缩在Hive中的使用

Hive启动过后创建数据库、创建表:

1、创建表
hive (g6_hadoop)> create table page_views(
> track_time string,
> url string,
> session_id string,
> referer string,
> ip string,
> end_user_id string,
> city_id string
> )
> row format delimited fields terminated by ‘\t’;
OK

2、从本地准备好一个10M左右的数据加载至hive供测试
load data local inpath ‘/home/hadoop/data/page_views’ overwrite into table page_views;

到hdfs目录上去查看该文件大小,使用命令如下:
hdfs dfs -du -s -h /user/hive/warehouse/g6_hadoop.db/page_views

3、设置hive的压缩方式
3.1、查看hive默认支持的压缩格式:因为我们在4中配置了core-site.xml,所以默认出现的就是BZip2Codec.

hive (g6_hadoop)> set mapreduce.output.fileoutputformat.compress.codec;
mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec

3.2、
create table page_views_bzip2 as select * from page_views;

3.3、查看文件大小:
hdfs dfs -du -s -h /user/hive/warehouse/g6_hadoop.db/page_views_bzip2;

六、File Format and Compression

6.1、在hive创建表的时候还有一个:Stored as file_format
File_format包含哪些东西呢,默认的是textfile;
有如下这些形式:

file_format:
  : SEQUENCEFILE
  | TEXTFILE    -- (Default, depending on hive.default.fileformat configuration)			//默认
  | RCFILE      -- (Note: Available in Hive 0.6.0 and later)
  | ORC         -- (Note: Available in Hive 0.11.0 and later)
  | PARQUET     -- (Note: Available in Hive 0.13.0 and later)

执行这个参数作验证:
hive (g6_hadoop)> set hive.default.fileformat;
hive.default.fileformat=TextFile

6.2、行式存储与列式存储

ABCD
101111121131
102112122132
103113123133

在这里插入图片描述

对于行式结构好处:所有数据都在一个框中,select * 很快;缺点:比如select A,C from ,行式存储也会整表读取。

对于列式存储:
好处:比如我们: select A,C from XXX;可以直接读取对应的列;
缺点:select * from ,首先会发生一个数据重组、拼接,再去读取所有

生产中99%都是采用列式存储的.

6.3: SEQUENCEFILE:序列化 <key,value>

创建表:
hive (g6_hadoop)> create table page_views_seq(
> track_time string,
> url string,
> session_id string,
> referer string,
> ip string,
> end_user_id string,
> city_id string
> )
> row format delimited fields terminated by ‘\t’ stored as sequencefile;

加载数据:load data local inpath ‘/home/hadoop/data/page_views’ into table page_views_seq;

直接加载进去会报错:导入失败的错误:failed with exception wrong file format.please check the file’s format. 检查文件格式
文本格式的数据导入到sequenceFile是导入不进去的;

借助于insert
insert into table page_views_seq select * from page_views;

查看sequenceFile的大小
[hadoop@hadoop data]$ hdfs dfs -du -s -h /user/hive/warehouse/g6_hadoop.db/page_views_seq
11.41 M 11.41 M /user/hive/warehouse/g6_hadoop.db/page_views_seq

sequenceFile比原表大10%,生产上不用这种方式。
为什么会多出来10%???

这个压缩方式要记录key、value,不用这种方式

6.4 RCFILE(简单了解,不做要求)
是一个行列混合的存储,性能很低.

还是接上面的表,四列A、B、C、D;存到组里,把一列变为一行存储到一起了

RCFILE测试出来9.8M:

[hadoop@hadoop hive-1.1.0-cdh5.7.0]$ hdfs dfs -du -s -h /user/hive/warehouse/g6_hadoop.db/page_views_rcfile
9.8 M  9.8 M  /user/hive/warehouse/g6_hadoop.db/page_views_rcfile

RCFILE对于查询来讲没有区别,仅仅是存储上节省了约10%的空间。

重点*****:ORC Files

index data包含了列的最大和最小值,一些信息是在头部存储的,一个文件有两个stripe时,比如第一个id 是<100;第二个是id >100;发出一个请求,id <100只会去读第一个。
在这里插入图片描述

ORC FIle进行测试:

1、hive (g6_hadoop)> create table page_views_orc(track_time string, url string, session_id string,referer string,ip string,end_user_id string,city_id string)row format delimited fields terminated by '\t' stored as orc;

2、hive (g6_hadoop)> insert into table page_views_orc select * from page_views;

3、[hadoop@hadoop hive-1.1.0-cdh5.7.0]$ hdfs dfs -du -s -h /user/hive/warehouse/g6_hadoop.db/page_views_orc
6.6 K  6.6 K  /user/hive/warehouse/g6_hadoop.db/page_views_orc			//????

---------------------------------------------------------------------------------------------
重新测试:
1、创建表:
 create table page_views_orc_none(track_time string, url string, session_id string,referer string,ip string,end_user_id string,city_id string)row format delimited fields terminated by '\t' stored as orc tblproperties ("orc.compress"="NONE");

2、insert into table page_views_orc_none select * from page_views;

3、查看大小是126k,????

---------------------------------------------------------------------------------------------------

1、create table page_views_orc_none1 stored as orc tblproperties ("orc.compress"="NONE") as select * from page_views;

查看大小是126k,????

PK哥演示时18.1M,不压缩是7.7M,采用zlib压缩2.8M,压缩比很高;我的问题待解决。

Parquet File:

在生产上orc和parquet半斤八两
Parquet时设置压缩又不一样

1、设置压缩格式为gzip
set parquet.compression=gzip;

2、设置压缩格式:
hive (g6_hadoop)> set parquet.compression=gzip;
hive (g6_hadoop)> set parquet.compression;
parquet.compression=gzip

3、创建表
create table page_views_parquet_gzip stored as parquet as select * from page_views;

七、总结

不能单单从存储的角度,还要从查询的角度看;普通的表会全表扫描;
测试RCFILE、ORCFILE、

测试性能要通过两个角度:存储和性能。

八、写在结尾

前置要求:自定义编译能支持压缩的hadoop版本,此处参考博客:https://blog.csdn.net/qq_32641659/article/details/89074365,
注意:Centos6.X版本,建议直接购买阿里云服务器进行编译,且看清楚32位、64位版本号,不然系统位数与软件不匹配会报错;
我是严格按照永夜的博客来编译的,第一次就把4 5可选的操作进行了;但还是编译失败如下图,再次执行,才显示编译成功。
在这里插入图片描述
在这里插入图片描述
看到如下这张图才说明前置要求准备好了。
老子环境搭了好久:hadoop checknative检查是否支持压缩格式.
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值