hadoop mapreduce,输入大小~2mb慢

mbskvtky  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(412)

我试着用hadoop发布一个计算。
我正在使用序列输入和输出文件,以及自定义可写文件。
输入是一个三角形列表,最大大小为2mb,但也可以在50kb左右更小。中间值和输出是自定义可写文件中的Map(int,double)。这是瓶颈吗?
问题是计算速度比没有hadoop的版本慢得多。另外,将节点数从2增加到10并不能加快进程。
一种可能是我没有得到足够的Map器,因为输入太小。我做了测试改变了 mapreduce.input.fileinputformat.split.maxsize ,但它只是变得更糟,而不是更好。
我在本地和amazonelasticmapreduce使用hadoop2.2.0。
我忽略了什么吗?或者这就是不使用hadoop就可以完成的任务(这是我第一次使用mapreduce)。
你想看看代码部分吗?
谢谢您。

public void map(IntWritable triangleIndex, TriangleWritable triangle, Context context) throws IOException, InterruptedException {           
        StationWritable[] stations = kernel.newton(triangle.getPoints());
        if (stations != null) {
            for (StationWritable station : stations) {
                context.write(new IntWritable(station.getId()), station);
            }
        }
    }    

class TriangleWritable implements Writable {

private final float[] points = new float[9];

@Override
public void write(DataOutput d) throws IOException {
    for (int i = 0; i < 9; i++) {
        d.writeFloat(points[i]);
    }
}

@Override
public void readFields(DataInput di) throws IOException {
    for (int i = 0; i < 9; i++) {
        points[i] = di.readFloat();
    }
}
}

public class StationWritable implements Writable {

private int id;
private final TIntDoubleHashMap values = new TIntDoubleHashMap();

StationWritable(int iz) {
    this.id = iz;
}

@Override
public void write(DataOutput d) throws IOException {
    d.writeInt(id);
    d.writeInt(values.size());
    TIntDoubleIterator iterator = values.iterator();
    while (iterator.hasNext()) {
        iterator.advance();
        d.writeInt(iterator.key());
        d.writeDouble(iterator.value());
    }
}

@Override
public void readFields(DataInput di) throws IOException {
    id = di.readInt();

    int count = di.readInt();
    for (int i = 0; i < count; i++) {
        values.put(di.readInt(), di.readDouble());
    }
}
}
sigwle7e

sigwle7e1#

所以最后我想出了一种方法,不把中间值存储在可写文件中,只存储在内存中。这样更快。但在这个用例中,非hadoop解决方案仍然是最好的。

bvjxkvbb

bvjxkvbb2#

只有2mb数据的hadoop不会给您带来任何好处。hadoop完全是关于大数据的。将2mb分配到10个节点比仅在单个节点上执行此任务需要更多的时间。真正的benfit始于大量节点和大量数据。

bt1cpqcv

bt1cpqcv3#

如果处理真的那么复杂,您应该能够从使用hadoop中获得好处。
小文件的常见问题是,hadoop将为每个文件运行一个java进程,这将导致启动许多进程的开销,并降低输出速度。在你的情况下,这听起来并不适用。更可能的情况是,只有一个Map器试图处理您的输入,而此时集群有多大并不重要。使用输入分割听起来像是正确的方法,但是由于用例是专门化的,并且明显偏离了规范,因此您可能需要调整许多组件以获得最佳性能。
因此,您应该能够从hadoop map reduce中获得您正在寻求的好处,但是这可能需要进行大量的调优和定制输入处理。
也就是说,mapreduce很少(永远不会)比专门构建的解决方案更快。它是一个通用工具,非常有用,因为它可以用来分发和解决许多不同的问题,而无需为每个问题编写专门构建的解决方案。

相关问题