我有一个问题,需要我在迭代过程中过滤大量数据,数十TB。由于尺寸的原因,我想在2个连续的地图阶段进行计算,这样就不需要在网络上重新传输数据了。
因此,算法中的步骤是:1)分析所有数据并做出决定,2)重新运行相同的数据,并根据1的决定进行过滤。
我认为有两种方法可以解决这个问题,但每种方法似乎都存在很大问题。
1)解决方案,ChainMapper。问题:第一个映射器需要在第二个映射器开始之前完全完成。
2)解决方案,两个工作。问题:在作业之间删除数据时,数据会在网络中重新传输。
我确信有些东西我不见了,但我真的可以使用一些帮助!
由于
答案 0 :(得分:1)
鉴于您的澄清:您不能使用ChainMapper
,但它完全是因为它不能通过将mapper 1应用于所有键,等待,然后应用mapper 2来操作。将一系列地图应用于每个输入键。有些人会在其他人开始之前完成第1阶段和第2阶段。但你是对的,它不会导致更多数据通过网络;在这里它甚至没有写入磁盘!
由于您需要完成阶段1,因此在对阶段2执行任何其他操作之前,您确实需要完成映射阶段。在Mapper
的{{1}}阶段2中执行阶段1。这是最简单的。
奇怪的是,拥有两个Map / Reduces可能会更快,但没有Reducer
。 Reducer
可以是无操作,Reducer
。致电Reducer.class
。你可以通过这种方式避免洗牌阶段。它不会将数据复制到Reducer,而只是转储到HDFS。
通常,您的下一个映射器将在HDFS数据之上生成。那里没有额外的转移。
我认为你不会在这里避免一些数据传输来重新组织和重新组合数据,但我认为它不太可能支配你的计算。