用于在MapReduce中流式传输数据的自定义输入拆分



我有一个大型数据集,它作为序列文件摄取到 HDFS 中,键是文件元数据并重视整个文件内容。我正在使用序列文件输入格式,因此我的拆分基于序列文件同步点。

面临的问题是,当我摄取非常大的文件时,我基本上是在映射器/化简器的内存中加载整个文件,因为值是整个文件内容。我正在寻找在保留序列文件容器的同时流式传输文件内容的方法。我什至考虑过编写自定义拆分,但不确定如何保留序列文件容器。

任何想法都会有所帮助。

自定义拆分方法不适合此方案,原因有以下 2 个。

1) 整个文件加载到 Map 节点,因为 Map 函数需要整个文件(因为值 = 整个内容)。 如果拆分文件,Map 函数仅接收部分记录(值),并且会失败。

2) 序列文件容器可能将您的文件视为"单个记录"文件。因此,它最多只有 1 个同步点,即在标头之后。 因此,即使保留序列文件容器的同步点,整个文件也会在现在加载时加载到 Map 节点。

如果编写自定义拆分,我担心丢失序列文件同步点。我正在考虑这种修改序列文件输入格式/记录读取器以返回文件内容块而不是整个文件的方法,但为每个块返回相同的键。

分块策略类似于在MapReduce中计算文件分割的方式。

最新更新