Hadoop conf 用于确定 num map 任务



我有一个工作,就像我所有的Hadoop作业一样,从我在Hadoop界面中看到的内容运行时,它似乎总共有2个映射任务。但是,这意味着它加载了如此多的数据,以至于我收到 Java 堆空间错误。

我尝试在我的Hadoop集群中设置许多不同的conf属性,以使作业拆分为更多任务,但似乎没有任何效果。

我尝试设置mapreduce.input.fileinputformat.split.maxsizemapred.max.split.sizedfs.block.size但似乎没有任何效果。

我正在使用 0.20.2-cdh3u6,并尝试使用 cascading.jdbc 运行作业 - 作业从数据库读取数据时失败。我认为这个问题可以通过增加拆分次数来解决,但无法弄清楚如何做到这一点!

请帮忙!疯了!

2013-07-23 09:12:15,747 FATAL org.apache.hadoop.mapred.Child: Error running child : java.lang.OutOfMemoryError: Java heap space
        at com.mysql.jdbc.Buffer.<init>(Buffer.java:59)
        at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1477)
        at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:2936)
        at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:477)
        at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:2631)
        at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1800)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2221)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2618)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
        at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1557)
        at cascading.jdbc.db.DBInputFormat$DBRecordReader.<init>(DBInputFormat.java:97)
        at cascading.jdbc.db.DBInputFormat.getRecordReader(DBInputFormat.java:376)
        at cascading.tap.hadoop.MultiInputFormat$1.operate(MultiInputFormat.java:282)
        at cascading.tap.hadoop.MultiInputFormat$1.operate(MultiInputFormat.java:277)
        at cascading.util.Util.retry(Util.java:624)
        at cascading.tap.hadoop.MultiInputFormat.getRecordReader(MultiInputFormat.java:276)
        at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:370)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:324)
        at org.apache.hadoop.mapred.Child$4.run(Child.java:266)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:415)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1278)
        at org.apache.hadoop.mapred.Child.main(Child.java:260)

您应该查看内存管理的设置,例如 io.sort.mbmapred.cluster.map.memory.mb,因为堆空间错误通常是由于分配问题而不是映射编号引起的。

如果要强制使用地图编号,则必须考虑某些值先于其他值使用。例如mapreduce.input.fileinputformat.split.maxsize如果小,即使您将mapred.tasktracker.map.tasks.maximum设置为较小的值,也会生成大量的tak。

仅当dfs.block.size大于mapreduce.input.fileinputformat.split.maxsize时,该才会对生成的地图编号产生影响

我的工作是从表中读取数据,其中 1,000 行相当于大约 1MB。这个特殊的工作试图读取753,216个网址。事实证明,每个任务进程的 Java 堆空间上限为 200MB。正如 Brugere 在对我问题的评论中指出的那样,我可以在控制堆空间 (http://developer.yahoo.com/hadoop/tutorial/module7.html( 的 mapred-site.xml 中设置 mapred.child.java.opts 属性。

我发现我还必须在配置文件中为此属性设置<final>true</final>,否则该值被重置为 200MB(是否有可能在代码中的某个地方重置?也许在 cascading.jdbc 中?(。

当我检测到需要更大的堆空间时,我将

在设置作业时在我的代码中设置此堆空间属性,而将常规 Hadoop 配置设置保留为使用默认的 200MB。

相关内容

  • 没有找到相关文章

最新更新