2017-05-18 2 views
0

別のハイブテーブルからパーティション化されたハイブテーブルに挿入したい。データは、ターゲット表の単一パーティションに入れられます。問題はすべてのレデューサーが非常に速く完了することですが、レデューサーの1人はすべての作業がその単一のレデューサーに行くので長い時間がかかります。ハイブに均等に行を分散させる方法パフォーマンスを向上させるために、レデューサー間で別のテーブルのパーティションテーブルに上書きする方法

私はすべてのレデューサーの間で均等に配分された作品を設定する方法を見つけたいと思います。そうする方法はありますか?インサートの上書きのパフォーマンスをどのように改善できますか?

ソース表DDL:

CREATE EXTERNAL TABLE employee (id INT,first_name String,latst_name String,email String,gender String) STORED AS TEXTFILE '/emp/data' 

ターゲット表のDDL:

CREATE EXTERNAL TABLE employee_stage (id INT,first_name String,latst_name String,email String,gender String) PARTITIONED BY (batch_id bigint) STORED AS ORC LOCATION '/stage/emp/data' 

ここでは、ソーステーブルのレコード以上100Mを含むデータのスナップショット

1 Helen Perrie [email protected] Female 
2 Rafaelita Jancso rjancso[email protected] Female 
3 Letti Kelley [email protected] Female 
4 Adela Dmisek [email protected] Female 
5 Lay Reyner [email protected] Male 
6 Robby Felder [email protected] Male 
7 Thayne Brunton [email protected] Male 
8 Lorrie Roony [email protected] Male 
9 Hodge Straun [email protected] Male 
10 Gawain Tomblett [email protected] Male 
11 Carey Facher [email protected] Male 
12 Pamelina Elijahu [email protected] Female 
13 Carmelle Dabs [email protected] Female 
14 Moore Baldrick [email protected] Male 
15 Sheff Morin [email protected] Male 
16 Zed Eary [email protected] Male 
17 Angus Pollastrone [email protected] Male 
18 Moises Hubach [email protected] Male 
19 Lilllie Beetham [email protected] Female 
20 Mortimer De Hooge [email protected] Male 

です。

ここでは私が使用しているhqlがあります。

insert overwrite table employee_stage 
PARTITION (batch_id) 
SELECT 
    id, 
    first_name, 
    latst_name, 
    email, 
    gender, 
    123456789 as batch_id 
FROM employee; 

データは1つのパーティションに格納されます。

パフォーマンスを改善するにはどうすればよいですか? すべてのレデューサーに均等に行を配布する方法はありますか?

+0

追加情報を教えてください。あなたのテーブルはどのように分割されていますか?あなたのデータセットは何ですか? – Constantine

+0

**(1)**オリジナルの投稿に追加情報を追加し、コメントを削除してください**(2)**両方のテーブルと目的地テーブルに入力するコードにDDLを指定してください –

+0

@DuduMarkovitz I DDLとhqlを追加しました。見つけてください。 –

答えて

1

insert overwriteクエリでJOINSや他の重い変換を行っていないと思われ、挿入中に実際にスキューが発生しています。もしあなたがそうしたら、質問は挿入についてではないはずです。

distribute by batch_idを挿入クエリに追加して再実行してください。それでもスキューを実行している場合は、データをチェックしてください。いくつかの特定のデータのためにあまりにも多くのデータがありますか、多分あなたはヌルをたくさん持っています。スキューされたデータを扱う方法にはさまざまなアプローチがあります。そのうちの1つは、歪んだキーをフィルタリングして別々にロードすることです。ジョブトラッカーで長時間実行されているレデューサーログをチェックすると、どこに問題があるかについてより多くの情報が得られます。

+0

ソーステーブル内のすべてのデータが単一のbatch_idになります。すべての行が1つの減速機に向かうようにします。ハイブにすべての減量兵の間に均等に行を配るように強制することはできますか? –

+0

いくつかのより均等に分散された鍵を 'によって'配布しようとします。理想的には、多くの減速機を起動し、各減速機はそれ自身のファイルを作成します。また、このプロパティをチェックしてください: 'set hive.exec.reducers.bytes.per.reducer = 67108864;'減速機あたりのデータが多すぎないようにする – leftjoin

+0

デフォルト値は1Gです。67108864に設定すると、並列化を増やすより多くの減速機が作成されます。そして、あなたが 'order by'など何もしていないことを確認して、すべてのデータを単一のレデューサーで実行させる – leftjoin

関連する問題