mahout random forests分布式策略
关于mahout中的random forests算法在前面已经分析过,这里简要说下其并行策略。
刚开始的时候,我以为这个算法好像没啥并行的地方,一开始就是对全部原始数据进行分析,也没有对原始数据进行分片。然后它的job任务也只有一个mapper,这样如何才能多建立几个mapper?然后这样才能达到几个节点并行吧(一个节点计算一个mapper,这样效率才高过一个节点计算多个mapper)。但是如果总共才有一个map任务,那就算有多个节点也是没有用的。然后我就记起来mapper任务map的个数是和输入数据的大小来的,64M就会新建一个map任务,如果数据大于64M就会新建一个map任务。所以我就把前面的glass.data数据进行加倍处理,一直到数据到了70多M的时候然后上传,运行buildforest任务,但是还是只有一个map任务被提交了。这样就让我好郁闷了。
然后就又去看官网的文档,看到下面的一句:
[html] view plaincopy
The number of partitions is controlled by the -Dmapred.max.split.size argument that indicates to Hadoop the max. size of each partition, in this case 1/10 of the size of the dataset. Thus 10 partitions will be used.
IMPORTANT: using less partitions should give better classification results, but needs a lot of memory. So if the Jobs are failing, try increasing the number of partitions
上面的大概意思是:设置-Dmapred.max.split.size参数,然后根据这个参数把数据进行分片,然后几个分片就会建立几个map任务进行提交。这样有多个map任务被提交的话,并行就有搞头了。这里应该就是按照split.size参数对原始数据进行分组(随机分?整块分?),然后对每组数据进行建树分析的过程,这样来达到对大数据的分组,并行的策略。但是这样的话,建立的树不是没有包含所有的信息?这点也是这个并行策略的不足吧,官网文档也说,如果分片越少,那么建立的决策树精度会提高(但是每个决策树模型需要消耗的内存也会增大),但是相对的并行性就会降低(试想,我又2个map任务,但是我又3个节点,那么不是有一个节点应该没有任务,这样效率其实是不高的)。
既然上面说的那个参数可以进行设置来决定map的个数,那么就试验一下吧:
上图可以看到提交了三个map任务,但是一个节点只能同时运行2个map(这个个数可以设置,我只有一个节点,伪分布式)。同时也可以看到运行失败了两个map任务,因为我提交的输入数据太大了(143M),所以内存吃不消了,在终端出现下面的错误:
所以针对这个算法,-Dmapred.max.split.size参数一定要进行设置,而且还要慎重考虑,这个算法同时关系到算法的效率和模型的精确度。
补充:web前端 , HTML/CSS ,