Statistics 在Hadoop中按列计算平均值和标准偏差

Statistics 在Hadoop中按列计算平均值和标准偏差,statistics,hadoop,machine-learning,mapreduce,Statistics,Hadoop,Machine Learning,Mapreduce,我想在Hadoop中通过列计算平均值和标准偏差 我简单地采用单通天真算法来MapReduce。 我在多变量数据集455000x90和650000x120上测试了它,加速比越低,处理器数越低。对于具有2个活动内核的独立和伪分布式模式,455000x90的加速比为0,4=20秒/53秒 为什么我的程序无效?有可能改进吗 制图员: 公共类CalculateManandstDevMapper扩展 制图员{ 私有int数据源; 私有int dataDimTo; 私人长样本计数; 私立大学; @凌驾 受保护

我想在Hadoop中通过列计算平均值和标准偏差

我简单地采用单通天真算法来MapReduce。 我在多变量数据集455000x90和650000x120上测试了它,加速比越低,处理器数越低。对于具有2个活动内核的独立和伪分布式模式,455000x90的加速比为0,4=20秒/53秒

为什么我的程序无效?有可能改进吗

制图员:

公共类CalculateManandstDevMapper扩展
制图员{
私有int数据源;
私有int dataDimTo;
私人长样本计数;
私立大学;
@凌驾
受保护的无效设置(上下文)引发IOException{
conf=context.getConfiguration();
dataDimFrom=conf.getInt(“dataDimFrom”,0);
dataDimTo=conf.getInt(“dataDimTo”,0);
samplesCount=conf.getLong(“samplesCount”,0);
universeSize=dataDimTo-dataDimFrom+1;
}
@凌驾
公共空间地图(
长可写密钥,
双阵列可写入阵列,
上下文)抛出IOException、InterruptedException{
DoubleWritable[]outArray=新的DoubleWritable[universeSize*2];
for(int c=0;c
组合器:

公共类CalculateManandStdevCombiner扩展
减速器{
私有int数据源;
私有int dataDimTo;
私立大学;
@凌驾
受保护的无效设置(上下文)引发IOException{
conf=context.getConfiguration();
dataDimFrom=conf.getInt(“dataDimFrom”,0);
dataDimTo=conf.getInt(“dataDimTo”,0);
universeSize=dataDimTo-dataDimFrom+1;
}
@凌驾
减少公共空间(
可写列,
不可分割的部分,
上下文)抛出IOException、InterruptedException{
DoubleWritable[]outArray=新的DoubleWritable[universeSize*2];
布尔值isFirst=true;
用于(双阵列可写入分区:分区){
对于(int i=0;i
减速器:

公共类CalculateManandStdevReducer扩展
减速器{
私有int数据源;
私有int dataDimTo;
私立大学;
@凌驾
受保护的无效设置(上下文)引发IOException{
conf=context.getConfiguration();
dataDimFrom=conf.getInt(“dataDimFrom”,0);
dataDimTo=conf.getInt(“dataDimTo”,0);
universeSize=dataDimTo-dataDimFrom+1;
}
@凌驾
减少公共空间(
可写列,
不可分割的部分,
上下文)抛出IOException、InterruptedException{
DoubleWritable[]outArray=新的DoubleWritable[universeSize*2];
布尔值isFirst=true;
用于(双阵列可写入分区:分区){
for(int i=0;i
其中DoubleArrayWritable是扩展ArrayWritable的简单类:

公共类DoubleArrayWritable扩展了ArrayWritable{
公共DoubleArrayWritable(){
super(DoubleWritable.class);
}
公共DoubleArrayWritable(DoubleWritable[]值){
super(DoubleWritable.class,value);
}
公共双可写get(int idx){
return(DoubleWritable)get()[idx];
}
}

我问了一个问题,是关于同一环境下的另一份工作,也有同样的问题。David Gruzman猜测问题出在不同的作业开始时间(本地、集群)。他建议,在这种环境下,数据的最佳大小可以实现良好的加速(5GB)。我试过了,这是真的


为什么要在上下文中这样做?write(新的intwriteable(1),新的doubleArrayWriteable(outArray));在你的地图上?所以你的列总是1?@ThomasJungblut我在这里看到两个解决方案:1)映射程序对:{1,{partMean1,partMean2,{partMean2,partSumSquare1,partSumSquare2,{partSumSquareK}}(我在这里描述过)2)映射程序产生对:{1,{partMean1,partSumSquare1},{2,{partMean2,partSumSquare2},}。。。{K,{partMeanK,partSumSquareK}}其中K-数据中变量(列)的计数。我测试了这两个,但我没有得到很好的加速结果。