友情链接
很多客⼾在⽣产环境都会遇到小文件问题,小文件可能来⾃于上游系统,可能来⾃于书写不当的sql,也可能是错误数据导致join ⽣成⼤量小文件。 用户侧观察到的现象就是,性能下降,任务报错,甚⾄executor lost。
一般来说,一个任务是由几个步骤组成的,而小文件的产生也来自任务的各个流程和步骤:
上游 => 本地文件系统 => HDFS => Map => Reduce => FileSink
所以解决小文件问题就是从上面步骤中入手。而且解决小文件的隐患,肯定是越早越好的。跟过滤下推一样,能尽早做的过滤条件一定是尽早过滤。
就比如,能在本地文件系统解决的问题,没必要放到hdfs上解决,HDFS本身就不适合存储大量小文件,小文件过多会导致namenode元数据特别大, 占用太多内存,严重影响HDFS的性能。
某用户,上游应用产生了57000 个小文件,每个文件一行数据。创建text 外表后,执行任务报了task 超过10w。
第一反应先走automerge,开启automerge后,数据本地合并后大概合并了出了不到10 个task,然后就把executor 跑lost了。
问题是每个任务需要读的文件太多了,一个task中连续new DFSClient,DFSInputStream,Path,JobConf 等对象,导致gc压力太大,最后executor lost。
所以给到该用户的解决方案是:
友情链接
很多客⼾在⽣产环境都会遇到小文件问题,小文件可能来⾃于上游系统,可能来⾃于书写不当的sql,也可能是错误数据导致join ⽣成⼤量小文件。 用户侧观察到的现象就是,性能下降,任务报错,甚⾄executor lost。
一般来说,一个任务是由几个步骤组成的,而小文件的产生也来自任务的各个流程和步骤:
上游 => 本地文件系统 => HDFS => Map => Reduce => FileSink
所以解决小文件问题就是从上面步骤中入手。而且解决小文件的隐患,肯定是越早越好的。跟过滤下推一样,能尽早做的过滤条件一定是尽早过滤。
就比如,能在本地文件系统解决的问题,没必要放到hdfs上解决,HDFS本身就不适合存储大量小文件,小文件过多会导致namenode元数据特别大, 占用太多内存,严重影响HDFS的性能。
某用户,上游应用产生了57000 个小文件,每个文件一行数据。创建text 外表后,执行任务报了task 超过10w。
第一反应先走automerge,开启automerge后,数据本地合并后大概合并了出了不到10 个task,然后就把executor 跑lost了。
问题是每个任务需要读的文件太多了,一个task中连续new DFSClient,DFSInputStream,Path,JobConf 等对象,导致gc压力太大,最后executor lost。
所以给到该用户的解决方案是: