文章目录
压缩的场景
这张图大概说了日志文件采集到hdfs,经过处理引擎,通过各个维度统计分析操作,输出到db的流程。
这里关于压缩和解压的步骤有:
压缩:数据采集,数据处理后
解压:hdfs到处理引擎
为什么压缩
压缩带来好处:减小网络传输,节省存储空间
缺点:耗cpu
压缩支持切片?
如果压缩文件不支持split,那么就只能以一个map task处理。注意这里的split只是争对计算而言。存储是可以切分的。
Lzo压缩如果有一个index文件,记录从哪里拆开。所以也是可以分片的。
常用压缩方式对比
这是常用压缩和其文件的后缀
Lzo压缩会多生成一个index文件,记录从哪里拆开
压缩前后大小对比
压缩比差不多都是0.5
压缩解压的耗时对比
压缩越小,往往时间越长。这是需要根据场景选择合适的压缩方式。
压缩依赖的包
如何选择压缩方式?
这是一张计算过程中的压缩和解压缩
第一阶段就是采集数据到hdfs,因为为了后面的map,这里选择可分片的压缩或者使用可分片的文件结构。
第二阶段是map阶段,要求压缩速度快,便于紧跟reduce。
第三阶段是reduce阶段之后,如果输出的数据是作为下个作业的输入,就要考虑分片。如果是归档(存储),就考虑高压缩比。
查看hadoop支持的压缩方式
当集群启动的时候,会首先进入安全模式。当系统处于安全模式时会检查数据块的完整性。这时,不允许客户端进行任何修改文件的操作,包括上传文件,删除文件,重命名,创建文件夹等操作。
都是false是因为没有编译,编译方法请见另一篇博客。
[hadoop@hadoop000 bin]$ hadoop checknative
18/11/30 09:31:50 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Native library checking:
hadoop: false
zlib: false
snappy: false
lz4: false
bzip2: false
openssl: false
也可以通过复制编译好的native文件。
native路径
/home/hadoop/app/hadoop-2.6.0-cdh5.7.0/lib/native
解决后:
[hadoop@hadoop000 hadoop-2.6.0-cdh5.7.0]$ hadoop checknative
18/12/02 18:12:04 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
18/12/02 18:12:04 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop: true /home/hadoop/app/hadoop-2.6.0-cdh5.7.0/lib/native/libhadoop.so.1.0.0
zlib: true /lib64/libz.so.1
snappy: true /usr/lib64/libsnappy.so.1
lz4: true revision:99
bzip2: true /lib64/libbz2.so.1
openssl: true /usr/lib64/libcrypto.so
配置hadoop的压缩方式
core-site.xml添加
想要集群支持的codec都配进来
<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>
mapred-site.xml添加
true是启用压缩,第二个是具体使用哪个,这个对应上文的第三阶段。
<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>
hive的压缩设置
先建个表
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'
传个数据
load data local inpath '/home/hadoop/data/page_views.dat' overwrite into table page_views;
大小
[hadoop@hadoop000 data]$ hdfs dfs -ls /user/hive/warehouse/page_views
Found 1 items
-rwxr-xr-x 1 hadoop supergroup 19014993 2018-12-02 18:40 /user/hive/warehouse/page_views/page_views.dat
[hadoop@hadoop000 data]$ hdfs dfs -du /user/hive/warehouse/page_views
19014993 19014993 /user/hive/warehouse/page_views/page_views.dat
[hadoop@hadoop000 data]$ hdfs dfs -du -h /user/hive/warehouse/page_views
18.1 M 18.1 M /user/hive/warehouse/page_views/page_views.dat
启用压缩
hive (default)> set hive.exec.compress.output;
hive.exec.compress.output=false
hive (default)> set hive.exec.compress.output=true;
查看默认的压缩方式并设置
hive (default)> set mapreduce.output.fileoutputformat.compress.codec;
hive (default)> set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec;
建表2
create table page_views_bzip2
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
as select * from page_views;
显著的结果
[hadoop@hadoop000 data]$ hdfs dfs -du -h /user/hive/warehouse
18.1 M 18.1 M /user/hive/warehouse/page_views
3.6 M 3.6 M /user/hive/warehouse/page_views_bzip2