我有一个大型数据集,它作为序列文件被摄取到 HDFS 中,关键是文件元数据并重视整个文件内容。我正在使用 SequenceFileInputFormat,因此我的拆分基于序列文件同步点。
我面临的问题是当我摄取非常大的文件时,我基本上是将整个文件加载到 Mapper/Reducer 的内存中,因为值是整个文件内容。我正在寻找在保留序列文件容器的同时流式传输文件内容的方法。我什至考虑过编写自定义拆分,但不确定如何保留序列文件容器。
任何想法都会有所帮助。
如果编写自定义拆分,我担心会丢失序列文件同步点。我正在考虑这种修改序列文件输入格式/记录读取器的方法,以返回文件内容的块而不是整个文件,但为每个块返回相同的键。
分块策略类似于在 MapReduce 中计算文件拆分的方式。
由于以下两个原因,自定义拆分方法不适合这种情况。
1) 整个文件被加载到 Map 节点,因为 Map 函数需要整个文件(因为值 = 整个内容)。如果您拆分文件,Map 函数只接收部分记录(值)并且它会失败。
2)可能序列文件容器将您的文件视为“单记录”文件。因此,它最多只有 1 个同步点,即在标头之后。因此,即使您保留序列文件容器的同步点,整个文件也会在加载时加载到 Map 节点。