我正在尝试使用map/reduce
来处理大量二进制数据。该应用程序的特点如下:记录的数量可能很大,这样我真的不想将每个记录存储为HDFS
中的单独文件(我打算将它们全部连接成一个二进制文件)序列文件),每个记录是一个大的相干(即不可拆分)blob,大小在一百到几百MB之间。记录将由C ++可执行文件使用和处理。如果它不是记录的大小,那么Hadoop Pipes API就可以了:但这似乎是基于将输入作为连续的字节块传递给map / reduce任务,这在这种情况下是不切实际的。 / p>
我不确定这样做的最好方法。是否存在任何类型的缓冲接口,允许每个M / R任务以可管理的块的形式提取多个数据块?否则,我正在考虑通过API传递文件偏移量,并在C ++端从HDFS流式传输原始数据。
我想得到任何尝试类似事物的人的意见 - 我对hadoop很新。
答案 0 :(得分:1)
Hadoop不适用于大小约为100MB的记录。你会得到OutOfMemoryError和不均匀的分裂,因为有些记录是1MB,有些是100MB。通过Ahmdal's Law,您的并行性将受到很大影响,从而降低吞吐量。
我看到两个选项。您可以使用Hadoop streaming将大文件映射到C ++可执行文件中。由于这将通过stdin发送您的数据,因此它自然会流式传输和缓冲。您的第一个地图任务必须将数据分解为较小的记录以供进一步处理。然后,进一步的任务对较小的记录进行操作。
如果你真的无法分解它,那么让地图缩小工作对文件名进行操作。第一个映射器获取一些文件名,通过映射器C ++可执行文件运行它们,将它们存储在更多文件中。 reducer被赋予输出文件的所有名称,并使用reducer C ++可执行文件重复。这不会耗尽内存,但会很慢。除了并行性问题之外,您不会减少调度到已经拥有数据的节点上的作业,从而导致非本地HDFS读取。