hadoop conf确定num map任务

lo8azlld  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(287)

我有一个作业,就像我所有的hadoop作业一样,在hadoop界面上运行时,它似乎总共有两个map任务。然而,这意味着它加载了太多的数据,因此我得到了一个java堆空间错误。
我曾尝试在hadoop集群中设置许多不同的conf属性,以将作业分割成更多的任务,但似乎没有任何效果。
我试过设置 mapreduce.input.fileinputformat.split.maxsize , mapred.max.split.size , dfs.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)
iovurdzv

iovurdzv1#

我的工作是从1000行相当于1mb的表中读取数据。这个特殊的工作是尝试读取753216个url。结果是每个任务进程的java堆空间被限制在200mb。正如布鲁吉尔在对我的问题的评论中指出的那样,我可以设定 mapred.child.java.opts 中的属性 mapred-site.xml 它控制堆空间(http://developer.yahoo.com/hadoop/tutorial/module7.html).
我发现我也必须 <final>true</final> 对于我的配置文件中的这个属性,值被重置为200mb(有可能是在代码中的某个地方重置的吗?可能是级联的。jdbc?)。
当我检测到作业需要更大的堆空间时,我会在代码中设置这个heap space属性,让常规hadoop配置设置使用默认的200mb。

jhkqcmku

jhkqcmku2#

您应该查看内存管理的设置,如 io.sort.mb 或者 mapred.cluster.map.memory.mb 因为堆空间错误通常是由于分配问题而不是Map数。
如果你想强制你的Map号码,你必须考虑到一些值是先用其他值。例如 mapreduce.input.fileinputformat.split.maxsize 如果很小,即使设置 mapred.tasktracker.map.tasks.maximum 很小的价值。
这个 dfs.block.size 仅当生成的Map编号大于 mapreduce.input.fileinputformat.split.maxsize

相关问题