2

次のような定義のハイブテーブル(圧縮あり)があります

create table temp1 (col1 string, col2 int)
partitioned by (col3 string, col4 string) 
row format delimited 
fields terminated by ',' 
escaped by '\\' 
lines terminated by '\n'
stored as sequencefile;

別のハイブテーブルからこのテーブルに単純な選択と挿入(実行中のリデューサーなし)を行うと、一意のパターンが表示されます。圧縮されたこのテーブルのデータは、非常に小さなサイズの多数のファイルに分割されます(テーブル1:時々1GBデータは 200 ~ 300 個のファイルに分割されるため、この新しいテーブルにクエリを実行すると非常に多くのマップが形成されるため、消費されるブロック数が増加しますが、16 ブロックのみにまたがる必要があります。ファイル サイズは 245 MB を超えません (表 2 )。ブロック サイズが 64 MB であるため、余分なブロックが作成されないため、これを 64 MB (または 64 MB の倍数または単一のファイル) に制限する設定はありますか。

表1

名前 | タイプ | サイズ | ブロックサイズ

000000_0 | ファイル | 30.22MB | 64MB

000001_0 | ファイル | 26.19MB | 64MB

000002_0 | ファイル | 25.19MB | 64MB

000003_0 | ファイル | 24.74MB | 64MB

000004_0 | ファイル | 24.54MB | 64MB

..........

000031_0 | ファイル | 0.9MB | 64MB

表 2

名前 | タイプ | サイズ | ブロックサイズ

000000_0 | ファイル | 245.02MB | 64MB

000001_0 | ファイル | 245.01MB | 64MB

000002_0 | ファイル | 244.53MB | 64MB

000003_0 | ファイル | 244.4MB | 64MB

000004_0 | ファイル | 198.21MB | 64MB

4

2 に答える 2

4

クエリの出力形式を制御するハイブ変数を強調した Bryan のおかげで、この問題は解決しました。セッションで次のハイブ変数の設定をテストしました: set hive.merge.mapredfiles=true set hive.merge.size.per.task=256000000 set hive.merge.smallfiles.avgsize=256000000

したがって、パーティション内で、サイズが〜256mbの圧縮ファイルを取得しています。これらの変数を永続的に設定するには、そのユーザーのホーム ディレクトリに同じステートメントを含む .hiverc ファイルを作成します。

お役に立てれば

于 2012-12-05T11:17:52.043 に答える
2

これを引き起こす create table クエリの重要な部分はpartitioned by. これにより、使用される列の組み合わせごとに、データがファイルとディレクトリに分割されます。これにより、それらのセットに対してすばやくクエリを実行できますが、テーブル全体をクエリすると大量のマッパーが作成される可能性があります。

の使用を再考するかpartitioned by、その結果に対処することをお勧めします。

このように大量のブロックを使用することは、あなたをひどく傷つけますか? ブロックサイズをはるかに下回る数百万のファイル/ディレクトリを作成していない限り、NameNode がそれらを処理する際に多くの問題が発生することはありません。

ファイル サイズについては、こちらをご覧ください: https://cwiki.apache.org/confluence/display/Hive/AdminManual+Configuration

hive.merge.mapfiles、、、hive.merge.mapredfilesに特に注意してくださいhive.merge.smallfiles.avgsizehive.merge.size.per.task

于 2012-11-08T21:24:23.697 に答える