mapreduce用于交叉关联从100tb数据中提取的数据集

b1zrtrql  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(241)

很难说出这里要问什么。这个问题模棱两可,含糊不清,不完整,过于宽泛,或者是修辞性的,不能以现在的形式得到合理的回答。有关澄清此问题以便重新打开的帮助,请访问帮助中心。
8年前关门了。
我有大约100tb的数据,其中每个数据(元素)的大小大约为1mb。我还有n个区域,由m个元素组成,这些元素是从数据中提取的。每个元素最多出现在3个区域。一个区域内的m个元素必须交叉相关成mxm相关矩阵。我不确定m的平均大小,但它可以从5到几百不等。
在我们当前的实现中,我们派生线程来处理每个区域,并通过nfs读取文件来获取单个元素。事实证明,这个解决方案是i/o绑定的,我们现在正在研究如何将数据和计算分布在一起。乍一看,mapreduce似乎很适合这个问题,但我对这个范例还不够熟悉,无法确定。
假设我使用了hadoop。我的第一个想法是将数据作为块放入hdfs中,尽量使每个块由来自同一区域的元素组成。每个map任务将被赋予一组元素和emit(region,element)对。然后,每个reduce任务将获得一个区域的所有元素并执行互相关。但当然,我不确定这种直观的,也许是天真的方法是否是mapreduce的合理使用。
首先,我不确定这里的数据/计算位置。我发现,一般来说,某个map任务正在处理的数据可能位于同一个节点上。但是reduce任务也是这样吗?
例如,如果我从map任务发出一个指向文件中某个位置的值,reduce任务在同一节点上运行的可能性是否很高?如果在Map阶段将数据读入内存,然后以某种序列化形式发出1mb元素,会更好吗?这不会导致所有100tb的数据都存储在ram中或复制到中间文件吗?
那么,这是mapreduce的一个很好的候选者,还是我应该在其他地方寻找解决方案?对于mapreduce来说,这是一个好问题,但解决方案很差吗?提前感谢您的帮助。

kjthegm6

kjthegm61#

对我来说,这听起来像是你试图添加不必要的减速机。假设n足够大,我将尝试以下操作:将每个区域(整个数据集的1/n)插入到Map器中,并在那里计算互相关矩阵。因为这里的reducer实际上不是必需的,所以可以完全忽略它,直接写出map阶段的结果。在mapreduce中,繁重的工作通常是在map阶段完成的,在这种情况下,如果您只寻找m个互相关矩阵,那么听起来似乎不需要一个reducer。
我发现,一般来说,某个map任务正在处理的数据可能位于同一个节点上。但是reduce任务也是这样吗?
通常,reduce任务需要先将数据(即map任务的结果)传输给它们,然后才能对其进行操作。在将数据传递给reducer(s)之前,最好尽可能地压缩数据,以最小化网络流量。

相关问题