1

私のすべての Hadoop ジョブと同様に、Hadoop インターフェイスで表示されるものから実行すると、合計 2 つのマップ タスクがあるように見えます。ただし、これは大量のデータをロードしているため、Java Heap Space エラーが発生することを意味します。

ジョブをより多くのタスクに分割するために、Hadoop クラスターでさまざまな conf プロパティを設定しようとしましたが、何も効果がないようです。

mapreduce.input.fileinputformat.split.maxsize、を設定してみましたがmapred.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)
4

2 に答える 2

1

io.sort.mbまたはのようなメモリ管理の設定を確認する必要がありますmapred.cluster.map.memory.mb。ヒープ領域エラーは通常、割り当ての問題が原因であり、マップ番号が原因ではないためです。

マップ番号を強制したい場合は、いくつかの値が他の値よりも先に使用されることを考慮する必要があります。たとえば 、小さい値mapreduce.input.fileinputformat.split.maxsizeに設定しても、小さい場合は膨大な量のタスクが生成さmapred.tasktracker.map.tasks.maximumれます。

dfs.block.size、生成されたマップ番号よりも大きい場合にのみ影響を与えます。mapreduce.input.fileinputformat.split.maxsize

于 2013-07-23T15:12:37.817 に答える
0

私の仕事は、1,000 行が約 1MB に相当するテーブルからデータを読み取ることでした。この特定のジョブは、753,216 個の URL を読み取ろうとしていました。各タスク プロセスの Java ヒープ スペースは 200MB に制限されています。Brugere が私の質問に対するコメントで指摘したように、ヒープ領域を制御するmapred.child.java.optsプロパティを設定できます ( http://developer.yahoo.com/hadoop/tutorial/module7.html )。mapred-site.xml

構成ファイルでこのプロパティを設定する必要があることもわかりました<final>true</final>。それ以外の場合、値は 200MB にリセットされました (コードのどこかでリセットされている可能性はありますか? おそらく cascading.jdbc でしょうか?)。

ジョブをセットアップするときに、より多くのヒープ スペースが必要になることがわかったときに、コードでこのヒープ スペース プロパティを設定することを検討し、一般的な Hadoop 構成セットアップでデフォルトの 200MB を使用するようにします。

于 2013-07-24T10:21:10.327 に答える