【Spark2运算效率】第五节 影响生产集群运算效率的原因之小文件
前言
关于小文件的治理方案颇多,可以回归到hdfs底层的block层面看待治理问题。,首先可以通过查询命令(hadoop dfs -count 路径)来查看路径目录下文件夹数目、文件数目及文件总大小(博主曾分享过相关的自动化脚本,有需要的可以去看看,很容易上手【小工具】 hdfs路径信息获取程序),具体可从图3.4的显示效果中查看。也可以采用fsck方法查看具体block数量信息,用法为:hdfs fsck 路径 | grep Total。查看路径下小文件过多以后,可以通过区分表性质进行相应的处理来治理小文件。
例如针对临时表(存活周期为1天)可以采用控制shuffle partitions来治理(临时表承接)。
针对分区表,则要通过distribute by来进行控制,关于distribute by 对治理小文件的意义和作用,本节后续部分会对其进行说明。
问题概述
对于集群中正在运行的任务而言,同等数据量、同等资源的情况下,一些任务能够很流畅地完成运算过程,而有些任务却只在读取过程就显得异常缓慢。通过观察这些读取缓慢的stage可以发现它们之间存在两个相似点:
- 任务前半段读取进度流畅,进行一部分之后转而变缓。
- 处于读取状态的stage涵盖的task众多。
同样的,对于写入过程,有些任务写入过程十分流畅,Spark WEB UI提示该stage运行完成以后,能够在秒级别响应进行下一阶段Stage,但是有些任务在Spark WEB UI提示完成后,却陷入一种“假死”的等待状态,这种“假死”的等待状态既不会导致任务失败,也不会造成什么严重的后果,观察这样的执行完成后就陷入“假死”状态的Stage,也可发现两个特点: - 写入的数据量并不庞大。
- Spark WEB UI显示的task进度流畅,只是在完成以后会陷入“假死”。
以上情况可以将它们归为小文件的读取和写入引起的非损伤异常,通过各种方案进行治理这些问题,可以解决多种阻塞事件。
案例
通过对小文件现象的描述,可以很清楚地知道小文件能够带来的影响,这里举个例子,博主曾经碰到过的问题,如下图所示,对读取的小文件数目达到115430个,读取缓慢:
当博主看到这个数字时也是震惊的,那么文件数目达到百万级,表大小是多少呢?博主去后台查了查:
文件数目为百万级,但表大小仅为23.2144G,这小文件也太多了!这里贴一下统计命令:
# 统计hdfs下文件夹数、文件数、文件大小
hadoop dfs -count /user/hive/warehouse/***.db/*******/
# 统计hdfs下文件大小以G为单位
hadoop dfs -du /user/hive/warehouse/***.db/*******/ | awk '{s+=$1} END {print s/1024/1024/1024}'
结语
这里针对一些问题,博主根据自己的理解进行解答了一下,大家若有疑问或者是补充,欢迎留言。
1.分区表为何会生成相较普通表数倍之多的小文件?
答:举例来说,分区表A按照sk_date、castid字段分别存储数据,假设该批数据涉及sk_date的时间跨度为7天,每天内只有4个custid相关数据,那么在hdfs上该表的主目录下就该有7个文件夹,每个文件夹下有4个子文件夹,加上主目录,该表共有36个文件夹,若此时shuflle partition数量为700,该批数据经过分区后与700进行hash能够得到1至700的值,则会一共会生成19600个非空文件。同样的情况普通表只会生成700个文件。
2.既然shuffle partition数目过多会导致空文件和小文件的生成,为什么不将partition数量设置最低?
答:一般而言,对于小表是可以这样操作的,但有一些情况则不能减少partion的数量。按照配置,一个大任务能够获取的cpu核为200至300个,shufflepartition的数目可调整为700-1000才能较为合理地运用所分配的资源,当对一些大表进行操作的时候,partition数量的减少会导致单一task的负荷过重(即使最终的结果表很小),因此,为满足每天任务跑批的效率,不能够减小partition的数量,只能定期处理。另外,在编写ETL调度的时候根据需要合理设置partition数量,能够起到预防的作用。
3.如何杜绝小文件对任务执行的影响?
答:关于杜绝小文件对任务执行的影响可从两个方面开展工作,一是对已经存在的小文件进行处理,二是开发人员在满足任务效率的同时,严格控制insert into操作的shuffle partition数目。由于CDH1每天都有任务在执行,每张表被谁用、什么时候用是不确定的,因此在没有详细计划及相关人员配合的情况下,不可贸然对一些表进行处理。
。
跳转
第一节 影响生产集群运算效率的原因之概述
第二节 影响生产集群运算效率之集群设置
第三节 影响生产集群运算效率的原因之资源缺乏
第四节 影响生产集群运算效率的原因之数据倾斜
第五节 影响生产集群运算效率的原因之小文件