一、上次课回顾
二、压缩存储初识
三、常用压缩方式
四、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(压缩格式) | Tool | Algorithm | File execution(文件后缀名) |
---|---|---|---|
gzip | gzip | DEFALTE | .gz |
bzip2 | bzip2 | bzip2 | .bz2 |
LZO | lzop | LZO | .lzo |
Snappy | N/A | Snappy | .snappy |
测试压缩格式 - 常用压缩对比:
当前使用机型:阿里云机型配置:
PK哥配置:
- 8 core i7CPU
- 8GB memory
- 64 bit CentOS
- 1.4GB wikipedia corpus 2-gram text input
压缩格式-常用压缩格式对比(Compression Ratio)
此数据仅做参考:
No Compress(未压缩前数据大小) | Snappy | LZ4 | LZO | GZIP | BZIP2 |
---|---|---|---|---|---|
1403M | 701M | 693M | 684M | 447M | 390M |
小结:Snappy、LZ4、LZO的压缩比是50%左右,GZIP和BZIP2压缩比35%,压缩比越低,
eg:Julia.mp4 1.5G ,一个压缩到800M,一个是压缩到400M;
压缩的越小,耗费的时间就越长
压缩速度比:
Time | BZIP2 | GZIP | LZO | LZ4 | Snappy |
---|---|---|---|---|---|
Compress Time | 142 | 85 | 7.6 | 6.45 | 6.41 |
UnCompress Time | 62 | 21 | 11.1 | 2.36 | 19.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)的方式来之支持分片。
- 输入:如果要采用压缩,需要采用可分片的(Splitable)
- 中间:速度快的压缩
- 输出:分场景使用:作为归档使用:采用高压缩比;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、行式存储与列式存储
A | B | C | D |
---|---|---|---|
101 | 111 | 121 | 131 |
102 | 112 | 122 | 132 |
103 | 113 | 123 | 133 |
对于行式结构好处:所有数据都在一个框中,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检查是否支持压缩格式.