我有两个文件。我希望一个文件位于分布式缓存中,而另一个文件发送至映射器。
但是分布式缓存中的文件非常大。我计划的是通过一个映射器将该文件分割,然后将块并行发送到另一个映射进程。
任何想法如何实现这一点。
最佳答案
首先,之所以存在分布式缓存,是因为所有映射器都具有对(一个或多个)公共(public)文件的(读取)访问权限。停用词列表。如果不需要,则不需要分布式缓存。此外,如果您描述的两个文件具有相同的格式并且以相同的方式处理它们,则只需将其根目录作为输入传递到映射器。 Hadoop将以相同的方式处理它们并拆分它们。如果不是这种情况,请继续阅读我的答案。
如果要将第一个映射器的输出用作第二个映射器的(单个)输入,则可以使用ChainMapper。
但是我想您也想使用第二个输入文件。
因此,您可以split your job in a chain of two jobs。然后,第二个作业的映射器的输入可以是两个输入文件的组合:第一个作业的输出和一个文件,只要它们的格式相同即可。因此,可以使用addInputPath方法。
否则,您可以直接从文件系统获取文件,如here所述。
请注意,如果您的大文件大于块的大小(默认为64 MB)并且可以拆分,那么在将其作为映射器的输入时,hadoop会“自动”拆分其文件。