Hadoop 为什么在第一组映射器完成后,映射作业会变慢?

Hadoop 为什么在第一组映射器完成后,映射作业会变慢?,hadoop,mapreduce,elastic-map-reduce,emr,Hadoop,Mapreduce,Elastic Map Reduce,Emr,假设我有100个地图绘制者并行运行,总共有500个地图绘制者在运行 每个映射器接收到的输入大小几乎相同,每个映射器应该花费的处理时间应该或多或少相同 但假设前100名制图员在20分钟内完成,接下来的100名制图员大约需要25-30分钟,下一批100名制图员每人大约需要40-50分钟。然后我们得到GC开销错误 为什么会这样 我已经设置了以下配置: <property><name>mapred.child.java.opts</name><value&g

假设我有100个地图绘制者并行运行,总共有500个地图绘制者在运行

每个映射器接收到的输入大小几乎相同,每个映射器应该花费的处理时间应该或多或少相同

但假设前100名制图员在20分钟内完成,接下来的100名制图员大约需要25-30分钟,下一批100名制图员每人大约需要40-50分钟。然后我们得到GC开销错误

为什么会这样

我已经设置了以下配置:

  <property><name>mapred.child.java.opts</name><value>-Xmx4096m</value></property>
  <property><name>mapred.job.reuse.jvm.num.tasks</name><value>1</value></property>

这里还可以做什么?

如果出现GC错误,可能是创建了太多的对象,或者堆不够。也许你有内存泄漏。是的,但如果是这样的话,它应该只在第一次运行时失败,对吗?为什么它会减慢速度并在以后的运行中失败?另外,由于JVM重用被设置为1,每个映射器将得到一个新的映射器来使用!为什么跑步?每个映射器都有不同的输入,因此不太可能是格式错误的输入导致内存泄漏。如果将reuse设置为1,则一次重新聚合JVM。将其设置为-1,然后您将重用每个进程。然而,这并不能解决内存泄漏问题。Bu运行我指的是一批映射程序,正如我在上面提到的,第一批100个映射程序运行正常,然后下一批映射程序开始变慢,最终导致GC开销超出限制而失败。因此,除了格式错误的输入和内存泄漏之外,这里还发生了其他一些事情。您是否可以共享您的映射器代码,或描述您在映射阶段中的操作-输入大小可能相同,但映射器的逻辑和实际输入内容可能是一个原因,例如,如果您使用某个键缓冲输出值