本篇目的:对比TextFile 与ORC 格式在不同引擎下Block是否可切分
TextFile
普通行式存储表,没有花里胡哨东西,压缩算法一般搭配LZO
一般LZO压缩后的文件无法拆分,需建立索引,拆分block,提高并行度
索引建立方式:
hadoop jar $HADOOP_LZO com.hadoop.compression.lzo.DistributedLzoIndexer hdfs_lzo_path
建完索引后,LZO文件就可拆分,MR读取LZO数据时,在Map端会按索引对LZO文件进行分拆,具体测试如下:
######################## 原始组 ###############################
对照组 -A 原始表:gdm.gdm_m14_glb_wireless_online_log
文件格式:TextFile
压缩算法:LZO
测试分区:2020-06-16
测试数据大小:6.1G
索引:无
测试SQL: select count(1) as nums from tmp.gdm_m14_glb_wireless_online_log_test where dt = ‘2020-06-16’
执行MR Map数:mappers: 8; number of reducers: 1 1min
增加参数:set mapred.max.split.size=16777216;
测试SQL: select count(1) as nums from gdm.gdm_m14_glb_wireless_online_log_test where dt = ‘2020-06-16’
执行MR Map数:mappers: 8; number of reducers: 1 1min
Spark引擎,增加参数:set spark.sql.files.maxPartitionBytes=16777216;
测试SQL: select count(1) as nums from gdm.gdm_m14_glb_wireless_online_log_test where dt = ‘2020-06-16’
执行Stage task数:0/8 (8 running)
######################## 测试组 ###############################
测试表:tmp.gdm_m14_glb_wireless_online_log_test
测试分区:2020-06-16
测试数据大小:6.1G
测试LZO文件数量:8个
测试LZO Index数量:8个,即对每个.LZO文件建立索引
测试SQL: select count(1) as nums from tmp.gdm_m14_glb_wireless_online_log_test where dt = ‘2020-06-16’
执行MR Map数:number of mappers: 54; number of reducers: 1
增加参数:set mapred.max.split.size=16777216;
测试SQL: select count(1) as nums from tmp.gdm_m14_glb_wireless_online_log_test where dt = ‘2020-06-16’
执行MR Map数:mappers: 8; number of reducers: 1 1min
Spark引擎,增加参数:set spark.sql.files.maxPartitionBytes=16777216;
测试SQL: select count(1) as nums from tmp.gdm_m14_glb_wireless_online_log_test where dt = ‘2020-06-16’
执行Stage task数:0/8 (8 running)
结论:
1. TEXTFile文件采用LZO算法压缩后,block本身并不具备切分能力。在MR中,Map数量取决于LZO文件数量
2. 如果对LZO文件建立索引,索引会将LZO文件进行拆分,增加Map数,提升MR性能
3. 通过改变Map端Block最大切分策略或Spark-Sql读取文件时打包到单个分区中的最大字节数,并不能影响LZO对Block的切分,即LZO只受索引影响
PS: 索引文件会告诉LzoTextInputFormat的getSplits函数如何将LZO文件拆分为可以并行解压缩和处理的拆分
LZO如何建议索引,及后续Block依据索引拆分数据得详细看源码,暂时没找到相关资料
ORCFile
ORC篇
对比ORC+Snappy 和TextFile + LZO 在MR下Map端数的变化(即Block块的拆分)
测试表-B:dev.gdm_m14_glb_wireless_online_log_test
文件格式:ORC
测试SQL: select count(1) as nums from dev.gdm_m14_glb_wireless_online_log_test where dt = ‘2020-06-16’
执行MR Map数:mappers: 33; number of reducers: 1 1min
增加参数:set mapred.max.split.size=16777216;
执行MR Map数:mappers: 295; number of reducers: 1 1min
Spark引擎,增加参数:set spark.sql.files.maxPartitionBytes=16777216;
测试SQL: select count(1) as nums from B:dev.gdm_m14_glb_wireless_online_log_test where dt = ‘2020-06-16’
执行Stage task数:74/301
结论:
1. ORC格式,Map Block 可拆分,可通过 mapred.max.split.size 改变Map数,变相提升MR并行度
2. ORC格式 可以通过改变Spark-Sql读取文件时打包到单个分区中的最大字节数,,以此增加当前Stage Task的并行度,提高Spark任务性能(即,改变 spark.sql.files.maxPartitionBytes )