我有一个大的数据集,作为序列文件被摄取到hdfs中,关键是文件元数据和整个文件内容的值。我使用的是sequencefileinputformat,因此我的拆分基于序列文件同步点。我面临的问题是,当我摄取非常大的文件时,我基本上是将整个文件加载到mapper/reducer的内存中,因为值是整个文件的内容。我正在寻找流式传输文件内容的方法,同时保留序列文件容器。我甚至想过编写自定义拆分,但不确定如何保留序列文件容器。任何想法都会有帮助。
s6fujrry1#
我担心在编写自定义拆分时会丢失序列文件同步点。我在考虑这种方法,修改sequence file input format/record reader以返回文件内容的块,而不是整个文件,但是为每个块返回相同的键。分块策略类似于在mapreduce中计算文件分割的方式。
kiayqfof2#
由于以下两个原因,自定义拆分方法不适合此场景。1) 将整个文件加载到map节点,因为map函数需要整个文件(值=整个内容)。如果分割文件,map函数只接收部分记录(值),它将失败。2) 序列文件容器可能将您的文件视为“单个记录”文件。所以,它最多只有一个同步点,也就是在报头之后。因此,即使保留序列文件容器的同步点,整个文件也会在加载时加载到map节点。
2条答案
按热度按时间s6fujrry1#
我担心在编写自定义拆分时会丢失序列文件同步点。我在考虑这种方法,修改sequence file input format/record reader以返回文件内容的块,而不是整个文件,但是为每个块返回相同的键。
分块策略类似于在mapreduce中计算文件分割的方式。
kiayqfof2#
由于以下两个原因,自定义拆分方法不适合此场景。
1) 将整个文件加载到map节点,因为map函数需要整个文件(值=整个内容)。如果分割文件,map函数只接收部分记录(值),它将失败。
2) 序列文件容器可能将您的文件视为“单个记录”文件。所以,它最多只有一个同步点,也就是在报头之后。因此,即使保留序列文件容器的同步点,整个文件也会在加载时加载到map节点。