Hadoop Mapreduce为大数据统计不同的向量元素

Hadoop Mapreduce为大数据统计不同的向量元素,hadoop,mapreduce,machine-learning,cluster-computing,Hadoop,Mapreduce,Machine Learning,Cluster Computing,我的数据由n-length整数/实数的向量组成。数据通常为GB级,向量的特征大小大于100。我想计算每个向量特征的不同元素。例如,如果我有如下数据: 1.13211 22.33 1.00 ... 311.66 1.13211 44.44 4.52 ... 311.66 1.55555 22.33 5.11 ... 311.66 我想要的结果像(2,2,3,…,1)只有一个向量。因为向量的第一个特征中有2个不同的值,第二个特征中有2个不同的值,以此类推 我认为使用mapreduce的方法是,从m

我的数据由
n-length
整数/实数的向量组成。数据通常为GB级,向量的特征大小大于100。我想计算每个向量特征的不同元素。例如,如果我有如下数据:

1.13211 22.33 1.00 ... 311.66
1.13211 44.44 4.52 ... 311.66
1.55555 22.33 5.11 ... 311.66
我想要的结果像
(2,2,3,…,1)
只有一个向量。因为向量的第一个特征中有2个不同的值,第二个特征中有2个不同的值,以此类推

我认为使用mapreduce的方法是,从mapper发送值($val$+{feature\u vector\u num}),1)。例如像
(1.13211+1,1)或(2.33+2,1)
。在reducer中,只需对它们进行汇总,可能是第二个映射器和reducer,用于总结上一步的所有reducer结果

问题是,如果我有大小为N的数据,在我的解决方案中,它发送到reducer的大小将是
|V |*N
在最坏的情况下,(
|V |
是特征向量的长度),同时这也是减速器的数量和关键点的数量。因此,对于大数据来说,这是一个相当糟糕的解决方案

你有什么建议吗?
谢谢你,在不考虑任何实现细节(MapReduce与否)的情况下,我会分两步完成,每个功能都有一个哈希表(可能在Redis中)

第一步将列出所有值和相应的计数

第二个将遍历每个向量,查看元素在hastable中是否唯一。如果您有一定的错误空间,并且希望占用少量内存,我甚至会选择bloom过滤器


这两个步骤基本上是并行的。

我同意lejlot的观点,即使用其他方法(例如,哈希映射等内存算法)而不是使用m/r,1GB将是更理想的解决方案

但是,如果您的问题大于2-3个数量级,或者如果您只想练习m/r,以下是一种可能的解决方案:

第一阶段 制图员 参数:
  • 输入键:不相关(对于TextInputFormat,我认为它是可长写的) 表示文件中的一个位置,但只能使用“可写”(Writable)
  • 输入值:由空格分隔的向量分量的单行(1.13211 22.33 1.00…311.66)
  • 输出键:一对 其中IntWritable保存组件的索引,DoubleWritable保存组件的值。 Google for hadoop示例,特别是SecondarySort.java,它演示了如何实现一对IntWritable。您只需要使用DoubleWritable作为第二个组件来重写它
  • 输出值:不相关,可以使用NullWritable
映射函数
  • 将值标记化
  • 对于每个令牌,发射密钥(您可以为此创建自定义可写对类)和NullWritable值
减速器 该框架将使用pair作为密钥调用reducer,每个密钥变化只调用一次,从而有效地消除重复数据。例如,密钥只会出现一次

Params
  • 输入键:配对
  • 输入值:不相关(可写或可空写)
  • 输出键:IntWritable(组件索引)
  • 输出值:IntWritable(与索引对应的计数)
减速器设置
  • 初始化int[]计数器数组,其大小等于向量维度
减速器功能
  • 从key.getFirst()获取索引
  • 索引的增量计数:计数器[索引]++
减速器清理
  • 对于计数器数组发出的每个计数,数组的索引(作为键)和计数器的值
第二阶段 只有在第一阶段中有多个减速机时,才需要这个减速机。在这种情况下,上述计算的计数是部分的。 您需要将多个减速器的输出合并为一个输出。 您需要设置一个减速机作业,在该作业中,您的减速机将只累积相应索引的计数

制图员 无操作

减速器 Params
  • 输入键:IntWritable(位置)
  • 输入值:IntWritable(部分计数)
  • 输出键:IntWritable(位置)
  • 输出值:IntWritable(总计数)
减速器功能
  • 对于每个输入键
    • 整数计数器=0
    • 迭代这些值
      • 计数器+=值
    • 发出输入键(作为键)和计数器(作为值)

生成的输出文件“part-r-00000”应该有N条记录,其中每条记录是按位置排序的一对值(位置和不同计数)。

基本建议是。。。不要将mapreduce用于此类简单任务。GB的数据不是“大数据”,它只是一个中等数据集。并行地在流中读取它,添加每个独立线程的结果,仅此而已。你不需要hadoop来做这样的事情,除非你有PB(是的,PB字节)的数据,否则它实际上会更糟糕。谢谢你的回复,我的意思是GBs的数据,可能是1GB和999 GB,但肯定小于PB。事实上,我知道数据的大小在大多数情况下是未知的,问题是,构建可伸缩的系统。我有两个选择,R和Hadoop。我选择hadoop解决这个问题。因为R需要至少两倍于数据大小的内存。@lejlot那么你是说Hadoop/MapReduce即使有TB的数据也会变慢?不,我不是,你是在阻止我使用MapReduce处理~1-999 GB的数据。其实问题不在这个问题上。谢谢,谢谢你的回答。这也是我在串行版本中的实现,但在mapreduce中,我无法理解如何有效地安排映射器和reducer。