我尝试使用 hadoop 分发计算。
我正在使用序列输入和输出文件以及自定义可写文件。
输入是一个三角形列表,最大大小为 2Mb,但也可以更小 50kb 左右。中间值和输出是自定义 Writable 中的 map(int,double)。这是瓶颈吗?
问题是计算比没有hadoop的版本慢很多。此外,将节点从 2 个增加到 10 个,并不会加快进程。
一种可能性是由于输入尺寸小,我没有得到足够的映射器。我进行了更改的测试mapreduce.input.fileinputformat.split.maxsize
,但它变得更糟,而不是更好。
我在本地使用 hadoop 2.2.0,并在亚马逊弹性 mapreduce 上使用。
我忽略了什么吗?或者这只是应该在没有 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());
}
}
}