背景说明
利用apache parquet-mr项目提供的parquet合并接口,完成hdfs上parquet文件的合并,从而减少hdfs上的小文件,减少文件元数据占据namenode的内存。
问题描述
现场环境上线parquet文件合并算子,运行一段时间后,日志中出现too many open files。利用lsof -p 进程号|wc -l命令来查看进程打开的文件句柄数,发现已经接近系统设置的最大数65535。
解决过程
查看org.apache.parquet.hadoop.ParquetFileWriter源码
public void appendFile(Configuration conf, Path file) throws IOException {
ParquetFileReader.open(conf, file).appendTo(this);
}
public void appendTo(ParquetFileWriter writer) throws IOException {
writer.appendRowGroups(f, blocks, true);
}
public void appendRowGroup(SeekableInputStream from, BlockMetaData rowGroup,
boolean dropColumns) throws IOException {
startBlock(rowGroup.getRowCount());
Map<String, ColumnChunkMetaData> columnsToCopy =
new HashMap<String, ColumnChunkMetaData>();
for (ColumnChunkMetaData chunk : rowGroup.getColumns()) {