web-dev-qa-db-ja.com

Hiveクエリ実行エラー、MapredLocalTask​​からのリターンコード3

2つのテーブル間で単純な結合を実行しているときに、このエラーが発生します。このクエリはHiveコマンドラインで実行します。テーブルにa&bという名前を付けています。テーブルaはHive内部テーブルであり、bは外部テーブル(Cassandra内)です。テーブルaには1610行しかなく、テーブルbには約800万行あります。実際の本番シナリオでは、テーブルaは最大100K行になる可能性があります。以下に示すのは、結合の最後のテーブルとしてテーブルbを使用した結合です。

SELECT a.col1、a.col2、b.col3、b.col4 FROM a JOIN b ON(a.col1 = b.col1 AND a.col2 = b.col2);

以下に示すのはエラーです

MapReduceジョブの合計= 1
実行ログ:/tmp/pricadmn/.log
2014-04-0907:15:36マップ結合を処理するためのローカルタスクの起動を開始しています。最大メモリ= 932184064
2014-04-09 07:16:41行の処理:200000ハッシュテーブルサイズ:199999メモリ使用量:197529208パーセンテージ:0.212
2014-04-09 07:17:12行の処理:300000ハッシュテーブルサイズ:299999メモリ使用量:163894528パーセント:0.176
2014-04-09 07:17:43行の処理:400000ハッシュテーブルサイズ:399999メモリ使用量:347109936パーセンテージ:0.372
.。
.。
.。

2014-04-09 07:24:29行の処理:1600000ハッシュテーブルサイズ:1599999メモリ使用量:714454400パーセント:0.766
2014-04-09 07:25:03行の処理:1700000ハッシュテーブルサイズ:1699999メモリ使用量:901427928パーセンテージ:0.967
実行が終了ステータスで失敗しました:3
エラー情報の取得


タスクが失敗しました!
タスクID:
ステージ-5

ログ:

/u/applic/pricadmn/dse-4.0.1/logs/Hive/hive.log
失敗:実行エラー、org.Apache.hadoop.Hive.ql.exec.mr.MapredLocalTask​​からコード3を返します

DSE4.0.1を使用しています。以下はあなたが興味を持っているかもしれない私の設定のいくつかです
mapred.map.child.Java.opts = -Xmx512M
mapred.reduce.child.Java.opts = -Xmx512M
mapred.reduce.parallel.copies = 20
Hive.auto.convert.join = true

Mapred.map.child.Java.optsを1Gに増やしましたが、さらにいくつかのレコードを超えてエラーが発生しました。それは良い解決策のようには見えません。また、結合の順序を変更しましたが、ヘルプはありません。このリンクを見ました ハイブマップ結合:メモリ不足例外 しかし、問題は解決しませんでした。

私にとって、Hiveは、私が混乱しているローカルタスクフェーズ中に、より大きなテーブルをメモリに配置しようとしているように見えます。私の理解によると、2番目のテーブル(私の場合はテーブルb)をストリーミングする必要があります。間違っている場合は修正してください。この問題を解決するための助けは大歓迎です。

11
user3517633
set Hive.auto.convert.join = false;
28
Sahil Nagpal

タスクのメモリが不足しているようです。チェック MapredLocalTask​​クラスの324行目

 } catch (Throwable e) {
  if (e instanceof OutOfMemoryError
      || (e instanceof HiveException && e.getMessage().equals("RunOutOfMeomoryUsage"))) {
    // Don't create a new object if we are already out of memory
    return 3;
  } else {
1
Andrew Weaver