大数据杂谈 - TextFile&ORC Block Split

本篇目的:对比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 )

你可能感兴趣的:(大数据之禅,hdfs,spark,mapreduce)