0

テーブル自体の結合を使用して以下のテーブルをクエリすると、次の例外が発生します。

java.lang.IllegalArgumentException: Uncompressed length 222258 must be less than 131072
at org.iq80.snappy.SnappyInternalUtils.checkArgument(SnappyInternalUtils.java:116)
        at org.iq80.snappy.SnappyDecompressor.uncompress(SnappyDecompressor.java:72)
        at org.iq80.snappy.Snappy.uncompress(Snappy.java:43)
        at org.apache.hadoop.hive.ql.io.orc.SnappyCodec.decompress(SnappyCodec.java:71)
        at org.apache.hadoop.hive.ql.io.orc.InStream$CompressedStream.readHeader(InStream.java:214)
        at org.apache.hadoop.hive.ql.io.orc.InStream$CompressedStream.available(InStream.java:251)

問題のあるクエリは次のとおりです。

select a.*
from events a
inner join
(
  SELECT asset_id, time, max(hive_insert_ts)
  FROM events
  GROUP BY asset_id, time
) b on a.time = b.time
and a.asset_id = b.asset_id
limit 10;

テーブルは ORC として保存され、SNAPPY を使用して圧縮されます。

create table events(
    asset_id varchar(15),
    time timestamp,
    hive_insert_ts timestamp)
PARTITIONED BY (
    country varchar(4),
    site varchar(4),
    year int,
    month int)
STORED as ORC
TBLPROPERTIES (
'orc.compress'='SNAPPY',
'orc.create.index'='true',
'orc.bloom.filter.columns'='asset_id, time',
'orc.bloom.filter.fpp'='0.05',
'orc.stripe.size'='268435456',
'orc.row.index.stride'='10000');

いろいろ調べましたがヒントが見つかりませんでした。問題がどこにある可能性があるか考えていますか?

どうもありがとう!

4

1 に答える 1

2

解決策を見つけました(誰かが同じ問題に遭遇した場合に備えて)。設定ミスが原因でした:

「orc.compress.size」テーブル プロパティは、デフォルトで次のように設定されています。

'orc.compress.size'='262144' これは 256k バイトです

ただし、core-site.xml の「io.file.buffer.size」は「131072」に設定されており、これは 128k バイトです。

ストリームリーダーは、解凍後にファイルバッファに収まらない 131072 バイトを読み込もうとしています。

解決策は、ファイル バッファ サイズを増やすか、ORC テーブルの圧縮サイズを減らすことです。

これがいつか他の誰かにも役立つことを願っています。

于 2017-01-26T12:15:07.303 に答える