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