2017-07-27 12 views
2

私が使用しているワークスペースは、Hive 1.1.0およびCDH 5.5.4で設定されています。私は22パーティションの結果をもたらすクエリを作成します。このパーティションのディレクトリに保存されるファイルは、常に一意であり、20MBから700MBの範囲で変更できます。Hiveを使用してHDFSでファイルサイズを調べる方法

私が理解したところ、これはクエリのプロセスで使用される減速材の数に関連しています。

set mapreduce.job.reduces=5; 

このシステムは、使用5は、ステージ1での作業を減らすようになりますが、自動的に1つの減速機に切り替わります:Let'sは、私が代わりに1のパーティションごとに5つのファイルを持つようにしたいと仮定し、私は、このコマンドを使用しますステージ2(コンパイル時に自動的に決定)。私が読んだところでは、これは、コンパイラーがリデューサーの数を選択するときの構成よりも重要性が高いためです。いくつかのタスクはパラレル化できないようで、1つのプロセスまたは減速タスクでしか実行できないように見えるので、システムは自動的にそれを決定します。

コード:

insert into table core.pae_ind1 partition (project,ut,year,month) 
select ts,date_time, if(
-- m1 
code_ac_dcu_m1_d1=0 
and (min(case when code_ac_dcu_m1_d1=1 then ts end) over (partition by ut 
order by ts rows between 1 following and 1000 following)-ts) <= 15, 
min(case when code_ac_dcu_m1_d1=1 then ts end) over (partition by ut order 
by ts rows between 1 following and 1000 following)-ts,NULL) as 
t_open_dcu_m1_d1, 

if(code_ac_dcu_m1_d1=2 
and (min(case when code_ac_dcu_m1_d1=3 then ts end) over (partition by ut 
order by ts rows between 1 following and 1000 following)-ts) <= 15, 
min(case when code_ac_dcu_m1_d1=3 then ts end) over (partition by ut order 
by ts rows between 1 following and 1000 following)-ts, NULL) as 
t_close_dcu_m1_d1, 
project,ut,year,month 

from core.pae_open_close 
where ut='902' 
order by ut,ts 

これは最後に巨大なファイルを持つことにつながります。私は、この結果ファイルを小さなものに分割する方法があるかどうかを知りたいと思っています。

+0

のようになります。 'order by ut、ts'? –

答えて

1

@DuduMarkovitzが指摘したように、コードにはデータセットをグローバルに注文する指示が含まれています。これは単一の減速機で実行されます。あなたはあなたのテーブルからの選択中により良い順序。そのような挿入の後でファイルが順序付けされていても分割可能な場合でも、それらは多くのマッパーで読み込まれます。その結果は並列処理により順序にならず、注文する必要があります。ただ、挿入中にこのorder by ut,tsを取り除くと減速の数を制御するためにこれらの構成設定を使用:減速の

set hive.exec.reducers.bytes.per.reducer=67108864; 
set hive.exec.reducers.max = 2000; --default 1009 

数は

mapred.reduce.tasksに従って決定 - ジョブごとの作業を減らすのデフォルト数を。通常、使用可能なホストの数に近いプライムに設定されます。 mapred.job.trackerが "local"のときは無視されます。 Hadoopはこれをデフォルトで1に設定し、Hiveはデフォルト値として-1を使用します。このプロパティを-1に設定すると、Hiveは自動的に減速機の数を決定します。

- Hive 0.14.0以前のデフォルトは1 GBです。

hive.exec.reducers.max - 使用するレデューサーの最大数。 mapred.reduce.tasksが負の場合、Hiveは自動的に減速器の数を決定する際にこれを最大減速器の数として使用します。

あなたは、レデューサーの並列性を高めるhive.exec.reducers.maxを高め、 に各減速を減らしたいのであれば、各パーティション(hive.exec.reducers.bytes.per.reducerよりも大きくない)のための1つのファイルを作成します。あるレデューサーが多くのパーティションデータを受け取る可能性があり、結果として各パーティションに多数の小さなファイルが作成される可能性があります。これは、シャッフルフェーズのパーティションでは、データが多くのレデューサー間で分散されるためです。

各レデューサーがすべて(またはあまりにも多くの)パーティションを作成したくない場合は、distribute by partition key(オーダーではなく)です。この場合、パーティション内のファイル数はpartition_size/hive.exec.reducers.bytes.per.reducer

+0

'distribute by'に関する最新情報を見る – leftjoin

関連する問題