我想编写MapReduce程序(可能需要多轮)来
1. 从大数据中采样N条记录 - 用于X个随机树2. 训练每个树(总共X个)3. 然后在所有这些树上测试记录
顺序执行,
for X = 0 to 199: - 从大数据中采样N条记录 - 训练这个树 - 对所有测试记录进行测试
这是我的作业问题,所以我只需要一些想法..!
我对以下几点不确定
- 在mapper中我能否准确采样N条记录并生成200个小训练数据文件?
- 要在所有200个树上测试每条记录,第一个选项我想的是每个reducer会对ALL树运行小测试(测试文件的一部分)。第二个选项我不确定如何实现,即独立运行200个树,测试文件放在分布式缓存中,为每个测试记录进行预测。
回答:
这取决于你的工作方式有多正式。
一个正式的mapper不能准确采样N条记录。因为它无法保持计数器,也不知道总数据大小。一个实际的Hadoop mapper当然可以。但他可能不知道总共会收到多少条记录。
但正如你所说这是作业,我认为你不需要确保是准确的N条记录。特别是,你在进行采样,拥有准确的N条记录有什么好处?
尝试以下方法:
- 确定记录的总大小。
- 让每个mapper以N/D的概率向每个树(= reducer的key)发出每条记录。
- 让reducer在它收到的所有记录上训练树。