hadoop mapreduce,输入大小~2mb慢

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

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

  1. public void map(IntWritable triangleIndex, TriangleWritable triangle, Context context) throws IOException, InterruptedException {
  2. StationWritable[] stations = kernel.newton(triangle.getPoints());
  3. if (stations != null) {
  4. for (StationWritable station : stations) {
  5. context.write(new IntWritable(station.getId()), station);
  6. }
  7. }
  8. }
  9. class TriangleWritable implements Writable {
  10. private final float[] points = new float[9];
  11. @Override
  12. public void write(DataOutput d) throws IOException {
  13. for (int i = 0; i < 9; i++) {
  14. d.writeFloat(points[i]);
  15. }
  16. }
  17. @Override
  18. public void readFields(DataInput di) throws IOException {
  19. for (int i = 0; i < 9; i++) {
  20. points[i] = di.readFloat();
  21. }
  22. }
  23. }
  24. public class StationWritable implements Writable {
  25. private int id;
  26. private final TIntDoubleHashMap values = new TIntDoubleHashMap();
  27. StationWritable(int iz) {
  28. this.id = iz;
  29. }
  30. @Override
  31. public void write(DataOutput d) throws IOException {
  32. d.writeInt(id);
  33. d.writeInt(values.size());
  34. TIntDoubleIterator iterator = values.iterator();
  35. while (iterator.hasNext()) {
  36. iterator.advance();
  37. d.writeInt(iterator.key());
  38. d.writeDouble(iterator.value());
  39. }
  40. }
  41. @Override
  42. public void readFields(DataInput di) throws IOException {
  43. id = di.readInt();
  44. int count = di.readInt();
  45. for (int i = 0; i < count; i++) {
  46. values.put(di.readInt(), di.readDouble());
  47. }
  48. }
  49. }
sigwle7e

sigwle7e1#

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

bvjxkvbb

bvjxkvbb2#

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

bt1cpqcv

bt1cpqcv3#

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

相关问题