我有一个问题,需要我在迭代过程中过滤大量数据,数十tb。由于大小,我想在两个连续的map阶段进行计算,这样数据就不需要在网络上重新传输。
所以算法的步骤是1)分析所有数据并做出决定,2)在相同的数据上重新运行,并根据1的决定进行过滤过程。
我认为有两种方法可以解决这个问题,但似乎每一种都有很大的问题。
1)解,ChainMapper。问题:第一个映射器需要在第二个开始之前完全完成。
2)解决方案,两个工作。问题:当数据在作业之间被删除时,数据会通过网络重新传输。
我肯定我错过了什么,但我真的需要一些帮助!
谢谢
鉴于您的澄清:您不能使用ChainMapper
,但它正是,因为它不通过将映射器1应用于所有键,等待,然后应用映射器2来操作。它将映射链应用于每个输入键。有些人甚至会在其他人开始之前完成第一阶段和第二阶段。但你是对的,它不会导致更多的数据通过网络;这里甚至没有写入磁盘!
由于您需要完成阶段1,因此您确实需要在对阶段2进行任何其他操作之前完成Map阶段。在Mapper
中进行阶段1,在Reducer
中进行阶段2。这是简单的。
奇怪的是,有两个Map/reduce可能会更快,但没有Reducer
。Reducer
可以是无操作的Reducer.class
。呼叫setNumReduceTasks(0)
。这样可以避免洗牌阶段。它不会将数据复制到reducer,而是直接转储到HDFS。
通常,您的下一个映射器将在HDFS数据之上生成。没有额外的转移。
我不认为你会在这里避免一些数据传输来重组和重新整理数据,但我认为它不太可能主导你的计算。