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值
- 输入键:配对
- 输入值:不相关(可写或可空写)
- 输出键:IntWritable(组件索引)
- 输出值:IntWritable(与索引对应的计数)
- 初始化int[]计数器数组,其大小等于向量维度
- 从key.getFirst()获取索引
- 索引的增量计数:计数器[索引]++
- 对于计数器数组发出的每个计数,数组的索引(作为键)和计数器的值
- 输入键: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。